神经网络

梯度消失(vanishing gradient)

/ VAN-ish-ing GRAY-dee-ent /

梯度消失,是一个让深层神经网络难以训练的问题:学习信号在沿着层层往回传的途中,变得越来越微弱,直到最靠前的那几层几乎完全听不见它了。想象一句话在一长排人中悄悄往下传,每个人都把它复述得轻一点点——传到最远那头,它已成了听不清的咕哝。这里的「话」就是梯度,也就是告诉每个权重该往哪个方向调整的那个信号,而靠近输入的那几层,就是最远那头怎么也听不清的人。

这种衰减从何而来?训练靠把误差沿网络往回传来调整权重,而在每一层,信号都会被乘上一个数。如果这些数小于一——sigmoid 和 tanh 那平坦的两端很容易造成这一点——那么把许多个这样的数连乘起来,结果就会以指数级的速度被推向零。二十层每层乘以比方说 0.3,到头来几乎什么都不剩。于是靠前的那些层收到一个近乎零的轻推,便不再学习,只有靠后的层在改进。(与之镜像的麻烦,是那些数大于一、信号反而炸开,叫做梯度爆炸。)

这个问题曾让深度学习停滞多年,也解释了如今一整套标准的补救手段。ReLU 激活函数不压缩它正的一侧,让信号保持强劲。审慎的权重初始化让靠前的那些乘数保持在一附近。残差连接这类架构上的巧思,给信号一条跳过若干层的捷径,而批归一化则让它保持平稳。这些都不是灵丹妙药,但合起来,正是我们如今能训练深达数百层的网络的原因——而在它们出现之前,这几乎是不可能的。

在一个用 sigmoid 激活、共 20 层的网络里,每一步反向传播也许会把信号缩小到约 0.25 倍。经过 20 层,那就是 0.25 自乘 20 次——大约只有万亿分之一。第一层实际上被告知「调整量为零」,于是它永远学不会。换上 ReLU 再加上残差捷径,信号便能熬过这趟旅程。

把许多小数连乘,会把梯度推向零——靠前的层于是停止学习。

梯度消失与梯度爆炸是同一枚硬币的两面——都是反复乘以小于一或大于一的数。那些标准的对策(ReLU、审慎的初始化、残差连接、归一化)能驯服它,却没能根除它。

又称
vanishing gradient problemexploding gradient梯度消失梯度爆炸梯度消失问题