梯度消失和梯度爆炸和梯度弥漫以及每个的解决方法

梯度消失的原因

  1. 深层网络
  2. 不合适的损失函数

梯度爆炸的原因

  1. 权值初始值过大

梯度消失和爆炸的原因: 在梯度更新的过程中,会进行反向求导。当前层的导数与学习率相乘。

而当部分导数的值大于1时,随着层数的增多,那么求出的梯度将会以指数形式增加,这就是梯度爆炸    比如5的30次方

而当部分导数的值小于1时,随着层数的增多,那么求出的梯度将会以指数形式衰减,这就是梯度更新   比如0.2的30次方

解决方法

梯度剪切  :

1:针对梯度爆炸而设定,设置一个阈值,当更新梯度时,梯度超过阈值,就修改为其值设定为阈值的值,这样可以预防梯度爆炸。

2:权重正规化&权重衰减: 为损失函数加上权重的平方范数(L2范数   L1等等),这样可以抑制权重变大  ,或者使用Relu。

Pytorch中设置weight_decay的值就可以实现权值衰减

Pytorch中实现梯度裁剪

梯度弥散

梯度下降法(以及相关的L-BFGS算法等)在使用随机初始化权重的深度网络上效果不好的技术原因是:梯度会变得非常小。具体而言,当使用反向传播方法计算导数的时候,随着网络的深度的增加,反向传播的梯度(从输出层到网络的最初几层)的幅度值会急剧地减小。结果就造成了整体的损失函数相对于最初几层的权重的导数非常小。这样,当使用梯度下降法的时候,最初几层的权重变化非常缓慢,以至于它们不能够从样本中进行有效的学

习。这种问题通常被称为“梯度的弥散”.

  • 梯度弥散:
    • 采用BN算法batchnormalization
    • 改变激活函数

BN算法好处

1:可以增加训练速度,防止过拟合:如果没有归一化,每一层训练后的数据分布都不同,网络需要更大的开销去学习新的分布,造成网络模型更加复杂,因此容易发生过拟合,网络收敛也比较慢。

2:可以避免激活函数进入非线性饱和区,从而造成梯度弥散问题

3:由于因为BN具有提高网络泛化能力的特性,可以减少了你可以移除dropout比例和正则化参数,这样减少繁琐的调参。

4:可以省LRN局部归一化层。

猜你喜欢

转载自blog.csdn.net/weixin_43852823/article/details/127561792