数值稳定性和模型初始化
初始化方案的选择在神经网络学习中起着举足轻重的作用, 它对保持数值稳定性至关重要。
此外,这些初始化方案的选择可以与非线性激活函数的选择有趣的结合在一起。
选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇到梯度爆炸或梯度消失。
梯度消失和梯度爆炸
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。 我们可能面临一些问题。
要么是梯度爆炸(gradient exploding)问题: 参数更新过大,破坏了模型的稳定收敛;
要么是梯度消失(gradient vanishing)问题: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
梯度消失
曾经sigmoid函数1/(1+exp(−𝑥)) 很流行, 因为它类似于阈值函数。
- 梯度值变为0,对16为浮点数尤为严重
- 训练没有进展,不管如何选择学习率
- 对底部层尤为严重
- 仅仅顶部层训练的较好
- 无法让神经网络更深
由于早期的人工神经网络受到生物神经网络的启发, 神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。
然而,它却是导致梯度消失问题的一个常见的原因, 让我们仔细看看sigmoid函数为什么会导致梯度消失。
%matplotlib inline
import torch
from d2l import torch as d2l
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y