(13)学习笔记:动手深度学习(数值稳定性和模型初始化)

1.数值稳定性的两个常见问题

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第1张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第2张图片

2.梯度爆炸与梯度消失

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第3张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第4张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第5张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第6张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第7张图片

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第8张图片

3.解决方法

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第9张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第10张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第11张图片

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第12张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第13张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第14张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第15张图片

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第16张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第17张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第18张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第19张图片

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))

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第20张图片
相反,梯度爆炸可能同样令人烦恼。
为了更好地说明这一点,我们生成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)

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第21张图片

5.总结

(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第22张图片
(13)学习笔记:动手深度学习(数值稳定性和模型初始化)_第23张图片

5.问题

  • 1.在训练的过程中,如果网络层的输出的中间层特征元素的值突然变成nan了,是发生了梯度爆炸了吗?还是有什么可能的原因?
    是的
  • 2.老师,通过把每一层输出的均值和方差做限制,是不是可以理解为限制各层输出值出现极大或极小的异常值?
    可以

你可能感兴趣的:(深度学习,深度学习,学习,人工智能)