NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 B · 模組 B3動手做 // 三個實驗台

看懂 learning curve

看到一條曲線,怎麼判斷是 optimization 還是 generalization 出問題?第一個該調的是什麼?

訓練一個網路時,你唯一能一直看到的東西,是兩條隨時間往下走(或沒往下走)的線:training loss 和 validation loss。這個模組教你讀這兩條線。先分清楚是「學不會」(optimization)還是「學會了但換資料就不行」(generalization),再決定要動哪個旋鈕。答案通常是:先動 learning rate。

SEC.01 / DIAGNOSIS

先問一題:train loss 降得下去嗎?

講義把所有訓練問題先切成兩類。Training loss 降不到合理範圍:模型連看過的資料都學不會,這是 optimization 或程式的問題。Training loss 很好、validation 明顯變差:模型背下了訓練資料,換一批就不行,這是 generalization 的問題。兩類的對策完全不同,所以先分類,再動手。下面這個練習台每次隨機產生一組曲線,你來判斷是哪一種。

PROBE A / 這條曲線怎麼了動手做 // 出一題、選原因、看答案
training lossvalidation loss
最後的 train loss / val − train 的差距—
val loss 最低點在第幾個 epoch / 之後回升多少—
最後 10 個 epoch,train loss 每 epoch 變化(最小平方法斜率)—
抖動程度(相鄰兩點平均跳多少)—
答對 / 作答0 / 0
判定先選一個原因,再按「看答案」
對策按「看答案」揭曉
講義怎麼說按「看答案」揭曉
右邊的數字是真的從曲線算出來的,用它們幫你判斷:差距大、val 有回升是過擬合;斜率還明顯往下是沒跑完;loss 還很高時,一路緩慢直線往下是 LR 太小,一開始降一點就平掉是欠擬合;抖動很大是步子太大。曲線是用「指數衰減 + 雜訊」這類簡單公式、每題隨機挑參數產生的,數字是示意,不是真的訓練紀錄。
先分類,再處方train 降不下去是 optimization;train 好、val 差是 generalization。兩者的藥完全不同,先別急著換 optimizer。
形狀比數字先說話Underfit:兩條都高。Healthy:一起下降、差距可控。Overfit:train 繼續降,val 反彈。
一次只改一個同時改 LR、batch、augmentation、weight decay,就算變好也不知道是誰的功勞,調參會變成無法解釋的亂試。
細看 · Babysitting 流程、三種曲線、該監控的 signal、NaN 定位

Babysitting:正式訓練前的四步。講義把它叫「照顧訓練過程」,順序是:

  • 前處理:減掉平均(zero-centered)、除以標準差(每個特徵差不多同一個尺度)。程式就是 X -= np.mean(X, axis=0)、X /= np.std(X, axis=0)。影像的像素本來就都在 0 到 255,所以除標準差不是必要的。
  • 資料切分:小資料時代常用 70/30 或 60/20/20(train / validation / test)。百萬筆資料可以切 98% / 1% / 1%;超過百萬筆,dev 和 test 各 0.25% 就夠。訓練和測試資料來自不同分佈時,再多切一份 training-dev,才知道問題出在哪一段。
  • 選架構:先選一個容量夠大、能把訓練資料擬合到甚至過擬合的模型。訓練的第一個目標是「至少要能 overfit」。
  • 試跑:長時間訓練前先跑 3 到 5 個 epoch,確認一切正常。三個檢查:(1) 初始 loss 合不合理:K 類分類、預測接近均勻時,cross-entropy 應該接近 log K;CIFAR-10 有 10 類,−ln(0.1) ≈ 2.302。這一步要先關掉正則化,只看資料本身的 loss。(2) 加上正則化,loss 應該上升,沒升代表正則化沒接上。(3) 小子集過擬合:只拿 32 到 128 個樣本、關掉強的 augmentation,模型應該能把它們背下來。連這都做不到,問題不是正則化,而是 pipeline、loss 或梯度。

講義建議的 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:

  • Gradient norm:每一層和整體的梯度大小。找梯度消失、突然暴衝、或某一層根本沒接上(梯度是 0)。
  • Update ratio:‖ΔW‖ / ‖W‖,每一步權重改了自己的幾成。找「幾乎沒動」和「每步改太多」的層。
  • Logit / activation scale:softmax 飽和、activation 出現極端值。NaN 和 Inf 往往先在這裡冒出來。

NaN / Inf 的定位流程:依序檢查 (1) activation 是不是有限值 → (2) loss 是不是有限值 → (3) gradient 是不是有限值 → (4) optimizer 的狀態是不是有限值 → (5) 回頭找第一個出錯的運算。

Training diagnostics:先找 failure,再調超參數。講義的對照表:

觀察較可能的問題優先處理
train 很高、降很慢Optimization failureLR、optimizer、conditioning、normalization
train 震盪或 spike步幅、數值穩定性LR、warmup、gradient clipping、precision
train 好、val 變差Generalization failuredata、augmentation、weight decay、early stopping
train、val 都差underfit 或 pipeline 錯誤先做資料與程式 sanity check,不要急著換 optimizer

總結的決策樹:train loss 能降到合理範圍嗎?不能 → 依序檢查資料與標籤、initial loss、梯度存不存在、LR/尺度/數值。能 → validation gap 大嗎?大 → generalization、洩漏或分佈偏移;小但表現仍差 → 容量、目標函數或資料品質。

SEC.02 / LEARNING RATE SCHEDULE

第一個該調的:learning rate,而且要隨時間變

講義說 learning rate 是最先該調的超參數。太小:很穩,但進度太慢。太大:震盪、loss 突然暴衝、甚至發散。合理的 LR 會先快速下降、再慢慢細修。而且它不該從頭到尾一樣大:前期大步探索,後期小步收斂。怎麼隨時間變,就叫 LR schedule。下面左邊畫五種 schedule 的形狀,右邊拿同一個小問題、同一串雜訊,真的用每一種 schedule 跑梯度下降。

PROBE B / 五種 LR schedule 賽跑動手做 // 選 schedule,拉 peak LR、warmup、總步數

LR 隨步數的形狀

選中的 schedule其他四種

真的跑出來的 loss(對數刻度,25 步移動平均)

選中的其他四種
選中的 schedule:最後的 loss—
狀態 / 最後一步的 LR—
五種的最後 loss(由低到高,發散的排最後)—
實際用的 warmup 步數—
這個玩具問題是真的在算:兩個權重,loss = Σ λᵢxᵢ²/2 + 0.5·xᵢ⁴/4(λ = 1 和 0.08,一個陡方向、一個緩方向),從 (3, 3) 出發,每一步的梯度加上固定種子的雜訊,模擬 mini-batch 的隨機性。離谷底遠時地形很陡(四次方項),所以一開始就用大 LR 會直接飛出去:把 peak LR 留在 0.6,看 Step decay 和 Cosine(沒有 warmup)發散,有 warmup 的三種卻沒事。這時 one-cycle 最低:它的 LR 從峰值的 1/10 爬上去,最後降好幾個數量級,雜訊被壓得最小。再把 peak LR 降到 0.1,大家都穩了,排名卻換了:WSD 最低(大半時間維持峰值走得遠,最後才降到 0),one-cycle 反而最差,因為它平均 LR 太小,緩的那個方向還沒走到谷底。沒有一種 schedule 永遠最好,它和 peak LR 要一起選。所有參數都是示意。
LR 一次調一個數量級0.1 → 0.01 → 0.001。LR 乘在梯度上,效果是倍數的,所以用對數尺度試,0.01 或 0.001 是常見的起點。
前大後小前期大步走得快,後期小步才停得穩。LR 不降,雜訊會讓參數一直在谷底附近晃,loss 下不去。
Warmup 防開局發散剛開始的地形最亂,先用很小的 LR 慢慢升到峰值。Transformer、LLM、ViT 幾乎必備。
細看 · LR 怎麼選、decay、step vs cosine、LR finder、one-cycle、WSD 與 WSqD

經驗值:大多要試才知道,通常不會大於 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⁻¹。

SEC.03 / FLAT VS SHARP MINIMA

同樣低的谷底,為什麼有的谷泛化比較好

把 training loss 降到很低,不代表事情結束了。停在哪一種谷底也很重要。又深又窄的谷(sharp minimum):訓練誤差極低,但資料一點點改變就跌倒。又寬又平的谷(flat minimum):對資料的小變動不敏感,泛化通常比較好。測試資料和訓練資料總有一點不同,可以想成「整條 loss 曲線被推歪了一點」。下面就把它推推看。

PROBE C / 平坦谷 vs 尖銳谷動手做 // 拉「測試分佈偏移」
training losstest loss(平移過)
尖銳谷底的曲率(越大越尖) / 平坦谷底的曲率—
尖銳谷:train → test loss—
平坦谷:train → test loss—
判定—
谷底的位置是用 golden-section search 在曲線上真的找出來的,曲率用中央差分算。偏移 0 時兩個谷的 train 和 test 一樣,而且尖銳谷的 train loss 還比較低,只看 training loss 你會選它。往右推一點:尖銳谷的 test loss 暴增,平坦谷幾乎不動。再把尖銳谷的寬度拉大,它就沒那麼怕偏移了。曲線形狀和偏移量都是示意。
平坦谷不怕偏移谷底附近都差不多低,權重或資料稍微變一點,loss 幾乎不變。尖銳谷差一點就爬上山壁。
SGD 自己偏好平坦谷就算沒加 L1、L2 正則化,SGD、Adam 也傾向找平滑、寬廣的解,這叫 implicit regularization(隱式正則化)。
所以大模型不一定過擬合大模型能背下一切,但訓練過程偏好有結構的解。講義的比喻:背死書是過擬合,理解原理是泛化。
細看 · Bias / variance、傳統觀點、double descent、150 階多項式

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);模型大小要適度,但「適度」不一定是小,過大模型加正則化反而更好;記得過參數不等於必然過擬合。

SEC.04 / MISCONCEPTIONS

常見誤解

這個模組最常被講錯的幾句話。

loss 在下降,就是在進步。要同時看 val:train 降、val 升是過擬合。而且下降得太慢可能只是 LR 太小,初始 loss 也要先對照 log K 確認合理。
大模型一定會過擬合。過參數不等於必然過擬合。SGD 的隱式偏好會找平坦、簡單的解,double descent 顯示模型更大時測試誤差可能再次下降。過大模型加正則化常常更好。
LR 越小越安全。太小很穩但進度太慢,甚至卡在高點不動。大 LR 本身還有正則化效果(super convergence)。該做的是用 LR finder 找,加上 warmup 和 decay。
val loss 一上升就立刻停。val 有雜訊,一兩個 epoch 的回升可能只是抖動,要看趨勢(講義的 ReduceLROnPlateau 也等 3 到 5 次)。先確認不是 LR 太大造成的震盪;early stopping 是留下 val 最低點的 checkpoint。