JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

激活函數

把上千個只會做直線運算的神經元堆在一起,你得到的仍然是……一條直線。激活函數就是裝在每個神經元上的那個小小彎折,它打破了這道魔咒——把一張扁平的算術之紙,變成能夠學會曲線、邊緣與意義的東西。

扁平世界的困境

你已經知道單個[[artificial-neuron|人工神經元]]做的事:它取來各個輸入,每個乘以一個[[weight|權重]],加起來,再加上一個[[bias-term|偏置]],然後把這一個數往下傳。這串操作裡的每一步都是直線運算——縮放與相加,僅此而已。這恰恰就是[[linear-map|線性映射]]的定義,而它有一個看似平淡卻要命的性質:一個接一個地做,你永遠得不到任何新東西。

下面這個結論,每個人第一次聽到都會驚訝。設想你把十層這樣的神經元疊起來,每一層餵給下一層,中間不放任何激活——一個又深又唬人的網絡。從數學上看,整座塔會坍塌。把十個權重矩陣相乘,你得到的只是一個矩陣;這十層的行為與單單一層*完全相同*。深度全白搭,它在你的數據上最多只能畫出一個平面。它彎不下來。

解決辦法小得幾乎令人難為情。在每個神經元算出它的加權和之後,我們讓這個數再多過一道工序——一個簡單的、*非直*的函數——然後才往下傳。這道工序就是[[activation-function|激活函數]]。它是水管上的那個折彎,那一點小小的彎折在一整層裡重複,就讓下一層得以疊出一道褶子,再下一層疊出褐子之上的褶子。一彎接一彎,網絡便獲得了描摹任意曲線的自由。

為什麼一個彎折就夠了

每個神經元只加一個樸素的彎折,竟能換來這麼多,感覺像是作弊。但它背後有一條貨真價實的定理。[[universal-approximation-theorem|通用逼近定理]]說:一個只含一層這種彎折神經元的[[hidden-layer|隱藏層]]網絡——只要神經元夠多——就能把你想要的*任何*連續函數逼近到你要求的任意精度。非線性正是開啟這扇門的那一味原料。它劃開了「只會畫直尺的工具」與「什麼都能畫的工具」之間的界限。

這個彎折還得悄悄承擔一件事:它必須是*可微的*(或足夠接近可微)。記得網絡靠把權重往降低誤差的方向輕推來學習,而要知道那個方向,我們需要每一步的斜率。所以激活函數不能是隨便哪個起伏——它必須是一個我們能算出斜率、並把斜率往回傳的函數。記住這一點;它解釋了接下來四個經典激活函數為何長成那副模樣。

壓縮派:sigmoid 與 tanh

最古老的彎折是[[sigmoid-function|sigmoid]],一條平滑的 S 形曲線。給它任何一個數——負一百萬也好,正一百萬也好——它都溫和地把答案擠進 0 到 1 之間。大的負數被壓平向 0,大的正數被壓平向 1,而正中間它陡峭地穿過 0.5。它的吸引力很直觀:輸出讀起來像一個柔和的「這個神經元開到幾分?」,或者一個概率。幾十年裡它都是默認選項,至今仍是「是/否」分類器*最後*那個神經元的自然之選。

它的近親是[[tanh-activation|tanh]],同樣的 S 形,但擠進 −1 到 1,並以零為中心。這個「以零為中心」是實打實的改進:當一層的輸出在零附近保持平衡時,下一層的梯度表現更好,學習往往也更快。如果你在隱藏層裡非要用一個壓縮型激活,tanh 幾乎總是勝過 sigmoid。

但這兩個壓縮派都共享一個不聲不響的缺陷,它一度讓深度學習停滯了好些年。看那 S 形兩端平坦的尾巴:在那裡,曲線幾乎水平,所以斜率幾乎為零。在一個深堆疊裡,學習信號是靠把這些斜率一層接一層地*相乘*往回傳的。把許多接近零的數相乘,信號還沒傳到靠前的層就縮減成烏有——那些層便不再學習。這就是著名的[[vanishing-gradient|梯度消失]]問題,是壓縮派的阿喀琉斯之踵。

ReLU:偷懶的天才

打破僵局的那個激活函數,簡單到幾乎有點欺負人。[[relu|ReLU]]——修正線性單元——只做一件事:輸入若為正,原樣放行;若為負,輸出零。整個函數就這麼多。它看上去像一塊平坦的地板,到零點處突然向上翹起。沒有指數運算,沒有要計算的曲線——只是「好消息留下,壞消息丟掉」。

def relu(x):
    return x if x > 0 else 0

# slope (what backprop sends back):
#   x > 0  ->  1   (full signal passes, undimmed)
#   x < 0  ->  0   (this neuron is 'off', no signal)
#
# sigmoid(x) slope peaks at just 0.25 and fades to ~0 in the tails;
# relu's slope is a clean 1 wherever it's active -> gradients survive depth.
一行寫完 ReLU,以及它為何能躲開梯度消失:在激活的那一側,它的斜率正好是 1,於是學習信號原封不動地往回傳,而不會被一層層擠壓向零。

那個乾淨的斜率 1 就是魔法所在。學習信號流經激活的 ReLU 神經元時不被削弱,於是即便是很深的堆疊也能持續訓練。再加上它的計算便宜到塵埃裡,你就明白為什麼 ReLU 成了視覺、語言乃至幾乎一切領域中隱藏層的默認激活。[[deep-learning|深度學習]]熱潮的大半,就坐在這個一行的小把戲之上。

ReLU 並非完美無瑕,它的怪癖值得坦白說說。因為對任何負輸入,它的輸出和斜率都是零,一個神經元可能被推進負區並*留*在那裡——它的梯度為零,於是再也不更新。人們管這叫「死掉的 ReLU」。補救辦法是一點小改動(leaky ReLU、GELU 之類,讓負的一側也漏過一絲),但主旨不變:樸素的 ReLU 仍是隱藏層裡頭一個值得一試的明智之選。

Softmax:委員會的投票

另外三個激活函數都一次只作用於一個神經元。[[softmax|Softmax]]是個異類:它一次看*一整排*末端神經元,把它們的原始分數變成一組加起來恰好等於 1 的概率。設想一個分類器,最後一層每個類別配一個神經元——貓、狗、鳥。Softmax 取來這三個分數,相當於回答:「70% 是貓,25% 是狗,5% 是鳥。」它放大領先者、壓低其餘者,但總和永遠保持在 100%。

這正是為什麼 softmax 幾乎只待在多類分類器的*輸出端*,從不出現在隱藏層。它是那一層,把網絡內部的意見翻譯成乾淨、可比較的答案。還有一句誠實的提醒值得帶著:softmax 給出的那個看上去自信的 99%,*並不*是經過校準的真相——模型完全可能既響亮又流利地犯錯。Softmax 給你的是一個整齊的分布,而非這個分布正確的保證。

它在我們的搭建中處在哪一環

退一步,看看你現在手裡這套東西的形狀。一個神經元做它的加權和;一個激活把結果彎折;一層就是一排這樣的神經元;中間夾著彎折的若干層疊在一起,就是一個[[multilayer-perceptron|多層感知機]]——一個真正有表達力的網絡。激活函數正是那個唯一的部件,立在「一張高級電子表格」與「能學會一張臉的曲線、一句話的語法的東西」之間。

  1. 一個輸入到來,流過各層——每個神經元先求和,再用它的激活函數彎折。這就是上一篇裡見過的前向傳播。
  2. 在末端,sigmoid 或 softmax 把原始分數塑造成可用的答案或概率。
  3. 誤差被測量出來,然後往回送——關鍵在於,每個激活函數的*斜率*決定了有多少學習信號能從它身上流回去。
  4. 權重輕輕挪動一點;在數據上反覆,直到這些彎折安頓成一個貼合的形狀。

上面第三步,正是通往下文的那座橋。激活為何必須可微,梯度消失為何要緊,ReLU 那乾淨的斜率 1 為何是一次突破——這一切都指向我們至今只點到為止的一套機制:網絡如何把自己的錯誤往回傳,從而自我教導。這套機制就是[[backpropagation|反向傳播]],正是下一篇導讀的主題。如今它要作用的每一個部件,你都已經握在手裡。