神經網路

梯度消失(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梯度消失梯度爆炸梯度消失问题