原理
梯度消失的定义
- 在深度神经网络中,梯度消失是指在误差反向传播过程中,接近输入层的层次上梯度趋近于零的现象。
- 这导致网络权重的更新非常缓慢,甚至停止,使得训练过程变得极其困难。
- 主要发生在使用Sigmoid或Tanh等饱和激活函数时。
梯度爆炸的定义
- 梯度爆炸是指在误差反向传播过程中,梯度随着传播增大,导致权重更新过大。
- 这可能会导致网络权重波动极大,甚至发散,使得网络无法收敛。
- 常见于深度网络或循环神经网络,例如resNet,RNN等。
分析出现梯度消失和爆炸的原理
深度神经网络往往有很多层,每一层一般都有很多个神经元,梯度的反向传播路径错综复杂,但大道至简,繁始于细,难作于易,我就从从单个神经元的传播路径来分析。
假如,单个神经元的网络结构如下:
从输入x到输出y中间需经历4层,每层只有一个神经元,分别为a1,a2,a3,a4,对应的权重参数分别为w0,w1,w2,w3,w4
假如使用sigmod激活函数,则有以下关系,z为中变量。
z
i
+
1
_{i+1}
i+1 = w
i
_i
ia
i
_i
i + b
i
_i
i
a
i
+
1
_{i+1}
i+1 =
σ
\sigma
σ(z
i
+
1
_{i+1}
i+1)
σ
\sigma
σ表示sigmod函数
比如我们要的w
1
_1
1的参数进行调整,即需要y对a
1
_1
1进行求导,则根据链式求导法则有:
Sigmoid 函数的导数 𝜎′(𝑥)如 图示
我们可以看到sigmoid的导数最大值为0.25,那么随着网络层数的增加,小于1的小数不断相乘导致 ∂𝑦∂𝑎1
逐渐趋近于零,从而产生梯度消失。
那么梯度爆炸又是怎么引起的呢?同样的道理,当权重初始化为一个较大值时,虽然和激活函数的导数相乘会减小这个值,但是随着神经网络的加深,梯度呈指数级增长,就会引发梯度爆炸。但是从AlexNet开始,神经网络中就使用ReLU函数替换了Sigmoid,同时BN(Batch Normalization)层的加入,也基本解决了梯度消失/爆炸问题
优化措施
使用ReLU激活函数
- ReLU(Rectified Linear Unit)激活函数可以有效缓解梯度消失问题。
- 它在正区间内保持梯度恒定,避免了Sigmoid和Tanh函数在饱和区的平坦梯度。
权重初始化技术
- 采用合适的权重初始化方法(如He初始化、Xavier初始化)可以减少梯度消失和爆炸问题。
- 这些方法通过调整初始权重的规模来保持网络中各层激活值和梯度的分布稳定。
梯度裁剪
- 对于梯度爆炸问题,可以通过限制梯度值的大小来防止权重更新过大。
- 即当计算出来的梯度超过某个阈值时,就将其裁剪到这个阈值。
案例分析
实例:解决RNN中的梯度消失/爆炸
- 循环神经网络(RNN)特别容易出现梯度消失和爆炸问题。
- 通过使用LSTM(长短期记忆)单元或GRU(门控循环单元),可以有效解决这一问题。
- 这些结构通过引入门控机制来调节信息流,从而保持长期依赖关系而不会丧失学习能力。
总结
关键点回顾
- 深度学习中的梯度消失与爆炸是训练深层神经网络时面临的关键挑战。
- 通过采取适当的优化措施(如选择合适的激活函数、权重初始化技术、以及应用梯度裁剪等),可以有效缓解这些问题。
- 理解并应对这些挑战对于设计高效稳定的深层学习模型至关重要。