1.数值稳定性的两个常见问题
2.梯度爆炸与梯度消失
3.解决方法
4. 代码
曾经sigmoid函数
1
/
(
1
+
exp
(
−
x
)
)
1/(1 + \exp(-x))
1/(1+exp(−x))( :numref:sec_mlp
提到过)很流行,因为它类似于阈值函数。
由于早期的人工神经网络受到生物神经网络的启发,神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。
然而,它却是导致梯度消失问题的一个常见的原因。
%matplotlib inline
import torch
import d2l
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.backward(torch.ones_like(x))
d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()],
legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))
相反,梯度爆炸可能同样令人烦恼。
为了更好地说明这一点,我们生成100个高斯随机矩阵,并将它们与某个初始矩阵相乘。
对于我们选择的尺度(方差
σ
2
=
1
\sigma^2=1
σ2=1),矩阵乘积发生爆炸。
当这种情况是由于深度网络的初始化所导致时,我们没有机会让梯度下降优化器收敛。
M = torch.normal(0, 1, size=(4,4))
print('一个矩阵 \n',M)
for i in range(100):
M = torch.mm(M,torch.normal(0, 1, size=(4, 4)))
print('乘以100个矩阵后\n', M)
5.总结
5.问题
- 1.在训练的过程中,如果网络层的输出的中间层特征元素的值突然变成nan了,是发生了梯度爆炸了吗?还是有什么可能的原因?
是的 - 2.老师,通过把每一层输出的均值和方差做限制,是不是可以理解为限制各层输出值出现极大或极小的异常值?
可以