梯度消失和梯度爆炸

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cherrylvlei/article/details/79944928

● 每周一言

时间,是成长的必要代价。

导语

在机器学习模型训练的常见问题中,除了会遇到过拟合、欠拟合问题,还有一类问题也经常出现,那便是 梯度问题。梯度问题具体是什么?又有哪些应对之法?

梯度问题

梯度问题出现在深度神经网络的残差反向传播过程当中,原因是神经网络通过链式法则求解不同层的梯度,中间的连乘操作有可能导致残差计算的不稳定性,使得模型训练失效。梯度问题具体有两种表现形式:梯度消失梯度爆炸

fig1

梯度消失 又叫 梯度弥散。根据链式法则,如果每一层神经元的权重与上一层传递过来的残差之积都小于1,这样经过足够多层传递之后,残差值将趋近于0。

梯度消失示例:y1 = w1x1, x2 = f(y1), y2 = w2x2, x3 = f(y2), y3 = w3x3, …, xn = f(yn-1)。

其中x1是输入层的输入,x2、x3分别是中间两个隐层的输出,xn是输出层的输出。w1的梯度求解:σw1 = L’ * f’(y1) * f’(y2) * … * f’(yn-1) * w2 * … * wn-1 * x1。

fig2

上述示例可以看出,造成梯度消失的具体原因,要么是权重w偏小,要么就是x偏小。w偏小一般是参数初始化的问题,x偏小则是激活函数的问题。

比如常见的sigmoid激活函数,其导数f’(x) = f(x) * (1 - f(x))的最大值为0.25,连乘比较容易造成梯度消失。

同上述示例,梯度爆炸 的具体原因则是初始化权重w过大所致。例如,各层激活函数如果是sigmoid,那么造成梯度爆炸的必要条件是w的初始值至少大于4。

fig3

解决梯度问题主要有以下六种方法:

pre-training&fine-tunning 该方法由Hinton在2006年提出,采取先局部后整体的思想,pre-training先逐层训练每一个隐层的神经元,fine-tunning再通过BP对整个网络进行训练微调。

梯度剪切 顾名思义,在向前传递残差的时候,根据设定阈值进行残差截断。该手段主要用于防止梯度爆炸。

损失函数加入正则项 通过加入正则项,限制权重大小,具体正则项的讲解可参考 正则项:把控拟合方向的马车夫。该手段主要也是防止梯度爆炸。

fig4

使用线性组合的激活函数 如前文所述,sigmoid激活函数导数最大值为0.25,且越靠近边界导数值下降越明显,可替换成ReLU等线性组合的激活函数,这些函数既简单、导数值又是常数,能有效防止梯度消失。

Batch Normalization 这是G公司在ICML2015的论文中提出来的一种“批量规范化”的方案,简单而言就是通过对每一层的输出先进行规范化(减均值除方差),再进行激活传递至下一层。

加入残差网络 传统的BP网络都是残差逐层串行传递,而该网络支持残差跨层传递,直接避免了连乘带来的计算不稳定性。

以上便是梯度问题的讲解,敬请期待下节内容。

结语

感谢各位的耐心阅读,后续文章于每周日奉上,敬请期待。欢迎大家关注小斗公众号 对半独白

face

阅读更多

没有更多推荐了,返回首页