梯度消失&梯度爆炸

169 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

梯度爆炸(gradient exploding : 参数更新过大,破坏了模型的稳定收敛;

梯度消失(gradient vanishing : 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习

考虑一个具有L层、输入x和输出o的深层网络。 每一层l由变换fl定义,该变换的参数为权重W(l), 其隐藏变量是h(l)(令 h(0)=x)。 我们的网络可以表示为:

image.png

如果所有隐藏变量和输入都是向量, 可以将o关于任何一组参数W(l)的梯度写为下式:

image.png

该梯度是L−l个矩阵M(L)...M(l+1)M(L)·...·M(l+1) 与梯度向量 v(l)的乘积。 因此,我们容易受到数值下溢问题的影响。当将太多的概率乘在一起时,这些问题经常会出现。 在处理概率时,一个常见的技巧是切换到对数空间, 即将数值表示的压力从尾数转移到指数。然而这会导致更严重的问题:矩阵 M(l) 可具有截然不同的特征值,其大小不定,导致他们的乘积可能非常大,也可能非常小。不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到我们优化算法的稳定性。

梯度消失

0.8^100=2×10^-10

曾经sigmoid函数 image.png 很流行, 因为它类似于阈值函数。 由于早期的人工神经网络受到生物神经网络的启发, 神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。 然而,它却是导致梯度消失问题的一个常见的原因。

当sigmoid函数的输入很大或是很小时,它的梯度都会消失。如果模型参数没有正确初始化,sigmoid函数可能在正区间内得到几乎为0的梯度,反向传播无法继续更新模型参数,从而使模型无法得到有效的训练。

当我们的网络有很多层时,就可能在某一层可能会切断梯度。这个问题曾经困扰着深度网络的训练。现在,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。

梯度爆炸

训练过程中,值变nan,就是大概率发生梯度爆炸了

1.5^100=4×10^17,计算机中16位浮点数的数值区间为6×10^-5~6×10^4 现在32位和64位更常见

梯度爆炸一般不会由激活函数引起,而是每个层的值太大,累计的层数过多后导致。