Pytorch4.8梯度爆炸和梯度消失以及解决的办法
梯度爆炸/消失
梯度消失:参数更新过⼩,在每次更新时⼏乎不会移动,导致模型⽆法学习。
%matplotlib inline
import torch
from d2l import torch as d2l
# 梯度消失参数更新过⼩,在每次更新时⼏乎不会移动,导致模型⽆法学习
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.s_like(x))
d2l.plot(x.detach().numpy(),[y.detach().numpy(),x.grad.numpy()],legend=["Sigmoid","Grad"],figsize=(4.5,2.5))
梯度爆炸:参数更新过⼤,破坏了模型的稳定收敛。
M = al(0, 1, size=(4,4))
print('⼀个矩阵 \n',M)
for i in range(100):
M = (al(0, 1, size=(4, 4)))
print('乘以100个矩阵后\n', M)
[out]:⼀个矩阵
tensor([[ 0.7392, -0.7381,  0.1063,  0.5866],
[-0.0302, -1.4010,  0.2725, -0.3175],
[-1.9900, -1.1248,  1.7442,  1.3487],
[-0.5263,  0.5572,  0.2403,  0.6967]])
乘以100个矩阵后
tensor([[ 1.4398e+25, -4.8513e+24, -2.9295e+23, -2.8513e+24],
[ 1.3503e+25, -4.5497e+24, -2.7475e+23, -2.6741e+24],
[-1.8323e+25,  6.1736e+24,  3.7281e+23,  3.6285e+24],
[-1.4487e+25,  4.8811e+24,  2.9476e+23,  2.8689e+24]])
对于沐神所说的改变权重的顺序或者重排列,不能够改善梯度爆炸和梯度消失。这⾥是因为改变权重顺序或者重排列只是让我们的MLP换了另外⼀种线性表达,本质上还是线性。为了让训练更加稳定,我们有很多种⽅法可以限制梯度:
1. 把梯度限制在⼀定的范围内。
2. 将乘法变成加法: ResNet , LSTM
3. 归⼀化:梯度归⼀化。梯度裁剪。
4. 合理权重初始化和激活函数。
正则化 归一化
其中⼀个⽐较不错的权重初始化的⽅式是Xavier。
Xavier初始化
解决(或⾄少减轻)上述问题的⼀种⽅法是进⾏参数初始化,优化期间的注意和适当的正则化也可以进⼀步提⾼稳定性。
让我们看看某些没有⾮线性的全连接层输出(例如,隐藏变量)o i的尺度分布。对于该层n in输⼊x j及其相关权重w ij,输出由下式给出
o i=n in ∑
j=1w ij x j
权重w ij都是从同⼀分布中独⽴抽取的。此外,让我们假设该分布具有零均值和⽅差σ2。请注意,这并不意味着分布必须是⾼斯的,只是均值和⽅差需要存在。现在,让我们假设层x j的输⼊也具有零均值和⽅差γ2,并且它们独⽴于w ij并且彼此独⽴。在这种情况下,我们可以按如下⽅式计算o i的平均值和⽅差:
E [o i ]=n in ∑
j =1E [w ij x j ]
=n in ∑j =1E [w ij ]E [x j ]
=0,
Var[o i ]=E [o 2i ]−(E [o i ])
2=n in
j =1E [w 2ij x 2j ]−0=n in
∑j =1E [w 2ij ]E [x 2j
]=n in σ2γ2.
保持⽅差不变的⼀种⽅法是设置 n in σ2=1 。 现在考虑反向传播过程,我们⾯临着类似的问题,尽管梯度是从更靠近输出的层传播的。 使⽤与前向传播相同的推断,我们可以看到,除⾮ n out σ2=1 , 否则梯度的⽅差可能会增⼤,其中 n out  是该层的输出的数量。 这使得我们进退两难:我们不可能同时满⾜
这两个条件。 相反,我们只需满⾜:1
2(n in +n out
)σ2=1 或等价于 σ=2n in +n out .
通常,Xavier 初始化从均值为零,⽅差 σ2=2n in +n out
的⾼斯分布中采样权重。我们也可以利⽤Xavier 的直觉来选择从均匀分布中抽取权重时的⽅差。 注意均匀分布 U (−a ,a ) 的⽅差为 a 23 。 将 a 2
3 代⼊到 σ2 的条件中,将得到初始化值域:
U −6n in +n out ,6n in +n out 尽管在上述数学推理中,“不存在⾮线性”的假设在神经⽹络中很容易被违反, 但Xavier 初始化⽅法在实践中被证明是有效的。最后做个总结的话就是:
1. 需要⽤启发式的初始化⽅法来确保初始梯度既不太⼤也不太⼩。
2. ReLU 激活函数缓解了梯度消失问题,这样可以加速收敛。
3. 随机初始化是保证在进⾏优化前打破对称性的关键。
4. Xavier 初始化表明,对于每⼀层,输出的⽅差不受输⼊数量的影响,任何梯度的⽅差不受输出数量的影响。√(√√)
Processing math: 100%

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。