講義把所有訓練問題先切成兩類。Training loss 降不到合理範圍:模型連看過的資料都學不會,這是 optimization 或程式的問題。Training loss 很好、validation 明顯變差:模型背下了訓練資料,換一批就不行,這是 generalization 的問題。兩類的對策完全不同,所以先分類,再動手。下面這個練習台每次隨機產生一組曲線,你來判斷是哪一種。
Babysitting:正式訓練前的四步。講義把它叫「照顧訓練過程」,順序是:
X -= np.mean(X, axis=0)、X /= np.std(X, axis=0)。影像的像素本來就都在 0 到 255,所以除標準差不是必要的。講義建議的 debug workflow:Data first(先看 label、split、preprocessing、重複資料、洩漏,確認 batch 真的是你以為的資料)→ overfit 一個極小 batch → 檢查初始 loss → 監控 signal → 檢查數值(NaN/Inf、overflow、underflow、softmax 飽和、mixed precision 的 scale)→ 一次只改一個主要因素。
三種 learning curve 形狀:Underfit(train、val 都高);Healthy(一起下降,差距可控);Overfit(train 往下,val 反彈)。
除了 loss,至少監控這 3 組 signal:
‖ΔW‖ / ‖W‖,每一步權重改了自己的幾成。找「幾乎沒動」和「每步改太多」的層。NaN / Inf 的定位流程:依序檢查 (1) activation 是不是有限值 → (2) loss 是不是有限值 → (3) gradient 是不是有限值 → (4) optimizer 的狀態是不是有限值 → (5) 回頭找第一個出錯的運算。
Training diagnostics:先找 failure,再調超參數。講義的對照表:
| 觀察 | 較可能的問題 | 優先處理 |
|---|---|---|
| train 很高、降很慢 | Optimization failure | LR、optimizer、conditioning、normalization |
| train 震盪或 spike | 步幅、數值穩定性 | LR、warmup、gradient clipping、precision |
| train 好、val 變差 | Generalization failure | data、augmentation、weight decay、early stopping |
| train、val 都差 | underfit 或 pipeline 錯誤 | 先做資料與程式 sanity check,不要急著換 optimizer |
總結的決策樹:train loss 能降到合理範圍嗎?不能 → 依序檢查資料與標籤、initial loss、梯度存不存在、LR/尺度/數值。能 → validation gap 大嗎?大 → generalization、洩漏或分佈偏移;小但表現仍差 → 容量、目標函數或資料品質。
講義說 learning rate 是最先該調的超參數。太小:很穩,但進度太慢。太大:震盪、loss 突然暴衝、甚至發散。合理的 LR 會先快速下降、再慢慢細修。而且它不該從頭到尾一樣大:前期大步探索,後期小步收斂。怎麼隨時間變,就叫 LR schedule。下面左邊畫五種 schedule 的形狀,右邊拿同一個小問題、同一串雜訊,真的用每一種 schedule 跑梯度下降。
經驗值:大多要試才知道,通常不會大於 0.1;初始值 0.01 或 0.001 很常見;訓練中還可以再降,10⁻⁴、10⁻⁵ 也有可能。講義的情境表:CNN 從頭訓練用 SGD 時 1e-2 到 1e-3、AdamW 1e-3 到 1e-4(batch size 放大時,SGD 的 LR 要等比例放大);Transformer 從頭訓練 1e-4 到 5e-4,必須搭配前 5% 到 10% 步數的 linear warmup,之後接 cosine decay;LLM 預訓練 1e-4 到 3e-4,模型越大 LR 越小(例如 7B 用 3e-4,70B 降到 1e-4 甚至更低),gradient clipping 通常設 1.0;全面微調 1e-5 到 5e-6(比預訓練小 10 倍以上,避免破壞學好的權重),LoRA 因為只訓練新插入的小矩陣,可以開到 1e-4 到 3e-4。
Decay 的幾種寫法:time-based lr = lr0 / (1 + k·t);step decay 每隔幾個 epoch 乘一個 factor,lr = lr0 · drop^floor(epoch / epochs_drop);exponential lr = lr0 · e^(−k·t);還有手動降。ReduceLROnPlateau 則是在指標停滯時自動降(講義列 patience 3~5、factor 0.1),缺點是反應落後、對雜訊敏感。
Step vs cosine 的設計哲學:Step decay 是傳統 CNN 常見的做法,到了明確的 milestone 突然把 LR 降下去(例如 step_size=30、gamma=0.1)。Cosine 平滑地退火,參數少,在 CNN、ViT、LLM 上都是成熟的 baseline。兩者的共同限制:形狀綁定一個事先決定的總步數,想延長訓練就不靈活。
LR finder:從很小的 LR 開始,每個 batch 把 LR 以指數方式放大,記下每個 batch 的 loss。loss 對步數的變化率太吵,用移動平均平滑後,挑 loss 下降最快、還沒發散的區間。最佳 LR 會隨訓練變小,可以每隔一段時間重做一次。fast.ai 的 learn.lr_find() 就是這個。
Super convergence 與 one-cycle:用一個 LR 循環、很大的最大 LR,可以把訓練加速一個數量級。關鍵觀察是大 LR 本身有正則化效果,所以要相應減少其他正則化。One-cycle 的做法:最大 LR 用 LR finder 找,最低是它的 1/10,上升和下降一樣長,最後再往下降好幾個數量級。講義說第二段用 cosine 從 lr_max 退火到 0 效果更好。
Warm start:PyTorch 有現成的 CyclicLR(triangular、triangular2)和 OneCycleLR(cos 或 linear 退火)。Cyclic LR 在 base_lr 和 max_lr 之間來回,探索性強但可能抖動,適合小資料或收斂困難時試。
Train ImageNet in 18 minutes:講義舉的實例,除了 LR 策略,還用了三招:progressive resizing(一開始用小圖,模型還很不準時快速看大量圖片,後期才換大圖學細節)、dynamic batch size(中段幾個 epoch 用較大的 batch,吃滿 GPU 記憶體、減少網路延遲)、BN 層不做 weight decay。講義備註的數字:93% 準確率、16 台雲端機器各 8 張 V100、大約 40 美元。
LLM 的 WSD(warmup-stable-decay):把「持續訓練」和「最後收斂」拆開。Warmup 安全升到高 LR;Stable 主幹維持高 LR,想訓練多久都可以延長;Decay 等需要 checkpoint 時才快速 cooldown(講義備註:最後約 10% 的步數)。因為 stable 段的任何一點都可以分岔出去做 decay,可以做 checkpoint 分支。對照:2018 到 2023 年的預設是 warmup + cosine 退火到峰值的約 10%(講義備註列了 GPT-3、Llama-2),WSD 則在 MiniCPM、Llama-3.1、DeepSeek-V2 上用到。
2026 的 WSqD(Warmup with Square-root base and linear Decay):WSD 可以延長 stable 段,但它的峰值 LR 還是依照原本的訓練長度調的,延長後可能不再最好。WSqD 把固定的 stable 段換成「平移過的 1/√t 曲線」,保留最後的線性退火;訓練長度只決定什麼時候開始 cooldown。講義把它定位成 2026 年的 preprint,屬於研究前沿。
怎麼挑(講義的建議):先做 LR finder,在下降區間取值。CNN 圖像分類常用 step decay 或 cosine annealing;Transformer、LLM 幾乎都用 warmup + cosine;小資料或收斂困難可試 cyclical LR。典型範圍:Adam/AdamW 10⁻⁵ 到 10⁻³,有 momentum 的 SGD 10⁻³ 到 10⁻¹。
把 training loss 降到很低,不代表事情結束了。停在哪一種谷底也很重要。又深又窄的谷(sharp minimum):訓練誤差極低,但資料一點點改變就跌倒。又寬又平的谷(flat minimum):對資料的小變動不敏感,泛化通常比較好。測試資料和訓練資料總有一點不同,可以想成「整條 loss 曲線被推歪了一點」。下面就把它推推看。
Bias 和 variance 用打靶來想:靶心是真實標籤,彈著點是模型的預測。Bias 是預測的平均離靶心多遠,反映模型的擬合能力夠不夠,高 bias 就是 underfitting。Variance 是換一批訓練資料、訓練出來的預測會晃多少,高 variance 就是 overfitting。
傳統機器學習的觀點:低容量模型 bias 高、variance 低,訓練和測試都差;高容量模型 bias 低、variance 高,訓練好、測試差。兩者呈 U 型取捨,理論上有一個「最佳模型容量」。講義的處方:高 bias → 加大網路容量;高 variance → 用正則化限制模型自由度、加資料;兩個都高 → 重新思考架構並加資料。深度學習的好消息是你總有兩個簡單選項:更多資料或更大的模型,所以不用像傳統統計那樣精細地權衡。實務流程:如果人的錯誤率明顯低於訓練錯誤率,先加大模型、訓練久一點、或換架構;過了這關,再看 dev 錯誤率是不是比訓練高。
深度學習的反直覺現象:幾百萬甚至幾十億參數的大網路,常常比小網路泛化更好,經典的 bias-variance 曲線不再成立。這叫 double descent:測試誤差隨模型容量先下降、再上升、再下降。在「插值閾值」(模型剛好能完美擬合訓練集)附近,能做到零訓練誤差的解很少,模型容易挑中連雜訊都背下來的那一個,測試誤差到達高峰;參數繼續增加,零誤差的解變多,SGD 的隱式偏好會挑出更平滑、範數更小的解,測試誤差第二次下降。
Implicit regularization:在高維空間裡有很多個最低點,SGD 傾向落在 flat minimum。講義備註也提到,大 batch 訓練比小 batch 更容易落進窄而尖的谷。
150 階多項式:講義引用的研究顯示,這些「怪現象」用簡單的線性模型也能重現。一個 150 階多項式,配上「階數越高、懲罰越重」的正則化,可以合理描述簡單和有結構的資料,同時也有能力完美擬合純雜訊。一個 Gaussian process 也能完全重現 CIFAR-10 上「能背下亂標的標籤、但對正常資料仍然泛化」的結果。統一的解釋是軟性的歸納偏好:不去限制模型能表達什麼,而是讓它很靈活,但偏好和資料一致的簡單解。所以深度學習並沒有那麼神秘。
實務建議:一定要保留 validation / test 集;避免過擬合用更多資料(augmentation、合成資料)和正則化(Dropout、weight decay、early stopping);模型大小要適度,但「適度」不一定是小,過大模型加正則化反而更好;記得過參數不等於必然過擬合。
這個模組最常被講錯的幾句話。