梯度消失与梯度爆炸问题

训练神经网络时,神经网络各层的参数逐层累乘,因此在训练一个深度网络的时候,每层的参数累乘结果大于1,累乘n次之后则会出现梯度爆炸,反之小于1则出现梯度消失问题。

神经网络的初始化

为了缓解梯度消失和梯度爆炸问题,我们想到的一个办法是在参数初始化的时候,使用ReLU激活函数,同时给出参数的方差对参数进行归一化,方差通常为:
$$
\operatorname{np} . \operatorname{sqrt}\left(\frac{2}{n^{[l-1]}}\right)
$$
这种方法不能解决梯度消失或爆炸的问题,但是通过这种方式初始化得到的参数,数值比较小,比较接近1,因此在一定程度上缓解了梯度消失或爆炸的问题,可以加快网络的收敛。

各种优化器总结

https://perper.site/2020/05/04/%E4%BC%98%E5%8C%96%E5%99%A8%E6%80%BB%E7%BB%93/

batch normalization

BN技术使得网络对超参数的选择不那么敏感,超参数的取值不会很大程度影响网络的性能。

covariate shift问题,即浅层网络参数的变化,会一直影响到深层网络的参数变化,使得每一层的参数分布发生变化,这种变化传递到深层网络的时候将会出现比较大的偏差,使得网络每次迭代的时候都需要去学习这种分布,因此希望通过BN将每层的分布归一化之后,加速网络的训练,泛化能力。

BN技术指的是使得BN那一层的参数,归一化到指定的mean和variance上。通常现将参数归一化后,然后输入激活函数中。原因是参数经过类似sigmoid这种激活函数,函数值之间的差异变得很小,归一化的作用不如直接进行归一化来得明显,同时可以保证进入sigmoid的时候,参数克服偏移,处在一个比较合适的位置上。

如下图计算出每一层输出z的平均值和方差,归一化参数,在实际运用中,BN通常与mini batch一起使用,利用一个batch的样本计算均值以及标准差。因此为了使得计算出的均值和方差足够代表整个数据集,我们的batch的大小需要尽量的大。

image-20200506202238045

优点

  • BN解决了网络训练过程中,每层参数分布变化的情况,参数发生整体偏移将导致网络训练缓慢,落入饱和区,不利于网络的训练,BN后,参数取值比较小且集中,可以使用更大的学习率
  • BN能够有效防止梯度消失,BN能够使得参数保持在一个合适的区间(尤其sigmoid,tanh)
  • 对参数的初始化具有更强的鲁棒性
  • 防止过拟合,由于每次用batch的均值和方差代替整个数据集的均值方差,因此无形给网络训练加入了噪音,能够提升网络的泛化能力,防止过拟合。

由于我们对参数进行BatchNorm操作,将参数分布整体平移到N(0,1)之间,削弱了网络激活函数的非线性部分的作用,因此在进行BN之后,同时学习两个变量,对参数整体进行一个scale 和 shit。

https://perper.site/2019/07/24/normalization/

softmax

softmax对应的是hardmax,hardmax表示会将向量表示成one-hot形式,而softmax则比较柔和一点,输出是在0-1之间的概率值,softmax的公式为:
$$
S_{i}=\frac{e^{i}}{\sum_{j} e^{j}}
$$
通常会将softmax作为交叉熵的输入,公式如下:
$$
\text {Loss}=-\sum_{i} t_{i} \ln y_{i}
$$
其中t为真值,即为1,y即为softmax,对softmax求导的时候,是否需要对分子求导,需要分情况讨论,详情请见:

https://perper.site/2019/02/20/cross-entropy-%E4%BA%A4%E5%8F%89%E7%86%B5%E4%BB%A5%E5%8F%8Asoftmax/

为什么使用卷积网络

卷积核参数相比全连接层参数指数级下降,卷积核仅有很少的参数,便于训练,卷积核参数少但是能够提取数据的特征,原因如下:

  • 卷积权重共享, 即特征的移动不变性,一张图片不同位置的类似特征,可以通过同一个卷积核来提取不影响网络对特征的学习。
  • 稀疏连接,图像的局部特征仅仅依赖于周围的像素特征,因此卷积核不需要太大就可以学到数据所表示的特征。

残差网络

有些网络非常深,非常大,训练的时候存在梯度消失和梯度爆炸的问题。因此提出跳跃结构,最早在resNet这篇文章中提出。即将一层的特征,直接输出到其后的某一层作为输入,因此网络仅仅需要学习一个残差。引入残差也将不同尺度的特征进行了融合。

1x1卷积的作用

  • 1x1卷积最直接的作用是,遍历图像的每一个像素,做一些乘积,累加的操作
  • 用于压缩向量的通道数,减小网络的计算
  • 给网络添加一个非线性变换

inception结构

构建网络的时候,我们需要决定使用多大的卷积核,通常可以选择的有3x3,5x5,7x7等等,inception结构就是代替你来决定,选择出一种最佳的卷积核大小的方案。

image-20200517165426861

第二层的特征,由许多不同大小的卷积核共同生成。inception的一个问题是网络的计算量相比使用单一的卷积核来的大。

使用迁移学习

我们在训练一个网络模型的时候,通常需要重头开始训练整个模型。我们可以使用迁移学习的方法,将一些大型的公共数据集的知识迁移到自己的网络上。具体的做法是将网络的分类softmax层修改了,freeze住其他的层,或者使用别人训练好的backbone,对网络进行微调。

数据增强

数据增强的方式其实是对数据的一种扩充,对于绝大多数任务来说,数据量越大,网络的效果越好,例如一些镜像,拉伸,随机crop,颜色通道的变换,对比度,透明度的变换,都是数据增强中比较常用的方式。

增强网络性能

  • 模型集成,同时使用多个独立的模型,得出检测的结果,最后对结果取平均
  • 利用别人已经开源的网络结构,而不是自己重新搭建一个
  • 使用别人的预训练模型
  • 设计合适的手工工程,特征工程(例如人工设计的某个公式,指标等等)

yolo v1的设计

yolo v1将图片划分为nxn个网格大小,每一个网格对应长度为m的一个标注[是否有图,x,y,h,w,class1,class2….],对class的选择取决于对象的中点落在哪个网格区域内。

因此网络的输入是一张图片,经过各种卷积操作,输出是nxnxm的向量。

此外,yolo确定x,y,h,w的方式是和外包围的网格进行比较的,外包围网格第左上角是(0,0),右下角是(1,1)。因此x,y,h,w都是相对值。

交并比IoU

当候选框与GT框的相交面积比上他们面积的交集的比值,在大多数的情况下,这个值大于0.5则这个框为正类,否则这个框为负类。

非极大值抑制

非极大值抑制的作用是确保每个对象只检测一次,具体的做法是,同一个目标可能会被多个候选框选中,我们需要在这些候选框中找出最合适作为下一步检测的框。在所有的候选框中找出置信度最高的,然后将其他边框都忽略,这就是非极大值抑制。

anchor box

有些时候,同一个网格中可能有多个目标,这时候一个网格位置需要检测多个目标,我们的做法是使用anchor box,即为每一个网格生成k个候选目标框,k个候选框的大小,长宽比均不同,这些框可以应付不同的目标出现在同一个网格内,然后网络最终的输出是将k个候选框关联起来,共同输出。

通常anchor box的数量会选择8个,长宽比为2:1等。