深度学习总结(六)——梯度弥散、爆炸和过拟合

来源:互联网 发布:淘宝跳蚤街在哪 编辑:程序博客网 时间:2024/05/28 15:58

这里写图片描述


一、梯度弥散和爆炸

1. 梯度弥散的解释

梯度弥散的问题很大程度上是来源于激活函数的“饱和”。因为在后向传播的过程中仍然需要计算激活函数的导数,所以一旦卷积核的输出落入函数的饱和区,它的梯度将变得非常小。

使用反向传播算法传播梯度的时候,随着传播深度的增加,梯度的幅度会急剧减小,会导致浅层神经元的权重更新非常缓慢,不能有效学习。这样一来,深层模型也就变成了前几层相对固定,只能改变最后几层的浅层模型。

梯度爆炸的情况正好相反。

2. 防止梯度弥散的方法

BN。加入BN层之前,反向传播的梯度为:

lhk=lhlli=k+lwi

加入BN之后,反向传播的梯度为:

hlhl1=BNwlhl1hl1=BNαwlhl1hl1

我们可以看到此时反向传播乘以的数不再和w的尺度相关,也就是尽管我们在更新过程中改变了w的值,但是反向传播的梯度却不受影响。
跟进一步:

BN((αw)u)(αw)=1αBN(wu)w

即尺度较大的 w 将获得一个较小的梯度,在同等的学习速率下其获得的更新更少,这样使得整体 w 的更新更加稳健起来。

3. LSTM如何避免梯度弥散和梯度膨胀

  1. 梯度弥散
    梯度弥散是RNN存在的一个固有问题。RNN的本质是在网络内部维护了一个状态S_t,其中t表示时间且S_t可递归计算。
    传统的RNN总是用“覆写”的方式计算状态:St=f(St1,xt),其中f(·)Sigmoid,x_t表示输入序列在时刻t的值。根据链式求导法则,这种形式直接导致梯度被表示为连积的形式,以致于造成梯度消失——粗略的说,很多小于1的项连乘就很快的逼近零。
    现代的LSTM使用的是累加的形式计算状态。这种形式导致导数也是累加形式,因此避免了梯度消失。

  2. 梯度膨胀
    一般靠裁剪后的优化算法解决。比如gradient clipping(如果梯度的范数大于某个给定值,将梯度同比收缩)。

二、过拟合

1. 防止过拟合

  1. 数据增强:水平翻转,随机裁剪、平移变换,颜色、光照变换。
  2. Dropout:在Alexnet中提出,变种是dropconnect。
  3. Weight decay,early stop,Batch Normal,ReLU激活函数