目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,更新优化深度网络的权值。这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 f(x),因此整个深度网络可以视为是一个复合的非线性多元函数:
我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射。
下图以三个隐层的单神经元网络为例:
假设每一层网络激活后的输出为
由上图可知,上式主要由两部分构成:多个激活函数偏导数的连乘,和多个权重参数的连乘。如果激活函数求导后与权重相乘的积大于1,那么随着层数增多,求出的梯度更新信息将以指数形式增加,即发生梯度爆炸;如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生梯度消失。
【注意】具体激活函数的导数情况可自行验证,比如sigmoid,tanh,Relu,leaky-Relu等。
在讨论解决方法之前,我们探讨一下其解决思想,其实就是抑制上述式子连乘后结果远远大于1或小于1,主要取决于激活函数偏导数和权值大小。
3.1 预训练加微调
此方法来自Hinton在2006年发表的一篇论文,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training),得到暂时的最优权重值;在预训练完成后,再利用BP算法对整个网络进行训练,对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用不是很多。
3.2 梯度剪切、正则
梯度剪切主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,更新梯度时,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,防止梯度爆炸。另一种解决梯度爆炸的手段是权重正则化(weithts regularization),常见的是
3.3 合理的激活函数+权值初始化
Relu激活函数:思想是,如果激活函数的导数为1,那么就消除了激活函数偏导数的影响,只需考虑权值即可。
3.4 Batch Normalization
Batch norm已被广泛应用到各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题,它是将输出信号 x 规范化,以保证网络的稳定性。
As the data flows through a deep network, the weights and parameters adjust those values, sometimes making the data too big or too small again - a problem the authors refer to as "internal covariate shift". By normalizing the data in each mini-batch, this problem is largely avoided.”Internal Covariate Shift:此术语是google小组在论文 Batch Normalization 中提出来的,其主要描述的是:训练深度网络的时候经常发生训练困难的问题,如上图所示,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难,此现象称之为Internal Covariate Shift。
为了解决这个问题,Batch Norm就派上用场了,它应用于每层激活函数之前,就是做均值和方差归一化,对于每一批次数据并且还做放大缩小,平移,为了梯度下降的收敛速度更快,相当于把数据都拉到中间的位置了,有这个就不需要Dropout,Relu等等。BN使得每层输出信号满足均值为0,方差为1的分布,而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入,从而保证整个网络的稳定性。简而言之,BN包括两点:归一化+缩放平移,具体伪代码如下:
为了说明BN如何防止梯度消失,梯度爆炸,进而加快训练速度,举例如下:
1、带有BN的前向传播过程如下所示(其中
2、则其反向传播有:
3、相应的,连续多层的梯度反向传播过程为:
可以看出,与不使用BN相比,每层的反向传播过程的,增加了一个基于标准差的矩阵
最后直观感受一下有无BN的训练过程:
3.5 残差网络结构
3.5.1 残差块
残差网络是由一系列残差块组成的。一个残差块可以用表示为:
残差块分成两部分:直接映射部分和残差部分。
3.5.2 残差网络的背后原理
残差块一个更通用的表示方式是
这时候残差块表示为:
对于一个更深的层
【ResNet 解决问题1:网络随着深度的增加,而出现的“degradation problem”】
随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当再增加网络深度,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。
公式(5)反应了残差网络的两个属性:
【ResNet 解决问题2:梯度消失的问题】
根据BP中使用的导数的链式法则,损失函数
公式(7)反映了残差网络的两个属性:
通过分析残差网络的正向和反向两个过程,我们发现,当残差块满足上面两个假设时,信息可以非常畅通的在高层和低层之间相互传导。
【参考】
[1]
如何解决梯度消失和梯度爆炸?_黄飞的博客专栏-CSDN博客_梯度消失blog.csdn.net[2]
详解机器学习中的梯度消失、爆炸原因及其解决方法_Double_V的博客-CSDN博客_梯度爆炸的解决方法blog.csdn.net[3]
基础 | batchnorm原理及代码详解blog.csdn.net[4]
深度学习中 Batch Normalization为什么效果好?www.zhihu.com[5]
深入浅出--搞懂卷积神经网络的过拟合、梯度弥散、batchsize的影响的问题(二)_深度学习思考者-CSDN博客_卷积网络batchsizeblog.csdn.net[6]
https://www.quora.com/Why-does-batch-normalization-helpwww.quora.com[7]
基础 | batchnorm原理及代码详解blog.csdn.net[8]
小小将:你必须要知道CNN模型:ResNetzhuanlan.zhihu.com[9]
大师兄:详解残差网络zhuanlan.zhihu.com[10]
https://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdfopenaccess.thecvf.com