梯度消失和梯度爆炸,纯理论(第二篇)

196 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

总结:此文为12月更文计划第一天第二篇。

梯度消失

梯度消失问题发生时,接近于输出层的 hidden layer 3 等的权值更新相对正常,但前面的hidden layer 1 的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致 hidden layer 1 相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。

如何解决:

1 换用 Relu、LeakyRelu、Elu 等激活函数

ReLu:让激活函数的导数为 1

LeakyReLu:包含了 ReLu 的几乎所有有点,同时解决了 ReLu 中 0 区间带来的影响

ELU:和 LeakyReLu 一样,都是为了解决 0 区间问题,相对于来,elu 计算更耗时一些

2.BatchNormalization

BN 本质上是解决传播过程中的梯度问题

3.ResNet 残差结构

4.LSTM 结构

LSTM 不太容易发生梯度消失,主要原因在于 LSTM 内部复杂的“门

5.预训练加 finetunning

其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。训练完成后,再对整个网络进行“微调(fine-tunning)”。

此方法相当于是找全局最优,然后整合起来寻找全局最优

梯度爆炸

在反向传播过程中使用的是链式求导法则,如果每一层偏导数都大于 1,那么连乘起来将以 指数形式增加,误差梯度不断累积,就会造成梯度爆炸。梯度爆炸会导致模型权重更新幅度 过大,会造成模型不稳定,无法有效学习,还会出现无法再更新的 NaN 权重值。

1.模型无法在训练数据上收敛(比如,损失函数值非常差);

2.模型不稳定,在更新的时候损失有较大的变化;

3.模型的损失函数值在训练过程中变成 NaN 值;

解决方法:

1.重新设计网络模型

在深层神经网络中,梯度爆炸问题可以通过将网络模型的层数变少来解决。此外,在训练网络时,使用较小批量也有一些好处。

2.使用修正线性激活函数在深度多层感知机中,当激活函数选择为一些之前常用的 Sigmoid 或 Tanh 时,网络模型会发生梯度爆炸问题。而使用修正线性激活函数(ReLU)能够减少梯度爆炸发生的概率,对于隐藏层而言,使用修正线性激活函数(ReLU)是一个比较合适的激活函数,当然 ReLU函数有许多变体,大家在实践过程中可以逐一使用以找到最合适的激活函数。

3.使用长短周期记忆网络

由于循环神经网络中存在的固有不稳定性,梯度爆炸可能会发生。比如,通过时间反向传播,其本质是将循环网络转变为深度多层感知神经网络。通过使用长短期记忆单元(LSTM)或相关的门控神经结构能够减少梯度爆炸发生的概率。(因为 LSTM 有梯度裁剪,检查误差梯度值就是与一个阈值进行比较,若误差梯度值超过设定的阈值,则截断或设置为阈值。)

对于循环神经网络的时间序列预测而言,采用 LSTM 是新的最佳实践。

4.使用权重正则化如果梯度爆炸问题仍然发生,另外一个方法是对网络权重的大小进行校验,并对大权重的损 失函数增添一项惩罚项,这也被称作权重正则化,常用的有 L1(权重的绝对值和)正则化与 L2(权重的绝对值平方和再开方)正则化