S 形(sigmoid)激活函數
Sigmoid(邏輯斯, logistic)函數把任意實數壓進開區間 (0, 1),畫出平滑的 S 形曲線:sigma(z) = 1/(1 + e^-z)。很大的正 z 映到接近 1、很大的負 z 接近 0,而 z=0 恰好映到 0.5。由於輸出看起來像機率,當你想讓神經元表達「這有多可能」時 sigmoid 是自然選擇,例如某像素屬於前景的機率,或某影像含有貓的機率(一個是非題)。
Sigmoid 有個優雅的導數 sigma'(z) = sigma(z)·(1 - sigma(z)),很方便,因為前向輸出本身就給了你梯度。它是單調、平滑的,輸出以 0.5 為中心。它的近親 tanh(z) = 2·sigma(2z) - 1 映到 (-1, 1) 且以零為中心,歷史上作為隱藏層激活訓練起來略好一些。
Sigmoid 的根本缺陷把整個領域推向 ReLU。看 sigma':它的峰值僅 0.25(在 z=0 處),且只要 z 的絕對值一大就衰減到近乎 0;此時神經元飽和、被釘在 0 或 1 附近,梯度消失。在深層網路中,反向傳播會把許多這種小因子相乘,於是傳到前層的梯度指數般趨近於零,那些層幾乎學不到東西。這個梯度消失問題使 2010 年前的深層網路出了名地難訓練,也是隱藏層改用 ReLU 的核心原因。此外 sigmoid 的輸出非以零為中心,會使梯度更新帶有偏向。
Sigmoid 遠未過時,只是換了崗位。它是二元分類的正確輸出激活,也適用於每個類別各自是非的多標籤問題(例如物件偵測器問 80 個類別各自是否出現),各自搭配二元交叉熵。它還出現在閘控機制裡(LSTM 與 GRU 的閘、CNN 的 squeeze-and-excitation 區塊、注意力閘),正是因為其 (0,1) 範圍能當作一個柔性開關。教訓是:在需要有界、類機率值的地方用 sigmoid,而非把它當作通用的隱藏層非線性。
數值陷阱:直接計算 1/(1+e^-z) 在 z 為很大的負數時會溢位。請使用數值穩定的寫法,並偏好把 sigmoid 與二元交叉熵合併的損失(BCEWithLogits),而非先做 sigmoid 再單獨取對數,後者不穩定。