Appearance
從零理解神經網路(二):為什麼激活函數如此重要?
本文是「從零理解神經網路」系列的第二篇。上一篇我們認識了神經元,這篇要回答一個關鍵問題:為什麼神經網路需要「激活函數」?
一個令人驚訝的事實
先說結論:如果沒有激活函數,不管你的神經網路有多少層,它都等價於一個單層網路。
這不是誇張,這是數學事實。讓我們來證明它。
沒有激活函數會怎樣?
假設我們有一個三層的神經網路,每層都只做線性運算(沒有激活函數):
輸入 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 結果 | 解釋 |
|---|---|---|---|
| 0 | 0 | 0 | 兩個都是 0,相同 → 輸出 0 |
| 0 | 1 | 1 | 一個 0 一個 1,不同 → 輸出 1 |
| 1 | 0 | 1 | 一個 1 一個 0,不同 → 輸出 1 |
| 1 | 1 | 0 | 兩個都是 1,相同 → 輸出 0 |
與 AND、OR 的比較
讓我們比較三種邏輯運算:
| x₁ | x₂ | AND(且) | OR(或) | XOR(異或) |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
- 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. 二分類(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
激活函數的導數:為什麼重要?
在訓練神經網路時,我們需要計算每個激活函數的「導數」(梯度),因為反向傳播需要用到。
| 激活函數 | 導數 |
|---|---|
| ReLU | 1 if x > 0 else 0 |
| Sigmoid | σ(x) × (1 - σ(x)) |
| Tanh | 1 - tanh²(x) |
梯度消失問題:
Sigmoid 的導數最大值只有 0.25(在 x=0 處)。這意味著每經過一層,梯度最多保留原來的 1/4。
如果有 10 層網路,梯度會變成原來的 (1/4)^10 ≈ 0.000001。
梯度太小,網路就學不動了——這就是「梯度消失」。
ReLU 的導數是 0 或 1,所以不會有這個問題(但會有 Dead ReLU 問題)。
互動視覺化
我製作了一個互動工具,讓你可以:
- 比較不同激活函數的形狀
- 觀察導數(梯度)的變化
- 調整輸入值,看輸出如何變化
建議你實際操作,感受:
- ReLU 在 x < 0 時梯度為 0(Dead ReLU)
- Sigmoid 在極端值時梯度接近 0(梯度消失)
- 不同激活函數的輸出範圍差異
小結
今天我們學到了:
- 沒有激活函數,多層網路等於單層——這是數學事實
- 激活函數引入非線性,讓網路能學習複雜模式
- XOR 問題展示了為什麼線性模型有局限
- 常見激活函數:ReLU(隱藏層首選)、Sigmoid(二分類輸出)、Tanh(RNN)
- 梯度消失問題:Sigmoid/Tanh 的導數太小,ReLU 緩解了這個問題
- 選擇原則:隱藏層用 ReLU,輸出層根據任務選擇
下一篇預告
現在我們知道神經元如何運算、為什麼需要激活函數。但還有一個關鍵問題:
神經網路的權重是怎麼學出來的?
下一篇我們會介紹梯度下降——神經網路學習的核心算法。我們會用 3D 視覺化來展示,什麼是「順著斜坡往下走,找到谷底」。
本文是「從零理解神經網路」系列的第二篇。如果你覺得有幫助,歡迎分享給也在學習 ML 的朋友。