Skip to content

從零理解神經網路(二):為什麼激活函數如此重要?

本文是「從零理解神經網路」系列的第二篇。上一篇我們認識了神經元,這篇要回答一個關鍵問題:為什麼神經網路需要「激活函數」?

一個令人驚訝的事實

先說結論:如果沒有激活函數,不管你的神經網路有多少層,它都等價於一個單層網路。

這不是誇張,這是數學事實。讓我們來證明它。

沒有激活函數會怎樣?

假設我們有一個三層的神經網路,每層都只做線性運算(沒有激活函數):

輸入 x

第一層:y₁ = W₁ × x + b₁

第二層:y₂ = W₂ × y₁ + b₂

第三層:y₃ = W₃ × y₂ + b₃

輸出 y₃

現在讓我們把它展開:

y₃ = W₃ × y₂ + b₃
   = W₃ × (W₂ × y₁ + b₂) + b₃
   = W₃ × (W₂ × (W₁ × x + b₁) + b₂) + b₃
   = W₃ × W₂ × W₁ × x + W₃ × W₂ × b₁ + W₃ × b₂ + b₃
   = (W₃ × W₂ × W₁) × x + (W₃ × W₂ × b₁ + W₃ × b₂ + b₃)
   = W' × x + b'

看到了嗎?三層網路最終變成了 W' × x + b'——這就是一個單層線性網路!

三層等於一層。一百層也等於一層。

這就像你把三片透明玻璃疊在一起,光線穿過去還是直線。不管疊多少片,都無法讓光線彎曲。

激活函數的作用:引入非線性

激活函數在每層運算後加入「非線性轉換」:

輸入 x

第一層:y₁ = 激活函數(W₁ × x + b₁)   ← 彎曲!

第二層:y₂ = 激活函數(W₂ × y₁ + b₂)  ← 再彎曲!

第三層:y₃ = W₃ × y₂ + b₃

輸出 y₃

這時候,數學展開就不能簡化了——因為激活函數「打斷」了線性組合。

每一層的非線性轉換,讓網路能學習越來越複雜的模式。

直觀理解:XOR 問題

讓我們用一個經典例子來說明為什麼需要非線性。這個例子在深度學習歷史上非常重要——它曾經讓整個 AI 領域停滯了十年。

什麼是 XOR?

XOR(Exclusive OR,互斥或) 是一種邏輯運算,中文叫「異或」。

它的規則很簡單:兩個輸入「不同」時輸出 1,「相同」時輸出 0。

用白話說:

  • 「你和我不一樣」→ True(1)
  • 「你和我一樣」→ False(0)

XOR 的真值表

x₁x₂XOR 結果解釋
000兩個都是 0,相同 → 輸出 0
011一個 0 一個 1,不同 → 輸出 1
101一個 1 一個 0,不同 → 輸出 1
110兩個都是 1,相同 → 輸出 0

與 AND、OR 的比較

讓我們比較三種邏輯運算:

x₁x₂AND(且)OR(或)XOR(異或)
00000
01011
10011
11110
  • AND:兩個都是 1 才輸出 1(「我你都要同意」)
  • OR:只要有一個是 1 就輸出 1(「我你同意就行」)
  • XOR:恰好一個是 1 才輸出 1(「只能有一個人同意」)

生活中的 XOR 例子

1. 電燈開關(雙切開關)

你家樓梯可能有兩個開關控制同一盞燈:

  • 兩個開關都朝上 → 燈滅
  • 兩個開關都朝下 → 燈滅
  • 一上一下 → 燈亮

這就是 XOR!

2. 選擇題:「以下哪個是對的?」

如果答案是「A 或 B,但不能兩個都選」,這就是 XOR 邏輯。

3. 密碼學中的加密

XOR 在加密中很常用,因為它有一個神奇的性質:

A XOR B XOR B = A

加密:明文 XOR 密鑰 = 密文
解密:密文 XOR 密鑰 = 明文

為什麼 XOR 對神經網路很重要?

現在,讓我們把 XOR 的四個情況畫在二維平面上:

    x₂

  1 ┤  ●(0,1)=1      ○(1,1)=0


  0 ┤  ○(0,0)=0      ●(1,0)=1
    └──────────────────────→ x₁
       0             1
  • ● 代表輸出 1(不同)
  • ○ 代表輸出 0(相同)

問題來了:你能用一條直線把 ● 和 ○ 分開嗎?

試試看:

嘗試 1:水平線          嘗試 2:垂直線          嘗試 3:斜線
    ●     ○                 ●  │  ○                 ●     ○
   ─────────                   │                      ╲
    ○     ●                 ○  │  ●                 ○   ╲ ●
    
❌ 上面有 ●○            ❌ 左邊有 ●○            ❌ 還是分不開
   下面有 ○●               右邊有 ○●

無論你怎麼畫,一條直線都無法把 ● 和 ○ 分開!

這就是「線性不可分」——單個神經元(本質上是畫一條直線)無法解決 XOR 問題。

歷史插曲:AI 的第一次寒冬

1969 年,Marvin Minsky 和 Seymour Papert 在《Perceptrons》一書中證明了單層感知器無法解決 XOR 問題。

這個發現導致了 AI 研究經費大幅縮減,開啟了所謂的「AI 寒冬」。

直到 1980 年代,人們發現多層網路 + 非線性激活函數可以解決 XOR,AI 研究才復甦。

多層網路如何解決 XOR?

關鍵是:用兩條直線組合出一個區域

第一層神經元畫兩條線:

    線 A              線 B              組合起來
    ●     ○          ●     ○           ●  ╲  ○
      ╲                    ╱               ╲╱
    ○   ╲ ●          ○ ╱   ●           ○ ╱╲ ●
                                         ╱  ╲
                                       只有中間
                                       區域是「不同」
  • 神經元 A:判斷「x₁ + x₂ > 0.5」(排除左下角)
  • 神經元 B:判斷「x₁ + x₂ < 1.5」(排除右上角)
  • 輸出神經元:A AND B = 中間區域 = XOR 的答案

這就是為什麼我們需要:

  1. 多層網路:組合多個簡單邊界
  2. 非線性激活函數:讓每層的組合不會「塌縮」回單層

先搞懂幾個名詞

在介紹各種激活函數之前,先解釋幾個你會一直看到的術語。

神經網路的結構

一個神經網路通常長這樣:

輸入層        隱藏層         輸出層
(你的資料)   (中間處理)     (最終答案)

  ○            ○              
  ○ ──────→   ○ ○ ──────→    ○
  ○            ○

輸入層:接收原始資料(例如:圖片的像素、房屋的坪數)

隱藏層:中間的「思考」層,可以有很多層。叫「隱藏」是因為我們看不到它在想什麼,只看得到輸入和輸出。

輸出層:給出最終答案


神經網路最常做的三種任務

1. 二分類(Binary Classification)

問題:是 A 還是 B?只有兩個選項。

例子

  • 這封信是不是垃圾郵件?(是 / 否)
  • 這張圖是不是貓?(是 / 否)
  • 這筆交易是不是詐騙?(是 / 否)

輸出:一個數字,介於 0~1 之間,代表「是」的機率

  • 0.9 → 90% 機率是垃圾郵件
  • 0.2 → 20% 機率是垃圾郵件(80% 機率不是)

輸出層用 Sigmoid(把任何數字壓到 0~1)


2. 多分類(Multi-class Classification)

問題:是 A、B、C 還是 D?有多個選項,只能選一個。

例子

  • 這張圖是貓、狗、還是鳥?(三選一)
  • 這個手寫數字是 0~9 哪一個?(十選一)
  • 這篇文章是政治、體育、娛樂還是科技?(四選一)

輸出:多個數字,加起來等於 1,代表每個選項的機率

貓:0.7(70%)
狗:0.2(20%)
鳥:0.1(10%)
─────────
總和:1.0

輸出層用 Softmax(讓多個輸出加起來等於 1)


3. 迴歸(Regression)

問題:預測一個「連續的數值」,不是選選項。

例子

  • 這間房子值多少錢?(500 萬、823 萬、任何數字都可能)
  • 明天的氣溫是幾度?(18.5 度、32.7 度)
  • 這個顧客會花多少錢?

輸出:一個數字,沒有範圍限制

輸出層不加激活函數(直接輸出原始數值)


RNN / LSTM 是什麼?

RNN(Recurrent Neural Network,循環神經網路) 是專門處理「有順序」資料的網路。

什麼是有順序的資料?

  • 文字:「我 愛 台 灣」(字的順序很重要)
  • 語音:聲音訊號隨時間變化
  • 股價:每天的價格,有先後順序

普通神經網路一次看完所有輸入,但 RNN 會一步一步處理,而且會「記住」前面看過的東西:

普通神經網路:
[我, 愛, 台, 灣] ──→ 一次處理 ──→ 輸出

RNN:
「我」──→ 處理 ──→ 記住

「愛」──→ 處理 ──→ 記住更多

「台」──→ 處理 ──→ 繼續累積

「灣」──→ 處理 ──→ 輸出

LSTM(Long Short-Term Memory) 是 RNN 的改良版,能「記更久」。

這和激活函數有什麼關係? RNN/LSTM 內部需要用 Tanh,這是它的設計需求。你現在只要知道「RNN/LSTM 會用到 Tanh」就好。


快速對照表

術語白話解釋
隱藏層中間的「思考」層,不是輸入也不是輸出
輸出層最後給答案的那一層
二分類是或不是?(兩個選項)
多分類是 A/B/C 哪一個?(多個選項)
迴歸數值是多少?(預測數字)
RNN/LSTM處理「有順序」資料的特殊網路

常見激活函數介紹

先別被數學公式嚇到!我們用「人」來比喻每種激活函數的個性。

1. ReLU:「正面積極,負面躺平」

個性:只對正面訊息有反應,負面訊息一律當作沒聽到。

輸入 → ReLU → 輸出

  5  →  5   (正的,原樣輸出)
  3  →  3   (正的,原樣輸出)
 -2  →  0   (負的,當作零)
-10  →  0   (負的,當作零)

白話公式

如果輸入 > 0:輸出 = 輸入
如果輸入 ≤ 0:輸出 = 0

圖形長這樣

輸出

  │      ╱
  │    ╱
  │  ╱
──┼───────→ 輸入

  │(負的部分都貼在 0)

為什麼好用

  • ✅ 超級簡單,計算超快
  • ✅ 正的區域梯度是 1,不會消失
  • ❌ 問題:如果某個神經元的輸入一直是負的,它就「死」了(永遠輸出 0,永遠學不動)

什麼時候用:隱藏層的首選,90% 的情況都先試它


2. Sigmoid:「什麼都壓縮到 0~1 之間」

個性:不管你給我多大或多小的數字,我都幫你轉換成 0 到 1 之間的「信心程度」。

輸入 → Sigmoid → 輸出

 -10  →  0.00005  (非常負 → 接近 0)
  -2  →  0.12     (有點負 → 偏向 0)
   0  →  0.50     (剛好中間)
   2  →  0.88     (有點正 → 偏向 1)
  10  →  0.99995  (非常正 → 接近 1)

圖形長這樣

輸出
1 ┤         ────────
  │       ╱
  │     ╱
0.5┤────╱
  │   ╱
  │ ╱
0 ┤────────
  └─────────────→ 輸入
    -∞    0    +∞

像一個 S 形,把任何數字「壓扁」到 0~1 之間。

為什麼好用

  • ✅ 輸出可以解讀成「機率」或「信心程度」
  • ✅ 平滑的曲線,到處都能算導數
  • ❌ 問題:當輸入太大或太小時,曲線幾乎是平的(梯度接近 0),學習會變很慢

什麼時候用:二分類問題的最後一層(輸出「是這個類別的機率」)


3. Tanh:「壓縮到 -1~1 之間」

個性:和 Sigmoid 很像,但輸出範圍是 -1 到 1,中心點在 0。

輸入 → Tanh → 輸出

 -10  →  -1.0     (非常負 → 接近 -1)
  -2  →  -0.96    (有點負 → 偏向 -1)
   0  →   0       (剛好中間)
   2  →   0.96    (有點正 → 偏向 +1)
  10  →   1.0     (非常正 → 接近 +1)

圖形長這樣

輸出
+1 ┤         ────────
   │       ╱
 0 ┤──────╱──────────
   │    ╱
-1 ┤────
   └─────────────→ 輸入
     -∞    0    +∞

和 Sigmoid 的差別

  • Sigmoid:0 到 1(全部是正的)
  • Tanh:-1 到 1(有正有負,中心在 0)

為什麼好用

  • ✅ 輸出以 0 為中心,對下一層比較友善
  • ✅ 梯度比 Sigmoid 大一點
  • ❌ 問題:極端值時還是會有梯度消失

什麼時候用:RNN、LSTM 等序列模型


4. Leaky ReLU:「負面也給一點反應」

個性:對正面訊息全力反應,對負面訊息給一點點小反應(不完全躺平)。

輸入 → Leaky ReLU → 輸出

  5  →  5      (正的,原樣輸出)
  3  →  3      (正的,原樣輸出)
 -2  → -0.02   (負的,乘上 0.01)
-10  → -0.1    (負的,乘上 0.01)

白話公式

如果輸入 > 0:輸出 = 輸入
如果輸入 ≤ 0:輸出 = 0.01 × 輸入(給 1% 的反應)

圖形長這樣

輸出

  │      ╱
  │    ╱
  │  ╱
──┼───────→ 輸入
 ╱│
(負的部分有一點點斜率)

為什麼好用

  • ✅ 解決 ReLU 的「神經元死亡」問題
  • ✅ 計算還是很快

什麼時候用:當你用 ReLU 發現很多神經元都「死」了,就換這個試試


總結比較

激活函數一句話形容輸出範圍最適合用在
ReLU正面積極,負面歸零[0, +∞)隱藏層(首選)
Sigmoid壓成 0~1 的信心值(0, 1)二分類輸出層
Tanh壓成 -1~1,中心在 0(-1, 1)RNN/LSTM
Leaky ReLU負面也給 1% 反應(-∞, +∞)ReLU 不夠好時

記憶口訣

  • 隱藏層 → 先試 ReLU
  • 二分類輸出 → 用 Sigmoid
  • 序列模型 → 用 Tanh
  • ReLU 壞掉 → 換 Leaky ReLU

激活函數的導數:為什麼重要?

在訓練神經網路時,我們需要計算每個激活函數的「導數」(梯度),因為反向傳播需要用到。

激活函數導數
ReLU1 if x > 0 else 0
Sigmoidσ(x) × (1 - σ(x))
Tanh1 - tanh²(x)

梯度消失問題

Sigmoid 的導數最大值只有 0.25(在 x=0 處)。這意味著每經過一層,梯度最多保留原來的 1/4。

如果有 10 層網路,梯度會變成原來的 (1/4)^10 ≈ 0.000001。

梯度太小,網路就學不動了——這就是「梯度消失」。

ReLU 的導數是 0 或 1,所以不會有這個問題(但會有 Dead ReLU 問題)。

互動視覺化

我製作了一個互動工具,讓你可以:

  • 比較不同激活函數的形狀
  • 觀察導數(梯度)的變化
  • 調整輸入值,看輸出如何變化

👉 激活函數互動視覺化

建議你實際操作,感受:

  1. ReLU 在 x < 0 時梯度為 0(Dead ReLU)
  2. Sigmoid 在極端值時梯度接近 0(梯度消失)
  3. 不同激活函數的輸出範圍差異

小結

今天我們學到了:

  1. 沒有激活函數,多層網路等於單層——這是數學事實
  2. 激活函數引入非線性,讓網路能學習複雜模式
  3. XOR 問題展示了為什麼線性模型有局限
  4. 常見激活函數:ReLU(隱藏層首選)、Sigmoid(二分類輸出)、Tanh(RNN)
  5. 梯度消失問題:Sigmoid/Tanh 的導數太小,ReLU 緩解了這個問題
  6. 選擇原則:隱藏層用 ReLU,輸出層根據任務選擇

下一篇預告

現在我們知道神經元如何運算、為什麼需要激活函數。但還有一個關鍵問題:

神經網路的權重是怎麼學出來的?

下一篇我們會介紹梯度下降——神經網路學習的核心算法。我們會用 3D 視覺化來展示,什麼是「順著斜坡往下走,找到谷底」。


本文是「從零理解神經網路」系列的第二篇。如果你覺得有幫助,歡迎分享給也在學習 ML 的朋友。

MIT Licensed