NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 B · 模組 B2動手做 // 四個實驗台

Activation
家族

為什麼要非線性?ReLU 為什麼會「死」?GELU、SwiGLU 又解決了什麼?

神經網路的每一層先做「乘權重、加起來」,再把結果丟進一個小函數,這個小函數叫 activation。少了它,一百層等於一層。選錯它,梯度傳不回去、神經元會永遠停工。這個模組把常見的 activation 一個一個畫出來,看它們的形狀和斜率,再看這些形狀在訓練時造成什麼後果。

SEC.01 / SHAPES

一條曲線,加上它的斜率

Activation 是一個「一個數字進、一個數字出」的函數。訓練時真正重要的不只是它的形狀 f(x),還有它的斜率 f′(x):反向傳播每經過一層,就要乘上這一層的斜率。斜率接近 0 的地方,梯度在這裡就停了。下面把十種 activation 和它們的斜率畫在同一張圖上,把「輸入的範圍」拉到 ±10,看 sigmoid 和 tanh 的兩端發生什麼事。

PROBE A / 函數與導數動手做 // 換函數、拉大範圍
f(x) 輸出f′(x) 斜率ReLU 參考線斜率 < 0.01 的區域
在 x₀ 的輸出 f(x₀)0
在 x₀ 的斜率 f′(x₀)0
畫面範圍內,斜率 < 0.01 的比例0%
畫面範圍內,斜率最大值0
選一個函數。
三件事值得試。(1)選 Sigmoid,把範圍拉到 ±10:曲線兩端變平,橘色的斜率貼在 0,淡橘色區域佔了一半以上,這叫飽和。Sigmoid 的斜率最大只有 0.25,出現在 x = 0。(2)換 Tanh:最大斜率變成 1,輸出以 0 為中心,但兩端一樣飽和。(3)換 ReLU:正半軸斜率永遠是 1,不會飽和;負半軸斜率永遠是 0。這個 0 就是 SEC.02 的主角。圖上的曲線都是用公式即時算的;Leaky ReLU 的負斜率這裡設成 0.1 讓它看得見(常見預設是 0.01),Hard sigmoid 用 0.2x + 0.5 截在 0 和 1 之間。
非線性才有「折」兩個矩陣相乘還是一個矩陣。每層後面接一個會彎的函數,多層網路才能表示複雜的決策邊界。
斜率比形狀更要緊反向傳播看的是 f′。f′ 接近 0 的區域,梯度傳到這裡就沒了,前面的權重學不到東西。
每一代都在修上一代Threshold 不可微 → Sigmoid 會飽和 → ReLU 快但會死 → GELU / SiLU 平滑 → SwiGLU 看語境開關。
細看 · activation 的性質、三種角色、演進

講義列的四個性質:

  • 非線性:activation 如果是線性的,多層網路等於單層網路,學不到非線性的關係。
  • 可微:梯度下降需要斜率。有些函數只在部分範圍可微(ReLU 在 0 那一點不可微,實作上直接規定那點的導數是 0)。
  • 單調:單調的 activation 讓單層的問題比較好最佳化;但神經網路本來就有很多 local minimum,找到一個好的就夠了。GELU、SiLU、Mish 都不單調,照樣好用。
  • 輸出範圍:有界的輸出(sigmoid、tanh)讓最佳化比較穩定;無界的輸出(ReLU)訓練比較有效率,但需要比較小的 learning rate。

另外一個實務上一直存在的條件是計算便宜:每一層、每一個 token、每一個像素都要算一次,exp 或 erf 的成本會被放大成千上萬倍。這是 SEC.04 最後講 mobile 的原因。

三種角色(講義的整理):(1)表達能力:讓模型表示非線性函數與複雜決策邊界。(2)資訊選擇:決定哪些 feature 通過、抑制、放大或歸零。(3)訓練與部署:影響 gradient、sparsity、quantization、outlier 與硬體成本。所有的演進都在平衡這三件事。

演進:

  • Hard threshold:模仿神經元「放電或不放電」。導數幾乎處處是 0,門檻那一點又不可微,沒辦法用梯度訓練。
  • Sigmoid:把 threshold 磨圓,輸出 0 到 1,可以當機率或 soft gate。講義列的三個問題:兩端飽和會殺掉梯度;輸出不以 0 為中心;exp 比較貴。現在仍是二分類輸出、LSTM / GRU gate 的標準選擇。
  • Hard sigmoid:用一段直線加兩段水平線近似 sigmoid,計算成本低。
  • Tanh:輸出 −1 到 1,以 0 為中心,其實就是放大、平移過的 sigmoid:tanh(x) = 2σ(2x) − 1。比 sigmoid 好,但一樣會飽和。
  • ReLU:max(0, x)。計算非常簡單,正半軸不飽和,緩解了梯度消失。
  • GELU / SiLU:平滑版的 ReLU,保留一點小負值。SwiGLU:activation 變成看語境的 gate。
SEC.02 / DEAD RELU

ReLU 為什麼會「死」

ReLU 的負半軸斜率是 0。一個神經元算 z = w·x + b,如果所有輸入算出來的 z 都落在負半軸,它的輸出就全部是 0,傳回來的梯度也全部是 0。梯度是 0,權重就不會被更新;權重不更新,z 就永遠留在負半軸。它不是「暫時沒反應」,是永遠停工。下面這個神經元在學一條目標折線,你可以讓它好好訓練,也可以給它一記大梯度,看它怎麼死。

PROBE B / 死掉的 ReLU動手做 // 拖 b、訓練、推一把
z > 0(有梯度)z ≤ 0目標神經元輸出
有梯度可以流過的輸入0 / 21
梯度 ∂L/∂w / ∂L/∂b0 / 0
Loss(和目標差多少)0
走了幾步0
神經元活著。
照這個順序試。(1)先按「自動訓練」:輸出線會貼上目標。(2)按「來一個大梯度」:模擬一筆標錯的資料(x = 1,目標 −6,learning rate 0.6),誤差很大,一步就把 b 推到很負。上圖的點全部掉到 0 的左邊,變灰。(3)再按「自動訓練」:什麼都不會動,梯度是 0 / 0。(4)切到 Leaky ReLU 再訓練:負半軸還有 0.1 的斜率,梯度雖小但不是 0,它會慢慢爬回來。你也可以直接把 b 拖到 −3 以下看同樣的事。目標折線、learning rate 0.3、21 個輸入都是示意用的設定;梯度是對 loss ½(a − t)² 的平均用 chain rule 即時算的。
0 斜率會鎖死輸出 0 不是問題,問題是「所有輸入」都在 0 的那一邊。那時梯度是 0,沒有任何力量能把它拉回來。
怎麼死的:一步太大learning rate 太大,或一筆離譜的資料帶來巨大梯度,一步就把 b 推到負半軸深處。講義說:用 ReLU 要小心 learning rate。
但 0 也是優點部分神經元輸出 0,就是稀疏表示。背景這種「沒有這個特徵」的地方被歸零,後面的層只要處理有反應的位置。
細看 · ReLU 家族比較、稀疏表示、MaxOut

稀疏表示:講義說,用以 0 為中心的均勻初始化時,大約 50% 的 hidden unit 輸出是 0,加上 regularization 會更多。講義的貓耳偵測器例子:convolution 對「貓耳」反應 3.2、「毛髮邊緣」0.5、「平坦背景」−1.8;過 ReLU 後變成 3.2、0.5、0。負反應被當成「這個特徵不存在」。

ReLU 的注意事項(講義):只用在 hidden layer,輸出層分類用 softmax、回歸用線性。0 斜率會擋住梯度,但只要梯度能沿著某些路徑傳回去就不是大問題。輸出沒有上界可能數值不穩,L1 regularization 有幫助;ReLU6 把上界設在 6,方便 INT8 量化。試過用平滑的 Softplus 取代,結果 ReLU 比較好。

名字負半軸解決什麼代價
ReLU0最簡單、最稀疏、硬體成本最低;正半軸不飽和會死
ReLU60,正半軸上限 6限制 activation 範圍,INT8 量化比較好設 scale大訊號被截掉
Leaky ReLUαx,α 固定(如 0.01)負半軸還有梯度,避免完全無梯度不再有 exact zero
PReLUαx,α 是學出來的讓負斜率可學習多一個參數,可能 overfit
ELU / SELUα(eˣ − 1),平滑地飽和到 −α輸出平均更接近 0,改善分佈要算 exp;負區域仍會飽和;有 normalization 和 residual 後優勢被取代
MaxOut不是固定函數取 K 條直線的最大值,可近似任意凸的 activation,涵蓋 ReLU 與 Leaky ReLU;不飽和、不會死參數變成 K 倍

MaxOut 的寫法就是 max(XW + b, axis=1):先算 K 組線性輸出,再取最大。ReLU 是 K = 2、其中一組固定為 0 的特例。

修補的兩個方向(講義):保留 ReLU 優勢的一派(ReLU、ReLU6、ReLU²);修補 ReLU 缺陷的一派(Leaky、PReLU、ELU / SELU)。ReLU² 在 SEC.04 會回來。

SEC.03 / VANISHING GRADIENT

一串導數相乘:梯度消失與爆炸

SEC.01 看到 sigmoid 的斜率最大只有 0.25。一層看起來還好,問題在深:chain rule 說,傳到第一層的梯度,是每一層斜率一路乘起來。0.25 乘 10 次是百萬分之一。反過來,如果每層放大超過 1,乘 30 次會變成天文數字。下面把「每層的斜率 × 權重大小」連乘,用對數刻度畫出來。

PROBE C / 一串導數相乘動手做 // 拉層數、拉權重
SigmoidTanhReLU(活著的路徑)下方色條:每一層拿到的梯度,越淡越少
Sigmoid:傳到第 1 層剩0
Tanh:傳到第 1 層剩0
ReLU:傳到第 1 層剩0
Sigmoid 第幾層開始剩不到 1%0
拉層數看看。
每一層的放大倍率 = activation 的斜率 × 權重大小 |w|。Sigmoid 取它的最大值 0.25(實際只會更小),tanh 取你設的典型值(最大是 1,訓練中通常小於 1),ReLU 在活著的路徑上是 1。把 |w| 拉到 4:sigmoid 剛好 0.25 × 4 = 1 不衰減,tanh 和 ReLU 卻開始爆炸。把每層倍率維持在 1 附近,就是權重初始化(Xavier、He)想做的事。這些斜率是為了說明而取的典型值,真實網路每層、每個神經元都不一樣。
深度把小問題變大每層打個八折,30 層後只剩約 0.1%。靠近輸入的層幾乎收不到訊號,學得最慢。
消失與爆炸是同一件事都是「很多個數連乘」。倍率小於 1 會消失,大於 1 會爆炸。深網路的梯度天生不穩定。
ReLU 的 1 是它贏的原因活著的路徑上斜率剛好是 1,連乘不衰減。所以 ReLU 雖然會死,還是取代了 sigmoid 成為 hidden layer 的預設。
細看 · 講義的 MNIST 例子、為什麼 sigmoid 最大 1/4

MNIST 的例子(講義引用):用 sigmoid 的全連接網路,2 層 96.48%、3 層 96.9%、4 層 96.57%、5 層 96.53%。加深沒有變好,反而退步。原因是靠近輸入的那幾層幾乎沒在學:同一個網路裡,越前面的層梯度越小。講義的結論是:深網路的梯度是不穩定的。

∂L/∂W₁ = ∂L/∂y · σ′(z₂) · W₂ · σ′(z₁) · x 每經過一層,就多乘一個 σ′ 和一個 W

為什麼是 1/4:σ′(x) = σ(x)(1 − σ(x))。σ 在 0 到 1 之間,兩個加起來是 1 的數相乘,最大是 0.5 × 0.5 = 0.25,出現在 x = 0。一旦 x 偏離 0,σ′ 更小;在飽和的兩端趨近 0。

Tanh:最大斜率是 1,又以 0 為中心,所以講義說 tanh 永遠比 sigmoid 好;但它兩端一樣飽和,還是會梯度消失。

和初始化的關係:權重太小,訊號一層層縮到 0;權重太大,tanh 和 sigmoid 被推進飽和區。Xavier 初始化讓每層輸出的變異數維持一樣(Var(W) = 1/n);ReLU 會把一半的輸出變 0,所以 He 初始化再多乘 2。

Exploding gradient:倍率大於 1 時,梯度一路放大,一步更新就把權重推到很遠,loss 變成 NaN。講義也提醒 ReLU 的輸出沒有上界,可能造成數值不穩,L1 regularization 有幫助。

SEC.04 / SMOOTH & GATED

從開關到調光器,再到看語境的閘門

講義的比喻:ReLU 是開關,SiLU 是調光器。它不只問「要不要通過」,而是問「通過多少」。GELU 和 SiLU 讓強正值幾乎完整通過、小負值保留一點、強負值慢慢壓下去。現代 LLM 再往前一步:通過多少不由自己決定,而是由另一條路徑算出來的 gate 決定。這就是 SwiGLU。下面比較兩個神經元:一個是 ReLU(x₁ + x₂),一個是 Swish(x₂) × x₁。

PROBE D / 加法 vs 乘法 gate動手做 // 拉兩個輸入,換 gate
ReLU(x₁ + x₂)gate(x₂) · x₁熱圖:橘 = 正,藍 = 負
ReLU 神經元輸出 ReLU(x₁ + x₂)0
Gate 的值 gate(x₂)0
Gated 神經元輸出 gate(x₂) · x₁0
x₁ 的通過量(輸出對 x₁ 的斜率):ReLU / Gated0 / 0
拉 x₂ 看看。
語境:
看下面那張線圖。拉 x₂:黑線(ReLU)只是左右平移,斜率永遠是 1 或 0,x₂ 只能決定「折點在哪」。橘線(gated)的斜率在變:x₂ 大,x₁ 整條通過(用 Swish、GELU 當 gate 還會再放大);x₂ 是負的,x₁ 被壓到接近 0。這就是講義說的 feature interaction:一個輸入可以調另一個輸入的通過量,熱圖上看得出 gated 那張是「馬鞍形」,ReLU 那張是一條斜的折痕。兩個語境按鈕照講義的例子:把 x₁ 想成「公司」feature,前後文說的是晶片時 gate 放行,說的是派時 gate 壓下來。這裡 x₁、x₂ 直接當成兩個 projection 的結果,權重都設成 1,是示意。
GELU:依大小平滑加權不是硬切正負,而是乘上「x 有多大機率比一般的輸入大」。小負值留一點,大負值歸零。
Swish:輸入自己控制自己x · σ(x):gate 就是自己的 sigmoid。SwiGLU 把這個 gate 換成另一條路徑算出來的值。
乘法 = 條件式「條件成立時才放大某個特徵」用加法做不到,用乘法一行就有。代價是動態範圍變大,outlier 和量化變難。
細看 · GELU、SiLU、Mish、SwiGLU、ReLU²、mobile、怎麼選

GELU(Gaussian Error Linear Unit):GELU(x) = x · Φ(x),Φ 是標準常態分佈的累積分佈函數。講義的解讀:把輸入乘上「它比其他輸入大的機率」;也可以看成 ReLU 的平滑版加上依輸入決定的 dropout。講義的例子:x = −0.5(微弱負面訊號)時 ReLU 給 0、梯度 0;GELU 給約 −0.154、梯度約 0.13,訊號還在,還能更新權重。x = −10(極端噪音)時兩者都接近 0。精確版要算 erf,實務常用近似式 0.5x(1 + tanh[√(2/π)(x + 0.044715x³)]) 或 x·σ(1.702x)。

為什麼 BERT 用 GELU:token representation 的每一個維度不一定能用「正 = 有用、負 = 沒用」解釋,GELU 讓弱負訊號仍可參與表示;它和 LayerNorm、residual connection、large-batch training 搭配良好。講義的另一個例子是 “not bad”:硬切負訊號可能丟掉語意反轉的關鍵。缺點:沒有 exact sparsity,硬體比 ReLU 複雜,activation 仍可能出現 outlier。

SiLU / Swish:f(x) = x · σ(βx),β = 1 時叫 SiLU。是用自動搜尋找出來的 activation,在比較深的模型上常比 ReLU 好,常見於 EfficientNet 這類 modern CNN。平滑、非單調、正半軸近似線性。限制:需要 sigmoid,沒有 exact sparsity,量化或 ASIC 上比 ReLU 複雜,單純替換不保證每個架構都變好。

Mish:x · tanh(softplus(x)),延續 Swish 的平滑 self-gating。講義備註引用的論文數字:最終準確度比 Swish 高 0.494%、比 ReLU 高 1.671%。曲線幾乎處處平滑,輸出地貌比較平滑、比較好最佳化。限制:softplus 和 tanh 成本高,改善依資料集與架構而異,在大模型上微小的 accuracy 增益可能抵不過運算成本。

GLU → SwiGLU:原始 GLU 是 σ(xW) ⊙ (xV),SwiGLU 把 σ 換成 Swish:SwiGLU(x) = (xW + b) ⊙ SiLU(xV + c)。LLM 的 FFN 變成三個矩陣:內容路徑 value = xWᵥ、閘門路徑 gate = SiLU(xW_g)、逐元素相乘後再乘輸出投影 W_o。講義的比較:

特性SiLU FFNSwiGLU FFN
公式x · σ(x),套在一條 projection 上(xW + b) ⊙ SiLU(xV + c)
矩陣2 個(升維、降維)3 個(第一層變 2 個)
計算較低參數與計算量約多 50%,通常把 hidden 維度縮小來平衡
代表模型GPT-2、早期視覺模型LLaMA 3、Gemma、DeepSeek-V3

數學直覺:標準 FFN 每個 hidden unit 是 φ(aᵀx),一個 projection 套一條曲線;gated FFN 是 φ(gᵀx) · (vᵀx),兩個 projection 相乘,近似加入二階的 feature interaction。好處是更強的條件式表達;代價是更大的動態範圍;系統上的問題是量化與 kernel 成本。

ReLU² 與 sparse LLM:為什麼 ReLU 又回來:ReLU²(x) = max(0, x)²。負值仍是 0,保留 exact sparsity;大正值平方放大,重要特徵更突出。講義的想像:一個有 10,000 個 neuron 的 FFN,7,000 個輸出 0、3,000 個啟動;如果 kernel 和記憶體排程能利用這些 0,就可能少讀權重、少算 GEMM。真正的挑戰是:零值比例不等於實際加速,還需要 structured sparsity、低 mask overhead、batch-friendly kernel。

Mobile 與量化:部署端最好的數學函數不一定最快。ReLU6 = min(max(0, x), 6) 限制 activation 範圍,INT8 的 scale 比較好配;Hard-Swish = x · ReLU6(x + 3) / 6 把 Swish 裡的 sigmoid 換成分段直線(講義說「分段線性近似」),對 mobile CPU / NPU 比較友善(PROBE A 可以選來看);GELU / SiLU 也可以用查表(LUT)、分段線性(PWL)或多項式近似 exp / erf。手機上每個 token、每個像素都要算一次 activation,這些成本會被大量放大。

怎麼選:不要問「哪個最好」,要問「用在哪裡」(講義的整理):

場景常見選擇理由
CNNReLU / SiLUReLU 快且稀疏;SiLU 常提高 accuracy
Mobile CNNReLU6 / Hard-Swish控制範圍,降低 latency 與量化難度
Transformer / ViTGELU平滑、保留弱負訊號、kernel 成熟
LLM FFNSwiGLU依輸入決定的 gating,現代 LLM 主流
Sparse LLMReLU / ReLU²製造 exact zero,利於條件式計算
RNN / gateSigmoid / Tanh有界的 gate 與有界的 state 仍然必要
Implicit representationSine / periodic直接表示高頻訊號與波動場

講義列的其他常見錯誤:只拿相同 hidden 維度的 GELU FFN 和 SwiGLU FFN 比較並不公平,SwiGLU 多一條 projection,要對齊參數量、training FLOPs 或實際時間;SELU 的 self-normalizing 依賴初始化、結構、dropout 形式和統計假設,不能隨意取代 ReLU;Sigmoid 和 Tanh 沒有被淘汰,只是不再適合當所有深層 hidden layer 的通用函數,它們仍是 gate、機率輸出、有界 state 與連續控制的核心工具。

SEC.05 / MISCONCEPTIONS

常見誤解

講義最後整理的實務選擇與常見錯誤,挑四條最容易講錯的。

越平滑的 activation 一定越好。平滑有利於梯度連續,但 ReLU 的簡單、稀疏和不飽和的正半軸仍然很有價值。平滑函數也可能增加 outlier、硬體成本,或失去 exact sparsity。
ReLU 在 0 那一點不可微,所以沒辦法訓練。只有一個點不可微,實作上直接規定那點導數是 0 就好。真正的問題是整個負半軸導數都是 0,那才是神經元會死的原因。
SiLU、GELU 永遠比 ReLU 好。結果取決於架構、normalization、initialization、optimizer、精度、任務和 latency 限制。對 mobile、sparse inference 或簡單的 CNN,ReLU 仍可能是最合理的選擇。
Activation 有很多 0,推論就會變快。硬體如果還是做 dense GEMM,0 也照樣算,不會省時間。要有結構化的稀疏 pattern、稀疏 kernel、低 mask overhead 和真的跳過權重,才會加速。