本文中心:数值稳定性的两个常见问题——梯度爆炸,梯度消失。
在神经网络中,求解损失关于参数的梯度的时候,如下图,链式法则会造成连续的矩阵乘法:
这样的矩阵乘法会带来的问题是:梯度爆炸(1.5**100),梯度消失(0.8**100)。
梯度爆炸的问题:1值超出值域,特别是对于float16尤为严重 2对学习率敏感,可能需要在训练过程不断调整学习率,一开始学习率可以大一些,后面学习率小一点
梯度消失的问题:1梯度值变成0,对float16尤为严重 2 一旦梯度消失,不管如何调整学习率都无法更新权重,训练无进展 3可能造成顶层训练好,底层(更深层)由于梯度的消失而训练不好。这样就无法让神经网络更深。
问题产生了就要去解决,下面讲讲如何解决梯度消失和梯度爆炸,提升数值稳定性。
我们想让训练更加稳定,即让梯度值在合理的范围。具体做法有三种,如下:
这里介绍的是合理的权重初始和激活函数。
想要实现合理的权重初始和激活函数,一个想法是将每层的输出和梯度看作随机变量,让各层输出的均值和方差保持一致,让各层梯度的均值和方差也一样。于是便得到如下两个结论:
1 合理的权重初始化方法:Xavier初始,这样第t层权重初始化时,不管是用正态分布还是均匀分布进行初始化,其方差都可以事先计算。如下图,
是第t层权重的方差, 是第t层输出维度,即第t层有几个神经元。
2 合适的激活函数应当至少在零点附近接近 。如下图,这里要注意的是sigmoid激活函数可以通过乘4减2进行调整,