一.神经网络的梯度计算
假设你有一个输入,比如图像的像素、文本的词向量等等。
然后神经网络中有多层神经元,每层做一次变换。
其中h指的就是隐藏层
第层的输出是:
其中,是第 层的激活函数或线性变换等
网络的最终输出:
这里的ℓ是损失函数,也就是每一层的损失函数作用于原始的X。
加上损失函数,神经网络才有一个标准,指导什么是好的结果。
损失函数
衡量的是神经网络预测结果和真实标签之间的差距。
作用是:告诉模型预测得好不好,指导模型如何更新参数变得更好。
我们现在要计算:
这个梯度告诉我们:
如果我稍微改动 ,损失会变大还是变小?
那我们就可以顺着“减小损失”的方向去调节参数
把梯度通过链式法则一层一层传回来,最终乘到第层的参数上。
二.梯度爆炸和梯度消失
出现原因
在深度网络中,反向传播梯度是通过链式法则传播的:
其中只要每一层的导数稍微变化一点,乘积起来就会发生巨大变化。
梯度爆炸
反向传播时,梯度越来越大,最后变得无穷大,导致数值不稳定、权重发散、损失为 NaN。
如果每一层的导数都 > 1:
梯度消失
反向传播时,梯度越来越小,最后小到接近 0,导致参数更新停滞,网络无法有效学习。
如果每一层的导数都 < 1:
三.加入MLP
当前层的输出等于前一层的输出通过线性变换(乘以权重)再经过非线性激活函数
表示在反向传播过程中,第层对前一层的导数表达式
从第层一直反传到第层的链式梯度总乘积
左侧:
右侧:
梯度爆炸
如果使用ReLU作为激活函数:
如果d-t很大,这个连乘可能会非常大
当你连续乘很多个矩阵,而这些矩阵中有些值略大于1,那么整体乘积会随着层数增多呈指数增长,导致梯度爆炸。
梯度爆炸的问题
值超出值域
因为16位浮点数的数值区间只在(6e-5到6e4)之间,所以值很容易就超出范围
对学习率敏感
学习率乘以梯度控制者更新步长
如果学习率太大 --> 参数值大 --> 梯度增大
如果学习率太小 --> 导致训练几乎无进展
梯度消失
同理:
如果d-t很小,这个连乘可能会非常小
当你连续乘很多个矩阵,而这些矩阵中有些值略小于1,那么整体乘积会随着层数增多而近似等于0,导致梯度消失。
梯度消失的问题
梯度值变为0
训练没有进展
仅仅是让的顶部层训练的较好,无法让神经网络更深
因为靠近输出层的参数接收到的梯度还没来得及变小,更新还算正常,但是越往底层,梯度被乘得越小,甚至趋于 0。
总结