「訓練不收斂」在考題裡永遠只有幾種長相:loss 震盪、loss 變 NaN、層數加深反而更差、驗證損失從某個 epoch 開始反轉。每一種都對應到固定的成因與解方。這頁用三個互動實驗室,把看不見的梯度、批次與搜尋策略全部畫出來。
這頁會用到的符號全部列在下面,一行一個。數學的困難常常不是概念難,而是沒人告訴你那個圖案怎麼念、代表什麼——看不懂符號,整條式子就等於空白。
| 符號 | 怎麼念 | 在這頁的意思 |
|---|---|---|
| √ | radical sign 根號 | 開根號。問「什麼數自己乘自己會得到它」。 |
| ⌈ ⌉ | ceiling 上取整(無條件進位) | 往上進到整數。⌈10000÷32⌉ = ⌈312.5⌉ = 313。 |
| ‖x‖ | norm 範數(雙豎線) | 向量的「長度」。雙豎線是為了跟單豎線的絕對值區隔。 |
| × · | multiplication 乘號兩種寫法 | 都是乘。差別純粹是歷史與排版習慣。 |
| = | equals 等號 | 兩邊相等。 |
| ≈ | approximately equal 約等於 | 差不多相等(四捨五入或近似之後)。 |
| ÷ | division 除號 | 除。 |
| ∂ | partial 偏微分(圓體 d、curly d) | 只對其中一個變數微分,其他當成常數。 |
| ∇ | nabla / del 梯度算子 | 梯度——指向「上升最快」的方向。訓練時往它的反方向走。 |
| η | eta 伊塔(學習率) | 學習率——每次更新參數要走多大步。 |
| μ | mu 謬(母體平均) | 整個母體的真實平均值(相對於樣本平均 x̄)。 |
| σ σ² | sigma 西格瑪(標準差、變異數) | σ=標準差(資料多分散,單位同原資料);σ²=變異數(平方單位)。 |
| E[X] | expectation 期望值 | 長期平均下來會是多少。 |
| A x | 大寫矩陣、小寫向量 排版慣例 | 看字體就知道是什麼:大寫=矩陣、小寫=向量或純量。 |
| ← | assignment 賦值箭頭 | 「用右邊的結果取代左邊」,不是「等於」。 |
三個名詞天天出現卻最常搞混。一句話:Epoch 是「把全部資料看過一遍」,Batch 是「一次拿幾筆去算梯度」,Iteration 是「更新權重一次」。
| Batch size 調大 | Batch size 調小 | |
|---|---|---|
| 梯度品質 | 平均更多樣本 → 噪聲小、方向穩 | 樣本少 → 噪聲大、方向抖 |
| 更新次數 | 同樣資料下更新次數變少(走得少步) | 更新次數多(走得多步) |
| 記憶體 / GPU | 吃更多顯存,容易 OOM | 省顯存 |
| 逃出局部最小 | 較不容易(太平滑) | 噪聲反而有機會抖出局部最小 |
| 常見搭配 | batch 加大時學習率通常也要跟著調大 | 小 batch 配小學習率較穩 |
反向傳播是連乘:每往前傳一層,梯度就乘上一個倍率。倍率小於 1,乘幾十層就趨近 0(梯度消失);大於 1,就指數放大(梯度爆炸)。調下面的組合,看梯度從輸出層傳回輸入層一路變成什麼樣。
| 初始化 | 做法 | 搭配誰 | 為什麼 |
|---|---|---|---|
| 全部設 0 | 權重都是 0 | ❌ 不能用 | 同一層每個神經元收到完全一樣的梯度,永遠學一樣的東西(對稱性沒被打破) |
| Xavier / Glorot | 變異數 ≈ 1/nin | Sigmoid / Tanh | 讓前向與反向的訊號量級都維持住 |
| He(Kaiming) | 變異數 ≈ 2/nin | ReLU 系列 | ReLU 砍掉一半的輸出,變異數少一半,所以要乘 2 補回來 |
| 梯度消失 Vanishing | 梯度爆炸 Exploding | |
|---|---|---|
| 症狀 | 淺層幾乎不動、深層才學得到;加深反而更差 | loss 突然變 NaN 或飆高、權重爆掉 |
| 元凶 | Sigmoid/Tanh 飽和區導數趨近 0、層數太深 | 權重初始化過大、RNN 長序列連乘、學習率過大 |
| 解方 | ReLU 系列、殘差連接 ResNet、Batch Norm、LSTM/GRU 門控、He 初始化 | 梯度裁剪 clip_grad_norm_、降低學習率、Batch Norm、較小的初始化 |
loss.backward() → clip_grad_norm_(params, max_norm) → optimizer.step()。先反向傳播算出梯度才裁得到,裁完再更新。作用是限制梯度的 L2 範數,避免更新步幅失控導致 loss 變 NaN。| 學習率 | 會看到什麼 | 怎麼修 |
|---|---|---|
| 太大 | loss 震盪或發散——在最佳點兩側反覆跳越,甚至越跑越高 | 調小、加 warmup、換 Adam |
| 太小 | 收斂龜速,跑完預算還沒到最佳點 | 調大、用學習率排程 |
| 剛好 | loss 平順下降後趨於平坦 | 可搭配衰減(Decay / Cosine)再壓一段 |
| 優化器 | 加了什麼 | 解決什麼 |
|---|---|---|
| SGD | 最原始,固定學習率 | —(容易在峽谷震盪、卡鞍點) |
| + Momentum | 一階動量:累積過去梯度方向,像有慣性的重球 | 抑制震盪、衝過小坑與平坦區 |
| AdaGrad | 依歷史梯度平方和自動縮小學習率 | 稀疏特徵;但學習率會一路衰減到停住 |
| RMSProp | 改用移動平均,不會一路衰減到死 | 修好 AdaGrad 的過早停滯 |
| Adam | Momentum + RMSProp:一階動量 + 自適應學習率 | 為每個參數各自調整步長,震盪與尺度差異都能吃 |
同樣的預算(試驗次數),三種策略各自去找那塊看不見的「最佳區域」。看誰找得到、誰在浪費算力。
| 策略 | 怎麼選下一組 | 優點 | 缺點 |
|---|---|---|---|
| Grid Search | 把每個參數切成固定格點,全部組合都跑 | 系統化、可重現、易平行 | 維度災難:參數一多次數就爆炸;每個維度只試到 \(\sqrt[k]{N}\) 個不同值 |
| Random Search | 在範圍內隨機抽 | 同樣預算下,每個維度都試到 N 個不同值;重要參數更容易被摸到 | 不會利用先前結果,純靠運氣 |
| 貝葉斯優化 | 用先前的結果建代理模型,挑「可能最好 or 最不確定」的點 | 試驗次數少就能找到好解,適合每次訓練都很貴的情境 | 本身有超參數、難平行、實作較複雜 |
| patience | 容忍幾個 epoch 沒進步才停。設太小會被正常波動誤觸發、太大則浪費算力 |
| monitor | 監控哪個指標(通常 val_loss;不平衡資料可改 val_f1 或 val_auc) |
| restore_best | 停下來後回捲到最佳那一輪的權重,而不是留在最後一輪 |
| 症狀 | 最可能的成因 | 先試什麼 |
|---|---|---|
| loss 變 NaN 或飆高 | 梯度爆炸、學習率過大 | 梯度裁剪、降學習率、檢查資料有沒有極端值 |
| loss 劇烈震盪不下降 | 學習率過大、batch 太小 | 降學習率、加大 batch、換 Adam |
| loss 幾乎不動 | 學習率過小、梯度消失、Dying ReLU | 調大學習率、換 ReLU/He、加殘差或 BatchNorm |
| 層數加深反而更差 | 梯度消失/退化問題 | 殘差連接 ResNet |
| 訓練 loss 降、驗證 loss 升 | 過擬合 | 早停、正則化(L1/L2/Dropout)、資料增強 |
| 訓練與驗證都很差 | 欠擬合、模型太簡單、特徵不足 | 加大模型、多訓練、做特徵工程 |
| 特徵尺度差很多、收斂很慢 | 沒做標準化,等高線變狹長峽谷 | 標準化 (X−μ)/σ、Batch Norm |
每個 epoch 的 iteration = ⌈10000 ÷ 32⌉ = 313 次(最後一個 batch 只有 16 筆)。總更新次數 = 313 × 10 = 3,130 次。
深層網路出現梯度消失,淺層權重難以更新;採用 ResNet 的殘差連接(Skip Connection)改善梯度傳遞。陷阱選項「把 ReLU 改成 Sigmoid」是反的——Sigmoid 飽和才是梯度消失的元凶。
ReLU 把負半邊直接砍成 0,讓輸出的變異數少掉一半。Xavier 的變異數是 1/nin,用在 ReLU 上訊號會逐層衰減;He 用 2/nin,剛好把那一半乘 2 補回來,讓每層倍率維持在 1。
損失函數震盪或發散(Oscillation / Divergence):每次更新步伐過大,參數在最佳點兩側反覆跳越。不是梯度消失、不是過擬合、也不是 Dying ReLU。
因為它同時結合一階動量(Momentum)與自適應學習率(RMSProp),為每個參數各自調整更新步長。動量讓方向不被單次雜訊帶偏,自適應學習率處理不同參數的梯度尺度差異。
clip_grad_norm_ 放在哪?治的是消失還是爆炸?放在 loss.backward() 之後、optimizer.step() 之前。它限制梯度的 L2 範數,治的是爆炸。對梯度消失完全無效——因為它是等比例縮放,層與層之間的比例不會改變。
這是過擬合的標準曲線 → 早停(EarlyStopping),並回捲到最佳那一輪的權重;也可加正則化、Dropout、資料增強。不該調高學習率。
Random Search。Grid 用 5×5 的話,學習率只試到 5 個不同值;Random 25 次則在學習率上試到 25 個不同值。若每次訓練都非常貴、想用更少次數逼近最佳,再升級成貝葉斯優化(用先前結果決定下一個試驗點)。
這塊集中在中級科目三「機器學習技術與應用」,少量出現在科目一。梯度消失是整份題庫出現頻率最高的最佳化名詞(連同爆炸與裁剪超過 40 次),而且幾乎每次都綁著 ResNet 殘差連接當正解,或拿 Sigmoid/池化層/多頭注意力當干擾項。其次高頻的是學習率(過大→震盪發散、fine-tuning 用小值)與 Adam=動量+自適應學習率。初始化(Xavier / He)雖然出題次數少,但站內先前完全沒教過,屬於容易被整組放掉的送分區。
在深層前饋/CNN 中梯度消失遠比爆炸常見(尤其用 Sigmoid/Tanh 時);梯度爆炸則常見於 RNN/LSTM 處理長序列,因為同一組權重被反覆連乘。所以 clip_grad_norm_ 幾乎是 RNN 訓練的標配。
它把每層的輸入重新標準化,讓數值不會飄到激活函數的飽和區,因此同時緩解梯度消失、允許用更大的學習率、加快收斂,並帶一點正則化效果。但它不是用來降維或減少參數的。
通常要。batch 調大時梯度更穩、單步可以走更遠,實務上常用「batch 乘 k,學習率也乘 k(或 √k)」的線性縮放法則,並搭配 warmup 讓前幾步不要太猛。
當每一次訓練都很貴(大模型、要跑好幾小時)且預算只有數十次時。若訓練很便宜、可以大量平行、或超參數維度很高,Random Search 反而更划算——它簡單、天然可平行、也不會被代理模型帶錯方向。