算法面试高频知识点:深度学习基础总结
----【深度学习基础】----
【一】卷积有什么特点?
卷积主要有三大特点:
局部连接。比起全连接,局部连接会大大减少网络的参数。在二维图像中,局部像素的关联性很强,设计局部连接保证了卷积网络对图像局部特征的强响应能力。
权值共享。参数共享也能减少整体参数量,增强了网络训练的效率。一个卷积核的参数权重被整张图片共享,不会因为图像内位置的不同而改变卷积核内的参数权重。
下采样。下采样能逐渐降低图像分辨率,实现了数据的降维,并使浅层的局部特征组合成为深层的特征。下采样还能使计算资源耗费变少,加速模型训练,也能有效控制过拟合。
【二】不同层次的卷积都提取什么类型的特征?
浅层卷积
提取边缘特征
中层卷积
提取局部特征
深层卷积
提取全局特征
【三】卷积核大小如何选取?
最常用的是大小的卷积核,两个
卷积核和一个
卷积核的感受野相同,但是减少了参数量和计算量,加快了模型训练。与此同时由于卷积核的增加,模型的非线性表达能力大大增强。
不过大卷积核()也有使用的空间,在GAN,图像超分辨率,图像融合等领域依然有较多的应用,大家可按需切入感兴趣的领域查看相关论文。
【四】卷积感受野的相关概念
目标检测和目标跟踪很多模型都会用到RPN层,anchor是RPN层的基础,而感受野(receptive field,RF)是anchor的基础。
感受野的作用:
一般来说感受野越大越好,比如分类任务中最后卷积层的感受野要大于输入图像。
感受野足够大时,被忽略的信息就较少。
目标检测任务中设置anchor要对齐感受野,anchor太大或者偏离感受野会对性能产生一定的影响。
感受野计算:
增大感受野的方法:
使用空洞卷积
使用池化层
增大卷积核
【五】网络每一层是否只能用一种尺寸的卷积核?
常规的神经网络一般每层仅用一个尺寸的卷积核,但同一层的特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一尺寸卷积核的要好,如GoogLeNet 、Inception系列的网络,均是每层使用了多个不同的卷积核结构。如下图所示,输入的特征图在同一层分别经过三种不同尺寸的卷积核,再将各自的特征图进行整合,得到的新特征可以看作不同感受野提取的特征组合,相比于单一尺寸卷积核会有更强的表达能力。
【六】
卷积的作用?
卷积的作用主要有以下几点:
实现特征信息的交互与整合。
对特征图通道数进行升维和降维,降维时可以减少参数量。
卷积+ 激活函数
增加非线性,提升网络表达能力。
卷积首发于NIN(Network in Network),后续也在GoogLeNet和ResNet等网络中使用。感兴趣的朋友可追踪这些论文研读细节。
【七】转置卷积的作用?
转置卷积通过训练过程学习到最优的上采样方式,来代替传统的插值上采样方法,以提升图像分割,图像融合,GAN等特定任务的性能。
转置卷积并不是卷积的反向操作,从信息论的角度看,卷积运算是不可逆的。转置卷积可以将输出的特征图尺寸恢复卷积前的特征图尺寸,但不恢复原始数值。
转置卷积的计算公式:
我们设卷积核尺寸为,输入特征图为
。
(1)当时:
输入特征图在进行转置卷积操作时相当于进行了的填充,接着再进行正常卷积转置之后的标准卷积运算。
输出特征图的尺寸 =
(2)当时:
输入特征图在进行转置卷积操作时相当于进行了的填充,相邻元素间的空洞大小为
,接着再进行正常卷积转置之后的标准卷积运算。
输出特征图的尺寸 =
【八】空洞卷积的作用?
空洞卷积的作用是在不进行池化操作损失信息的情况下,增大感受野,让每个卷积输出都包含较大范围的信息。
空洞卷积有一个参数可以设置dilation rate,其在卷积核中填充dilation rate个0,因此,当设置不同dilation rate时,感受野就会不一样,也获取了多尺度信息。
(a) 图对应3x3的1-dilated conv,和普通的卷积操作一样。(b)图对应的2-dilated conv,实际的卷积kernel size还是
,但是空洞为
,也就是对于一个
的图像patch,只有
个红色的点和
的kernel发生卷积操作,其余的点的权重为
。(c)图是4-dilated conv操作。
【九】全连接层的作用?
全连接层将卷积学习到的高维特征映射到label空间,可以作为整个网络的分类器模块。
虽然全连接层参数存在冗余的情况,但是在模型进行迁移学习时,其能保持较大的模型capacity。
目前很多模型使用全局平均池化(GAP)取代全连接层以减小模型参数,并且依然能达到SOTA的性能。
【十】CNN中池化的作用?
池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受野内最大、平均与总和的特征值作为输出,最常用的是最大池化和平均池化。
【十一】有哪些方法能提升CNN模型的泛化能力?
采集更多数据:数据决定算法的上限。
优化数据分布:数据类别均衡。
选用合适的目标函数。
设计合适的网络结构。
数据增强。
权值正则化。
使用合适的优化器等。
【十二】BN层面试高频问题大汇总
BN层解决了什么问题?
统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。对于神经网络的各层输出,由于它们经过了层内卷积操作,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,但是它们所能代表的label仍然是不变的,这便符合了covariate shift的定义。
因为神经网络在做非线性变换前的激活输入值随着网络深度加深,其分布逐渐发生偏移或者变动(即上述的covariate shift)。之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(比如sigmoid),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。而BN就是通过一定的正则化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,避免因为激活函数导致的梯度弥散问题。所以与其说BN的作用是缓解covariate shift,也可以说BN可缓解梯度弥散问题。
BN的公式
其中scale和shift是两个可学的参数,因为减去均值除方差未必是最好的分布。比如数据本身就很不对称,或者激活函数未必是对方差为1的数据有最好的效果。所以要加入缩放及平移变量来完善数据分布以达到比较好的效果。
BN层训练和测试的不同
在训练阶段,BN层是对每个batch的训练数据进行标准化,即用每一批数据的均值和方差。(每一批数据的方差和标准差不同)
而在测试阶段,我们一般只输入一个测试样本,并没有batch的概念。因此这个时候用的均值和方差是整个数据集训练后的均值和方差,可以通过滑动平均法求得:
上面式子简单理解就是:对于均值来说直接计算所有batch 值的平均值;然后对于标准偏差采用每个batch
的无偏估计。
在测试时,BN使用的公式是:
BN训练时为什么不用整个训练集的均值和方差?
因为用整个训练集的均值和方差容易过拟合,对于BN,其实就是对每一batch数据标准化到一个相同的分布,而不同batch数据的均值和方差会有一定的差别,而不是固定的值,这个差别能够增加模型的鲁棒性,也会在一定程度上减少过拟合。
BN层用在哪里?
在CNN中,BN层应该用在非线性激活函数前面。由于神经网络隐藏层的输入是上一层非线性激活函数的输出,在训练初期其分布还在剧烈改变,此时约束其一阶矩和二阶矩无法很好地缓解 Covariate Shift;而BN的分布更接近正态分布,限制其一阶矩和二阶矩能使输入到激活函数的值分布更加稳定。
BN层的参数量
我们知道和
是需要学习的参数,而BN的本质就是利用优化学习改变方差和均值的大小。在CNN中,因为网络的特征是对应到一整张特征图上的,所以做BN的时候也是以特征图为单位而不是按照各个维度。比如在某一层,特征图的数量为
,那么做BN的参数量为
。
BN的优缺点
优点:
可以选择较大的初始学习率。因为这个算法收敛很快。
可以不用dropout,L2正则化。
不需要使用局部响应归一化。
可以把数据集彻底打乱。
模型更加健壮。
缺点:
Batch Normalization非常依赖Batch的大小,当Batch值很小时,计算的均值和方差不稳定。
所以BN不适用于以下几个场景:小Batch,RNN等。