中三數學補充|學深度學習前要多懂的 7 件事
只用中三數學(直線、斜率、平方、百分比)為起點,補上 fast.ai 和 IOAI 會用到的導數、指數與對數、機率與 softmax、平均與標準差、點積、矩陣乘法。每節:已學過 → 新的一步 → 圖 → 手算 → 課程哪裡用。
中三數學補充|學深度學習前要多懂的 7 件事
- 每節都從中三已經學過的東西出發,只往前走一小步。
- 不用背公式,會手算小例子就夠。電腦會幫你算大的。
- 每節最後有手算題,答案摺起來,先自己算再點開。
- 什麼時候讀:看到右邊「課程哪裡用」那一課之前讀那一節就可以,不用一次讀完。
| # | 主題 | 中三學過的起點 | 課程哪裡用 |
|---|---|---|---|
| 1 | 函數 | y = 2x + 1 | 每一課(模型就是函數) |
| 2 | 斜率 → 導數(梯度) | 直線的斜率 | L03、L05、L13 |
| 3 | 平方、平均 → 損失函數 | 平方、平均數 | L03、L05 |
| 4 | 指數與對數 | 次方 2³ = 8 | L05、L07(sigmoid、交叉熵) |
| 5 | 機率與 softmax | 百分比、擲骰子 | L01、L07 |
| 6 | 平均與標準差 → 標準化 | 平均數 | L05、L17 |
| 7 | 點積與矩陣乘法 | 乘法、加法 | L03、L05、L11 |
1|函數:模型就是一個函數
| 中三學過 | 新的一步 |
|---|---|
| y = 2x + 1:給 x,算出 y | 模型也是一樣:給一張圖片(很多個數字),算出**「是鳥的機率」** |
| 2 和 1 是固定的 | 模型裡的數字(權重)一開始是亂的,訓練=自動調這些數字,讓答案越來越準 |
y = 2x + 1 ← 中三的函數:2 和 1 是我們給的
預測 = w × 輸入 + b ← 最簡單的模型:w 和 b 由電腦自己找
模型是 預測 = w × 小時 + b。w = 5、b = 40,溫習 6 小時,預測幾分?
答案
5 × 6 + 40 = 70 分。訓練就是用很多同學的「小時 → 真實分數」,自動找出最好的 w 和 b。
2|斜率 → 導數(梯度)
| 中三學過 | 新的一步 |
|---|---|
| 直線每一處的斜率都一樣:向右 1 格,向上幾格 | 曲線每一點的斜率都不同,「某一點的斜率」叫導數,深度學習叫梯度 |
| y = x² 在 x 這一點的斜率 = 2x(記這一條就夠用) |
為什麼重要:梯度告訴我們「往哪邊走,損失會變小」。
| 斜率 | 意思 | 要怎麼走 |
|---|---|---|
| 正數 | 往右會上坡 | 往左走(x 變小) |
| 負數 | 往右會下坡 | 往右走(x 變大) |
| 0 | 平地,到谷底了 | 停 |
這就是梯度下降:新的 x = x − 學習率 × 斜率。
損失 = x²。現在 x = 3,學習率 = 0.1。
-
這一點的斜率是多少?
-
走一步之後 x 變成多少?
答案
- 斜率 = 2 × 3 = 6(正數,往右上坡,所以要往左走)
- 新的 x = 3 − 0.1 × 6 = 2.4,更靠近谷底 0 了
L03 Jeremy 用 Excel 和 PyTorch 示範的就是這件事。PyTorch 的 loss.backward() 會自動幫你算斜率。
3|平方、平均 → 損失函數
| 中三學過 | 新的一步 |
|---|---|
| 平方:(−2)² = 4 | 誤差=預測 − 答案。平方後負數也變正數,而且大錯罰得更重 |
| 平均數 | 把所有誤差平方再平均,就是 MSE(均方誤差),最常用的損失 |
| 同學 | 預測 | 真實 | 誤差 | 誤差² | |誤差| |
|---|---|---|---|---|---|
| 甲 | 3 | 2 | 1 | 1 | 1 |
| 乙 | 5 | 5 | 0 | 0 | 0 |
| 丙 | 8 | 10 | −2 | 4 | 2 |
| 平均 | MSE = 5 ÷ 3 ≈ 1.67 | MAE = 3 ÷ 3 = 1 |
預測 [4, 6],真實 [2, 6]。MSE 和 MAE 各是多少?
答案
誤差 [2, 0];MSE = (4 + 0) ÷ 2 = 2;MAE = (2 + 0) ÷ 2 = 1
4|指數與對數
| 中三學過 | 新的一步 |
|---|---|
| 2³ = 8(次方) | 指數 eˣ:e ≈ 2.718 的 x 次方,永遠是正數 |
| 「2 的幾次方是 8?」→ 3 | 這個問題就是對數:log₂8 = 3。課程的 log 用 e 當底 |
深度學習最常用的三個:
| 名字 | 公式 | 做什麼 | 例子 |
|---|---|---|---|
| sigmoid | 1 ÷ (1 + e⁻ˣ) | 把任何數字壓到 0 到 1 → 當機率 | sigmoid(0) = 0.5;sigmoid(2) ≈ 0.88 |
| 交叉熵 | −log(正確答案的機率) | 分類的損失 | 有把握答對 p = 0.9 → 0.11(罰很少);答錯 p = 0.1 → 2.30(罰很多) |
| log 轉換 | log(1 + x) | 把很大的數字縮小 | 票價 7、71、512 → 2.1、4.3、6.2(L05 鐵達尼號) |
-
log₁₀1000 = ?
-
模型給正確答案的機率是 1(百分百確定而且對),交叉熵是多少?
答案
- 10 的 3 次方是 1000,所以是 3
- −log(1) = 0:完全答對,不用罰
5|機率與 softmax
| 中三學過 | 新的一步 |
|---|---|
| 機率在 0 到 1 之間,所有可能加起來 = 1 | 模型最後輸出的是分數(可以是負數、可以很大),要變成機率 |
| softmax:每個分數取 eˣ,再除以總和 |
| 類別 | 分數 | eˣ | 機率 |
|---|---|---|---|
| 貓 | 2.0 | 7.39 | 7.39 ÷ 11.21 = 0.66 |
| 狗 | 1.0 | 2.72 | 0.24 |
| 鳥 | 0.1 | 1.11 | 0.10 |
| 總和 | 11.21 | 1.00 |
兩個類別的分數都是 3,softmax 之後各是多少?
答案
兩個 eˣ 一樣大,所以各 0.5。分數一樣=模型完全猜不出來
6|平均與標準差 → 標準化
| 中三學過 | 新的一步 |
|---|---|
| 平均數 | 標準差:每個數字離平均「平均有多遠」。越大越分散 |
| 標準化:(x − 平均) ÷ 標準差。變成「比平均高幾個標準差」 |
為什麼要標準化:身高 160(公分)和體重 50(公斤)單位不同,數字大小差很多,模型會以為身高比較重要。標準化後兩欄都在 −3 到 3 附近,公平比較。L05、K-NN、SVM 都要先做。
| 步驟 | 數字 [2, 4, 4, 4, 5, 5, 7, 9] |
|---|---|
| 平均 | 40 ÷ 8 = 5 |
| 每個減平均再平方 | 9, 1, 1, 1, 0, 0, 4, 16 |
| 平方的平均 | 32 ÷ 8 = 4 |
| 標準差 | √4 = 2 |
| 9 標準化 | (9 − 5) ÷ 2 = 2(比平均高 2 個標準差) |
全班平均 60 分、標準差 10。小明 75 分,標準化後是多少?
答案
(75 − 60) ÷ 10 = 1.5
7|點積與矩陣乘法
| 中三學過 | 新的一步 |
|---|---|
| 乘法、加法 | 點積:兩排數字,對應位置相乘,再全部加起來 |
| 矩陣乘法:很多個點積一次做完 |
點積:[1, 2, 3] · [4, 5, 6] = 1×4 + 2×5 + 3×6 = 32
生活例子:買 2 個蘋果(每個 5 元)、3 個橙(每個 4 元)→ [2, 3] · [5, 4] = 10 + 12 = 22 元。模型做的就是「輸入 · 權重」。
| 規則 | 說明 |
|---|---|
| 怎麼算 | 結果第 i 橫排、第 j 直排 = A 的第 i 橫排 · B 的第 j 直排 |
| 能不能乘 | A 的直排數要等於 B 的橫排數(上圖 3 = 3) |
| 結果大小 | (A 的橫排數)×(B 的直排數) |
| Python | A @ B |
[[1, 2], [3, 4]] @ [[5, 6], [7, 8]] = ?(每個 [ ] 是一個橫排)
答案
- 左上:1×5 + 2×7 = 19;右上:1×6 + 2×8 = 22
- 左下:3×5 + 4×7 = 43;右下:3×6 + 4×8 = 50
- 答案
[[19, 22], [43, 50]]
L03 用 Excel 做矩陣乘法;L11 整課都在教怎麼讓電腦算得快。
用程式檢查你的手算
💻 跟著做(貼進 Kaggle 一格執行)
import numpy as np
print(3 - 0.1 * (2 * 3)) # 梯度下降一步 → 2.4
p, y = np.array([3, 5, 8]), np.array([2, 5, 10])
print(((p - y) ** 2).mean().round(2), abs(p - y).mean()) # MSE、MAE → 1.67 1.0
print(round(1 / (1 + np.exp(-2)), 2)) # sigmoid(2) → 0.88
print(round(-np.log(0.9), 2), round(-np.log(0.1), 2)) # 交叉熵 → 0.11 2.3
z = np.array([2.0, 1.0, 0.1])
print((np.exp(z) / np.exp(z).sum()).round(2)) # softmax → [0.66 0.24 0.1 ]
x = np.array([2, 4, 4, 4, 5, 5, 7, 9])
print(x.mean(), x.std(), (9 - x.mean()) / x.std()) # 平均、標準差、標準化 → 5.0 2.0 2.0
print(np.dot([1, 2, 3], [4, 5, 6])) # 點積 → 32
print(np.array([[1, 2], [3, 4]]) @ np.array([[5, 6], [7, 8]])) # → [[19 22] [43 50]]
自我檢核
- 能說出「模型就是一個有權重的函數」
- 能算 y = x² 在某一點的斜率,並走一步梯度下降
- 能手算一小組資料的 MSE
- 知道 sigmoid 輸出在 0 到 1,交叉熵答錯罰很重
- 能把三個分數用 softmax 變成機率
- 能把一個分數標準化
- 能手算 2×2 矩陣乘法