Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

面试记录 #4

Open
wangyin717 opened this issue Oct 13, 2023 · 0 comments
Open

面试记录 #4

wangyin717 opened this issue Oct 13, 2023 · 0 comments
Labels
documentation Improvements or additions to documentation

Comments

@wangyin717
Copy link
Owner

wangyin717 commented Oct 13, 2023

1. 智颜星球

(1) Softmax函数公式

import numpy as np
    
def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    # e_x = np.exp(x)
    e_x = np.exp(x )
    return e_x / e_x.sum()

if __name__ == '__main__':

    x = np.array([-3, 2, -1, 0])
    res = softmax(x )
    print(res)			# [0.0056533  0.83902451 0.04177257 0.11354962]

(2) C++中的多态

  • C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
  • 虚函数主要是为了实现子类函数重写父类函数的作用。
  • 要实现多态,通常父类中的虚函数与子类中的函数的返回值类型、函数名和参数列表必须都相同的。

(3) 美学评价论文中loss和评价指标(srcc) 怎么计算的

image

  • 预测概率的累加值减去真实值概率的累加值,累加是从batch维度累加,把这个值求平均。或者把这个值取平方,然后求均值,再开方。
  • SRCC计算公式:
    image
  • r表示秩序,也就是按照x或者排序,如果按照x排序,就要把y对应的值重新调整顺序,然后计算y的秩序:
    image
  • 然后就可以按照公式计算x秩序的平均值和y秩序的平均值,最后带入公式计算srcc
x = [106, 97, 100, 101, 99, 103, 97, 113, 112, 110]
y = [7,    0,  27,  50, 28,  29, 20,  12,   6,  17]

x1 = np.array([1.5, 1.5, 3, 4, 5, 6, 7, 8, 9, 10],dtype='float64')
y1 = np.array([1, 6, 8, 7, 10, 9, 3, 5, 2, 4],dtype='float64')

# 表示x1和x2的平均值
x_mean = sum(x1)/len(x1)
y_mean = sum(y1)/len(y1)

son = sum((x1-x_mean)*(y1-y_mean))
mother = (sum((x1-x_mean)**2))**(0.5) * (sum((y1-y_mean)**2))**(0.5)
hand_srcc = son / mother
print("hand_srcc2=", hand_srcc)

2. 镁佳科技

(1) CNN的特点

  • CNN主要包括卷积和池化,卷积的特点:局部感知、参数共享、多核。
  • 局部感知:每个神经元只与上一层的部分神经元相连,没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。作用:降低网络参数,增加网络训练速度。
  • 共享参数: 给定一个输入图像,用一个filter去扫这张图片,filter里面的数就是权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。
  • 池化下采样:对一块数据进行抽样或聚合,通过池化能够很好的聚合特征、降维来减少运算量。

(2) Transformer 和 Conformer

  • Conformer是在Tranformer的基础上,引入CNN,来增强语音识别的效果。
  • Transformer的大概结构:分为Encoder-Decoder架构:
  • 在Encoder部分包含6个block,每个block由self-attention和FFN两层网络组成。
    FFN由全连接层、激活函数和Layer Normalization组成,LN会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
  • Decoder部分和Encoder类似,包含两个Multi-Head Attention 层,第一个 Multi-Head Attention 层采用了 Masked 操作,最后有一个 Softmax 层。
  • Conformer的大概结构:Conformer只改变了Transformer的Encoder部分。
  • Conformer block是由FFN,self attention, 卷积三个Module组成的,其中每个Module上都用了残差。

(3) 聚类算法KNN、DBSCAN、k-means

KNN

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。(这就类似于现实生活中少数服从多数的思想)。
image

距离的度量:欧氏距离
image

DBSCAN
  • 核心对象:r领域内点的数量不小于minPts。比如随机从数据集中找一个点,以这个点为圆心画一个半径为r的圆,这个圆内点的数量大于等于minPts。
  • 直接密度可达:如果一个点在这个圆圈内,而且这个点也是核心点,就说这个点到圆心点是直接密度可达。
  • 密度可达:就是直接密度可达的“传播”。
  • 算法流程
(1)扫描整个数据集,找到任意一个核心点,对该核心点进行扩充。扩充的方法是寻找从该核心点出发的所有密度相连的数据点(注意是密度相连)。遍历该核心点的 邻域内的所有核心点(因为边界点是无法扩充的),寻找与这些数据点密度相连的点,直到没有可以扩充的数据点为止。最后聚类成的簇的边界节点都是非核心数据点。
(2)重新扫描数据集(不包括之前寻找到的簇中的任何数据点),寻找没有被聚类的核心点,再重复上面的步骤,对该核心点进行扩充。
(3)直到数据集中没有新的核心点为止。数据集中没有包含在任何簇中的数据点就构成异常点。

  • 算法优点:相比K-Means,DBSCAN 不需要预先声明聚类数量
  • 算法缺点:高维数据计算慢;参数选择难
k-means
  • 算法步骤:
    image

(4) 膨胀卷积是什么,如何解决膨胀后特征丢失的问题

  • 空洞卷积就是在普通卷积核中间插0
  • 使用空洞卷积一个关键原因就是可以增大感受野,这样在检测、分割任务中就能对大尺寸物体表现出较好的效果
  • 空洞卷积中引入膨胀率 dilation_rate 的概念,膨胀率代表将原来的一个元素扩展到多少倍,扩展后的卷积核尺寸 = dilation_rate*(kernel_size - 1)+1
  • 空洞卷积的缺陷主要体现在存在栅格效应
    image
  • 可以看到,连续使用三次r=2的空洞卷积会导致中间有很多空格,即很多像素没有利用到,这会导致出现栅格效应
  • 解决:使用了不同膨胀因子的空洞卷积,这样就能有效解决空洞卷积网格效应的问题
    image

(5) BN和LN的区别,什么时候用BN,什么时候用LN

  • BN:对一个batch数据的每个channel进行Norm处理,因此在小batch上的效果较差。举个例子:该批次内有十张图片,每张图片有三个通道RGB,每张图片的高宽是 H、W,那么R通道的均值就是计算这十张图片R通道的像素数值总和再除以 10HW ,其他通道类似,方差的计算也类似。
  • LN:对单个数据的指定维度进行Norm处理与batch无关。
  • 想象成一个表格的话,BN就是对所有数据的同一列进行Norm处理,LN就是对一行数据的某几列进行Norm处理。
  • LN是主要用于NLP领域的,针对一句话进行缩放的,且LN一般用在第三维度,如[batchsize, seq_len, dims]中的dims,一般为词向量的维度。这一维度各个特征的量纲应该相同,因此也不会遇到上面因为特征的量纲不同而导致的缩放问题。

(6) 训练模型时,如何让一部分参数更新,一部分参数冻结,tensor.detach()是什么

  • 当我们再训练网络的时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整;或者值训练部分分支网络,并不让其梯度对主网络的梯度造成影响,这时候我们就需要使用detach()函数来切断一些分支的反向传播。
  • 如果A网络的输出被喂给B网络作为输入, 如果我们希望在梯度反传的时候只更新B中参数的值,而不更新A中的参数值,这时候就可以使用detach()。
a = A(input)
a = a.deatch()
out = B(a)
loss = criterion(out, labels)
loss.backward()
  • 如果想通过损失函数反向传播修改A网络的参数,但是不想修改B网络的参数,这个时候应该使用Tensor.requires_grad:
for param in B.parameters():
	param.requires_grad = False
@wangyin717 wangyin717 added the documentation Improvements or additions to documentation label Oct 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant