大多數工程師:「我會呼叫
model.fit(),數學交給論文作者就好。」 資深 AI 工程師:「我需要知道梯度為什麼爆炸、Loss 為什麼不收斂、為什麼換個 optimizer 差了 3 倍速度。」 前者能跑範例,後者能解問題。 數學不是門檻,是你除錯和優化的第一把鑰匙。
面試情境
你正在為一個推薦系統訓練 Embedding 模型。訓練第 5 個 epoch 後 loss 突然從 0.8 跳到
NaN,GPU 使用率正常、資料沒問題。請問你會從哪些數學角度切入診斷?你會如何用線性代數和微積分的知識判斷根本原因並修復?
一、核心問題:為什麼 AI 工程師必須懂數學
很多人進入 AI 領域的第一印象是:「PyTorch / TensorFlow 已經幫你做好了,直接呼叫 API 就好。」這個觀點在 demo 階段是對的,但在 production 階段會讓你的除錯能力幾乎為零。
現實場景中會遇到的問題:
- Loss 收斂到一個局部最小值,但業務指標沒有改善 → 你需要理解 Loss landscape 的幾何形狀
- Gradient Explosion:第 N epoch 後 loss 變成
NaN→ 你需要理解梯度的數值行為 - 模型推論速度比預期慢 10 倍 → 你需要理解矩陣運算的複雜度與硬體加速原理
- 換了一個 optimizer 後訓練曲線震盪變大 → 你需要理解各 optimizer 的動量機制
- 加了 L2 regularization 後模型卻更 overfit → 你需要理解正則化的數學含義
這些問題沒有辦法靠 Stack Overflow 直接解決,因為症狀背後的原因需要數學直覺才能定位。
本篇覆蓋的數學範疇:
| 數學領域 | 在 AI 中的對應概念 | 實際影響 |
|---|---|---|
| 線性代數 | 向量空間、矩陣乘法、特徵值 | 模型參數表示、前向傳播效率 |
| 微積分 | 偏微分、鏈式法則 | 反向傳播、梯度計算 |
| 向量微積分 | 梯度、Jacobian、Hessian | Optimizer 設計、收斂分析 |
| 數值方法 | 浮點精度、數值穩定性 | 避免 NaN、overflow 問題 |
二、三個演進階段:數學知識如何隨工程深度演進
AI 工程師的數學需求不是一次性的,而是隨著工程深度遞增的。以下三個階段對應不同的業務規模與工程挑戰。
Phase 1(POC / < 10K 筆訓練資料)
┌─────────────────────────────────────────────────────────┐
│ Phase 1:POC 階段 │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 黑盒呼叫 │───▶│ 觀察 Loss │ │
│ │ model.fit() │ │ 曲線 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ 數學需求: │
│ • 向量 / 矩陣基本運算概念 │
│ • 理解 Loss function 的輸出含義 │
│ • 知道 learning rate 是什麼 │
│ │
│ 可接受的捷徑: │
│ • 直接用預設 Adam optimizer │
│ • 不需手寫反向傳播 │
│ • Loss = CrossEntropy 直接套用 │
└─────────────────────────────────────────────────────────┘
新增組件: 基礎 API 呼叫、預設超參數 問題: 無法解釋訓練失敗的原因、無法針對性優化
Phase 2(MVP / 10K–200K 筆資料,< 1M 參數)
┌─────────────────────────────────────────────────────────┐
│ Phase 2:MVP 階段 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ 資料前處理 │───▶│ 模型架構 │───▶│ 梯度監控 │ │
│ │ 標準化/歸一 │ │ 調整 │ │ Clip/Log │ │
│ └──────────────┘ └──────────────┘ └───────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 超參數搜尋 │ │
│ │ LR / Batch │ │
│ └──────────────┘ │
│ │
│ 數學需求: │
│ • 理解矩陣乘法複雜度與 batch size 的關係 │
│ • 能讀懂梯度範數 (gradient norm) 曲線 │
│ • 理解 momentum 與 adaptive LR 的差異 │
│ • 知道 L1/L2 regularization 的幾何含義 │
└─────────────────────────────────────────────────────────┘
新增組件: 梯度裁剪、學習率調度、正則化 問題: 大規模分散訓練的數值穩定性、混合精度計算
Phase 3(Scale / 200K+ 筆資料,100M+ 參數)
┌─────────────────────────────────────────────────────────┐
│ Phase 3:Scale 階段 │
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ FP16/ │ │ 梯度累積 │ │ 分散式 │ │
│ │ BF16 │ │ 策略 │ │ AllReduce│ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ └───────────────┼───────────────┘ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ 數值穩定性保證 │ │
│ │ Loss Scaling │ │
│ │ Gradient Norm │ │
│ └──────────────────┘ │
│ │
│ 數學需求: │
│ • 理解浮點數精度對梯度計算的影響 │
│ • 能分析 Hessian 矩陣與 loss landscape 的關係 │
│ • 理解 ZeRO optimizer 背後的數學分解 │
│ • 能推導自訂 Loss function 的梯度公式 │
└─────────────────────────────────────────────────────────┘
新增組件: 混合精度訓練、梯度累積、Loss Scaling 成本/複雜度 delta: 計算成本降低 30–50%(FP16 vs FP32),但除錯複雜度提升 3 倍
三、線性代數核心:向量、矩陣、張量
3.1 向量(Vector)— AI 中最基本的資料單位
在 AI 中,幾乎所有東西都是向量。一張 28×28 的 MNIST 圖片被展平後是一個 784 維向量;一個詞的 Embedding 是 768 維向量;一個用戶的行為特徵是 N 維向量。
向量的直覺: 方向 + 大小。
向量 v = [3, 4]
│
4 │ ▶ v (方向:右上)
│ ╱
3 │ ╱
│ ╱ 長度 = √(3² + 4²) = 5
2 │ ╱
│╱
0─────┼──────────▶
0 1 2 3
核心操作:
| 操作 | 數學表示 | AI 用途 | 複雜度 |
|---|---|---|---|
| 點積 (Dot Product) | a · b = Σ aᵢbᵢ | 相似度計算、注意力分數 | O(n) |
| 向量加法 | a + b | Embedding 疊加 | O(n) |
| 範數 (Norm) | ‖v‖ = √(Σ vᵢ²) | 梯度大小、正則化 | O(n) |
| 餘弦相似度 | cos θ = (a·b)/(‖a‖‖b‖) | 語意相似度 | O(n) |
工程實例: Transformer 中的 Attention Score 計算就是向量點積:
1# Q, K 各是 (seq_len, d_k) 的矩陣
2# 每個 token 的 query 向量和所有 key 向量做點積
3attention_scores = Q @ K.T / math.sqrt(d_k) # (seq_len, seq_len)
3.2 矩陣(Matrix)— 線性變換的語言
矩陣的幾何直覺:對向量施加線性變換。旋轉、縮放、投影,都是矩陣操作。
神經網路的每一層本質上是:
輸出 = 激活函數( W × 輸入 + b )
其中 W 是權重矩陣,這個矩陣乘法將輸入空間線性變換到另一個空間。
重要矩陣性質:
| 性質 | 定義 | AI 意義 |
|---|---|---|
| 轉置 (Transpose) | (Aᵀ)ᵢⱼ = Aⱼᵢ | 前向/反向傳播的對稱性 |
| 行列式 (Determinant) | det(A) | 空間體積縮放比例,= 0 表示奇異矩陣 |
| 特徵值/特徵向量 | Av = λv | PCA 降維、穩定性分析 |
| 秩 (Rank) | 線性獨立行/列數 | 模型表達能力的理論上限 |
| 逆矩陣 | A⁻¹A = I | 解線性方程組 |
3.3 張量(Tensor)— 深度學習的真實資料結構
張量是矩陣的高維延伸:
純量 (0 維): 42
向量 (1 維): [1, 2, 3] shape: (3,)
矩陣 (2 維): [[1,2],[3,4]] shape: (2, 2)
3D 張量: 一批灰階圖片 shape: (batch, H, W)
4D 張量: 一批 RGB 圖片 shape: (batch, C, H, W)
5D 張量: 一批影片幀 shape: (batch, T, C, H, W)
工程關鍵: 理解 shape 是 AI 工程師最基本的除錯能力。shape mismatch 是 90% 初學者錯誤的根源。
1# 典型的 shape 錯誤
2x = torch.randn(32, 128) # (batch=32, features=128)
3W = torch.randn(256, 128) # (out=256, in=128)
4y = x @ W # 錯誤!需要 W.T 或調整 shape
5y = x @ W.T # 正確:(32, 128) @ (128, 256) → (32, 256)
四、矩陣運算的 AI 應用
4.1 矩陣乘法的計算複雜度
┌─────────────────────────────────────────────────────────────┐
│ 矩陣乘法複雜度與硬體加速 │
│ │
│ CPU 序列計算: │
│ A(m×k) × B(k×n) → C(m×n) │
│ 複雜度:O(m × k × n) ≈ O(n³) for square matrices │
│ 1000×1000 矩陣:10⁹ 次乘加 ≈ CPU 單核 ~1秒 │
│ │
│ GPU 並行計算: │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Core 0│ │Core 1│ │Core 2│ │Core 3│ × 4096 個 CUDA │
│ │C[0,0]│ │C[0,1]│ │C[1,0]│ │C[1,1]│ 核心同時計算 │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
│ GPU 理論加速:4096 核心 → 有效複雜度降至 O(n²) │
│ 實際測量:1000×1000 矩陣乘法 │
│ CPU (i9): ~800ms │
│ GPU (A100): ~0.3ms → 2600倍加速 │
│ │
│ TensorCore (混合精度 BF16):額外 ~4× throughput │
└─────────────────────────────────────────────────────────────┘
4.2 批次矩陣乘法(Batched Matrix Multiplication)
深度學習幾乎永遠是批次操作。單個樣本的計算效率極低,batch processing 讓 GPU 利用率從 < 5% 提升到 > 80%。
| Batch Size | GPU 使用率 | 訓練速度 (samples/sec) | 備註 |
|---|---|---|---|
| 1 | ~3% | 120 | 幾乎浪費 GPU |
| 8 | ~15% | 800 | 開發除錯用 |
| 32 | ~45% | 2,800 | 常見起始值 |
| 128 | ~78% | 9,600 | 多數任務最優 |
| 512 | ~85% | 31,000 | 需要大 LR warm-up |
| 2048 | ~88% | 98,000 | 需要 gradient accumulation |
4.3 奇異值分解(SVD)在 AI 的應用
SVD 是矩陣分解的瑞士刀:A = UΣVᵀ
AI 中的直接應用:
- PCA 降維:取前 k 個奇異值,將 768 維 Embedding 壓縮到 50 維
- LoRA(Low-Rank Adaptation):大型模型微調的核心技術,利用低秩矩陣
ΔW = BA(B: d×r, A: r×d, r « d)將微調參數量從 7B 降到 ~4M - 推薦系統:矩陣分解協同過濾
LoRA 的數學本質:
原始權重更新:ΔW ∈ R^(d×d),參數量 = d²
LoRA 近似: ΔW ≈ BA,B ∈ R^(d×r),A ∈ R^(r×d),參數量 = 2dr
當 r=8, d=4096:原始 16.7M 參數 → LoRA 65K 參數,縮減 256 倍
五、微積分直覺:梯度、偏微分
5.1 導數的幾何直覺
導數 = 函數的「斜率」,告訴你在某個點往哪個方向走函數值會上升。
對 AI 來說,我們想要找 Loss function 的最小值,所以要往負梯度方向走。
一維情況:
Loss
│ ╭───
│ ╭─╯
│ ╭─╯
│ ╭─╯ ← 這裡斜率 > 0,往左走(-方向)
│ ╭╯
│ ╭╯ ● ← 最小值,斜率 = 0
│─╯────────────▶ W
偏微分: 當函數有多個變數時(神經網路有數百萬個參數),對某一個參數求偏導數,其他參數視為常數。
Loss(w₁, w₂, w₃, ..., wₙ)
∂Loss/∂w₁ = 只考慮 w₁ 變化對 Loss 的影響
∂Loss/∂w₂ = 只考慮 w₂ 變化對 Loss 的影響
...
5.2 梯度(Gradient)— 多維空間的方向
梯度是所有偏微分組成的向量:
∇Loss = [∂Loss/∂w₁, ∂Loss/∂w₂, ..., ∂Loss/∂wₙ]
梯度指向 Loss 上升最快的方向,所以梯度下降要往負梯度方向更新:
w_new = w_old - α × ∇Loss
其中 α 是 learning rate(學習率)。
5.3 鏈式法則(Chain Rule)— 反向傳播的數學基礎
鏈式法則:複合函數的微分。
若 y = f(g(x)),則 dy/dx = (df/dg) × (dg/dx)
神經網路是一個多層複合函數:
Loss = L(ŷ)
ŷ = softmax(z₃)
z₃ = W₃ × a₂ + b₃
a₂ = ReLU(z₂)
z₂ = W₂ × a₁ + b₂
a₁ = ReLU(z₁)
z₁ = W₁ × x + b₁
∂Loss/∂W₁ = (∂Loss/∂ŷ)(∂ŷ/∂z₃)(∂z₃/∂a₂)(∂a₂/∂z₂)(∂z₂/∂a₁)(∂a₁/∂z₁)(∂z₁/∂W₁)
這就是反向傳播的本質:鏈式法則從輸出層向輸入層傳播梯度。
六、梯度下降深度解析
6.1 梯度下降的三種變體
┌────────────────────────────────────────────────────────────────┐
│ 梯度下降流程圖 │
│ │
│ ┌─────────────────┐ │
│ │ 初始化參數 W │ │
│ │ (通常隨機) │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 前向傳播 │──────▶│ 計算 Loss │ │
│ │ ŷ = f(x; W) │ │ L(y, ŷ) │ │
│ └─────────────────┘ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 反向傳播 │ │
│ │ ∇W = ∂L/∂W │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 更新參數 │ │
│ │ W = W - α∇W │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────────────┘ │
│ │ 收斂? │
│ ├─ 否 ──▶ 回到前向傳播 │
│ └─ 是 ──▶ 輸出最終模型 │
└────────────────────────────────────────────────────────────────┘
| 類型 | 每次更新使用資料量 | 梯度品質 | 速度 | 記憶體 |
|---|---|---|---|---|
| BGD(Batch GD) | 全部訓練資料 | 精確 | 慢 | 高 |
| SGD(Stochastic GD) | 1 筆樣本 | 噪聲高 | 快 | 低 |
| Mini-batch GD | 32–512 筆 | 平衡 | 平衡 | 中 |
工程選擇: 幾乎永遠使用 Mini-batch GD。純 SGD 梯度太噪、BGD 記憶體不夠。
6.2 Learning Rate 的影響
Learning rate 是梯度下降中最重要的超參數:
| LR 設定 | 行為 | 症狀 |
|---|---|---|
| 太大(> 0.1) | 震盪、發散 | Loss 忽高忽低,最終 NaN |
| 偏大(0.01–0.1) | 快速但不穩 | Loss 下降快但最後震盪 |
| 適中(1e-3 ~ 1e-2) | 穩定收斂 | 理想曲線 |
| 偏小(1e-4 ~ 1e-3) | 收斂慢 | Loss 持續緩慢下降 |
| 太小(< 1e-5) | 幾乎不更新 | Loss 幾乎不動 |
實務建議: 使用 LR Finder(從小到大掃描 LR,找 Loss 下降最陡的點的 LR / 10)。
6.3 Momentum 的數學直覺
普通梯度下降:每一步都完全由當前梯度決定,容易在 ravine(狹窄山谷)中震盪。
Momentum 梯度下降:引入「慣性」,記住上一步的方向:
v_t = β × v_{t-1} + (1-β) × ∇W_t # 動量更新
W_t = W_{t-1} - α × v_t # 參數更新
其中 β 通常取 0.9,意味著 90% 的慣性 + 10% 的新梯度。
效果: 在正確方向上加速(動量累積),在錯誤方向上減速(梯度方向改變時動量消耗)。
七、反向傳播的數學本質
7.1 計算圖(Computational Graph)
計算圖是反向傳播的核心資料結構,將函數分解為基本操作的有向圖。
┌─────────────────────────────────────────────────────────────┐
│ 計算圖示例 │
│ │
│ 輸入層 中間層 輸出層 │
│ │
│ x ──────▶ ┌───┐ │
│ │ × │──▶ z₁ ──▶ ┌──────┐ │
│ W₁ ────▶ └───┘ │ ReLU │──▶ a₁ │
│ └──────┘ │ │
│ ▼ │
│ x ──────▶ ┌───┐ ┌─────────────────────┐ │
│ │ + │──▶ │ z₁ = W₁x + b₁ │ │
│ b₁ ────▶ └───┘ └─────────────────────┘ │
│ │
│ 前向:左到右,計算每個節點的值 │
│ 反向:右到左,用鏈式法則計算每個節點的梯度 │
│ │
│ ∂Loss/∂W₁ = (∂Loss/∂a₁)(∂a₁/∂z₁)(∂z₁/∂W₁) │
│ = δ₁ × 1(z₁>0) × x │
└─────────────────────────────────────────────────────────────┘
7.2 各激活函數的梯度
| 激活函數 | 公式 | 梯度 | 問題 |
|---|---|---|---|
| Sigmoid | 1/(1+e⁻ˣ) | σ(x)(1-σ(x)) ∈ (0, 0.25] | Vanishing gradient(深層網路) |
| Tanh | (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | 1-tanh²(x) ∈ (0, 1] | 仍有 vanishing gradient |
| ReLU | max(0, x) | 1(x>0) ∈ {0, 1} | Dead neuron(x<0 梯度恆為 0) |
| Leaky ReLU | max(αx, x) | 1(x>0) + α·1(x≤0) | 解決 dead neuron,α 通常取 0.01 |
| GELU | x·Φ(x) | 近似 smooth ReLU | Transformer 首選,計算較慢 |
工程含義: Sigmoid 在 20 層以上的深層網路中,梯度每層乘以 ≤ 0.25,20 層後梯度縮小至 (0.25)²⁰ ≈ 10⁻¹²,幾乎為零,這就是 Vanishing Gradient Problem。
7.3 Vanishing / Exploding Gradient 的診斷
診斷方法: 監控每層的梯度範數
1for name, param in model.named_parameters():
2 if param.grad is not None:
3 grad_norm = param.grad.norm().item()
4 print(f"{name}: grad_norm = {grad_norm:.6f}")
| 梯度範數 | 狀態 | 處理方式 |
|---|---|---|
| < 1e-6 | Vanishing gradient | 換 ReLU、BatchNorm、Residual connection |
| 1e-4 ~ 1.0 | 正常範圍 | 無需處理 |
| > 10 | Exploding gradient | 梯度裁剪(clip_grad_norm_) |
| NaN | 爆炸後溢出 | 降低 LR、加 gradient clipping |
梯度裁剪:
1# 裁剪梯度範數,防止爆炸
2torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
八、為什麼選 X 不選 Y:6 個關鍵決策比較
8.1 SGD vs Adam
| 選擇 | 理由 | 不選的理由 |
|---|---|---|
| Adam | 自適應學習率:每個參數有獨立 LR;不需精細調 LR;收斂快,15–30% 更快達到同等 loss | SGD:需要精細調 LR 和 momentum;對 LR 敏感;收斂慢但有時泛化更好 |
| SGD+Momentum | 某些 CV 任務泛化性能 1–3% 更好;記憶體比 Adam 少 1/3(無需存 m, v) | Adam:訓練快但有時 generalization gap 較大 |
翻轉條件: 當模型 > 1B 參數且記憶體緊張時,考慮 SGD;當訓練預算有限時,Adam 幾乎必選。
8.2 L1 vs L2 Regularization
| 選擇 | 數學含義 | 用途 | 何時不選 |
|---|---|---|---|
| L2(Ridge) | 懲罰 Σwᵢ²;讓權重趨向小但非零 | 大多數深度學習(Weight Decay = L2) | 需要稀疏解時 |
| L1(Lasso) | 懲罰 Σ|wᵢ|;讓部分權重精確為 0 | 特徵選擇、稀疏模型 | 深度網路(梯度在 0 點不可微,不穩定) |
| Elastic Net | L1 + L2 組合 | 兩者都需要時 | 需要簡單調參時 |
幾何直覺: L2 的約束集合是球形(圓滑邊界),解不一定在軸上;L1 的約束集合是菱形(有尖角),解容易落在頂點(稀疏)。
8.3 Batch Normalization vs Layer Normalization
| 選擇 | 正規化維度 | 用途 | 不適合場景 |
|---|---|---|---|
| BatchNorm | 跨 batch 維度正規化 | CNN、CV 任務;加速收斂 30–40%;batch size ≥ 16 | 小 batch(< 8)、RNN、推論時 batch=1 |
| LayerNorm | 跨特徵維度正規化 | Transformer、NLP;與 batch size 無關 | 某些 CNN 任務效果略差 |
| GroupNorm | 將特徵分組後正規化 | 小 batch CV 任務 | 需要 group 數選擇 |
8.4 Xavier vs He 初始化
| 選擇 | 公式 | 設計假設 | 用途 |
|---|---|---|---|
| Xavier(Glorot) | Var(W) = 2/(n_in + n_out) | 假設激活函數線性(Sigmoid/Tanh) | Sigmoid、Tanh 網路 |
| He | Var(W) = 2/n_in | 考慮 ReLU 截斷一半神經元 | ReLU、Leaky ReLU 網路 |
工程規則: 用 ReLU → He init;用 Sigmoid/Tanh → Xavier init。選錯會讓訓練初期 loss 高 10–50%。
8.5 Cross-Entropy vs MSE Loss
| 選擇 | 梯度特性 | 用途 | 不選的理由 |
|---|---|---|---|
| Cross-Entropy | 梯度 = (ŷ - y),大誤差時梯度大 | 分類問題(必選) | 回歸問題不適用 |
| MSE | 梯度 = 2(ŷ - y),配合 Sigmoid 時梯度 → 0 | 回歸問題 | 分類問題:配合 Sigmoid 時 Vanishing gradient 嚴重 |
| Focal Loss | 對難樣本加重 | 類別不平衡(正負樣本比 > 100:1) | 類別平衡時沒必要 |
翻轉條件: 目標偵測(YOLO 系列)使用 MSE 預測框座標,同時用 Cross-Entropy 預測類別。
8.6 FP32 vs FP16/BF16
| 選擇 | 精度 | 記憶體 | 速度 | 風險 |
|---|---|---|---|---|
| FP32 | 高(7位十進制) | 基準 1× | 基準 1× | 最穩定 |
| FP16 | 低(3位十進制) | 0.5× | 2–4× | 容易 overflow(最大 65504),需要 Loss Scaling |
| BF16 | 中(2位十進制,範圍大) | 0.5× | 2–4× | 數值範圍與 FP32 相同,推薦用於 LLM 訓練 |
工程結論: 訓練 LLM → BF16;推論 → FP16 或 INT8 量化。FP16 訓練時若 loss 出現 NaN,先檢查是否需要 Loss Scaling。
九、系統效應:有無數學基礎的前後對比
以下是真實工程場景中,數學理解程度對工作效率的量化影響:
| 場景 | 沒有數學基礎 | 有數學基礎 | 效益 |
|---|---|---|---|
| Gradient Explosion 診斷 | 試遍所有超參數,~2天 | 看梯度範數,<30分鐘 | 8× 更快 |
| 選擇 optimizer | 永遠用 Adam,不了解為什麼 | 根據任務和資源選擇,有理論依據 | 訓練速度提升 15–30% |
| Loss 不收斂 | 無頭緒,問別人或重跑 | 從 loss landscape 角度系統性排查 | 解決時間 3× 更短 |
| 設計自訂 Loss | 不敢嘗試 | 能手推梯度公式,30分鐘實作 | 解鎖新能力 |
| 模型輕量化(LoRA) | 套用現成工具,不理解參數 | 理解 SVD 後可以調整 rank,最佳化精度/大小 | 模型大小再縮減 30–50% |
| 除錯 NaN loss | 隨機嘗試,平均 6 小時 | 用數學推斷根本原因,< 1 小時 | 5× 更快 |
| 解釋模型行為給業務 | 只能說「可能是 overfitting」 | 能用正則化幾何解釋 overfit,加上具體數字 | 提升團隊信任度 |
訓練效率數字:
- 正確初始化(He vs 隨機):初始 loss 差異高達 50%,收斂速度差異 2× 以上
- 適當 learning rate schedule(cosine decay)vs 固定 LR:最終準確率提升 1–3%
- 梯度裁剪防止 exploding:避免重跑訓練的機率提升 40%
- 理解 batch size 與 LR 的線性縮放關係:batch size 8× → LR √8 倍,訓練速度提升 6×
十、面試答題要點
面試問題: 訓練 Embedding 推薦模型第 5 epoch 後 loss 變 NaN,GPU 正常,資料沒問題,請從數學角度診斷。
「首先我會確認是 Gradient Explosion 而非 Loss Scaling 問題,具體做法是在每個 backward() 後印出各層的梯度範數——如果某層梯度範數 > 100 就幾乎確定是爆炸。數學根源是 Embedding 的梯度是 one-hot 稀疏梯度,稀疏更新疊加 Adam 的 v 分母過小時(初始幾個 epoch v 近乎為 0),等效 LR 可以暴增 100 倍以上,導致參數跳過穩定區間。修復策略分兩層:短期加上
clip_grad_norm_(..., max_norm=1.0)立即防止 NaN;中期將 Adam 的 epsilon 從預設 1e-8 調大到 1e-4,或改用 AdamW + weight decay 0.01,從數學上限制 Embedding 矩陣的 L2 範數增長。如果問題仍存在,第三步是確認 Embedding 初始化是否用了 He init(Embedding 應用 normal(0, 1/√d),預設 PyTorch 用 N(0,1) 可能過大)。這三步通常在 2 小時內可以定位並修復,不需要重新訓練資料。」
十一、系列導航
本文是 AI Engineering from Scratch 系列的第一篇,涵蓋 AI 數學基礎的線性代數與微積分核心直覺。
系列文章:
| 篇次 | 主題 | 狀態 |
|---|---|---|
| Phase 1 Part 1(本篇) | 線性代數與微積分 — AI 演算法直覺 | ✓ 已發布 |
| Phase 1 Part 2 | 機率論與統計 — 貝氏推斷、最大似然 | 即將發布 |
| Phase 1 Part 3 | 資訊理論 — Entropy、KL Divergence | 即將發布 |
| Phase 2 Part 1 | 神經網路架構 — MLP、CNN、RNN | 即將發布 |
| Phase 2 Part 2 | Transformer 與 Attention 機制 | 即將發布 |
| Phase 3 Part 1 | 大型語言模型訓練工程 | 即將發布 |
參考資源:
- AI Engineering from Scratch — GitHub
- 3Blue1Brown: Essence of Linear Algebra(推薦入門視覺化)
- Stanford CS229 機器學習講義(數學推導完整版)
- Deep Learning book (Goodfellow et al.) 第 2–4 章
本文為 AI 工程從零開始系列,專為有軟體工程背景但缺乏 AI 數學基礎的工程師設計。重點是建立工程直覺,而非嚴格數學證明。
