搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    L1.4 14 分鐘閱讀 2026年10月

    L1.4 該收資料、換模型,還是多訓幾輪:學習曲線

    三個提案,只有一筆預算

    模型上線前的最後一次會議。目前的表現不夠好,三個人各有提案:

    • A:「資料太少,再標一萬筆。」——三個月,六位數的標註費。
    • B:「模型太小,換一個大十倍的。」——兩週實作,訓練成本上升五倍。
    • C:「訓練不夠久,多跑幾輪。」——便宜,但如果沒用就是白等。

    三個提案都值得考慮,但目前分數還不能告訴我們哪一個有效。能不能先做規模較小的對照,觀察改動資料量、容量與訓練時間後,表現如何變化? Learning curves 提供的是這些證據,不是預先知道結果的保證。

    方法在你手上的資料裡:把手上的資料只用一部分去訓練,畫出「誤差如何隨可用資料量變化」的曲線,看它往哪裡走。同樣的手法對容量與訓練步數也適用。三條曲線,三個處方。

    這一篇是 L1 的收束:把前四篇的概念(訓練/泛化誤差、bias–variance、切分、交叉驗證)變成一張可以在會議上畫出來的圖。

    模型不夠好:該去收更多資料、換更大的模型,還是多訓幾輪?
    三件事都要花錢,
    能不能在花之前就知道哪一個有效?

    課堂提問Q1

    把三個提案翻成三條曲線:橫軸各是什麼、要畫哪兩條線?「加資料會不會有用」這個問題,在圖上是看哪一個特徵?

    先想一想,再展開看整理後的答案

    三條曲線,每條都畫兩線(訓練誤差與驗證誤差,後者用留出集或 只有三十筆資料:交叉驗證 估):

    曲線橫軸對應的提案
    學習曲線訓練資料量 nn(用手上資料的子集)A:加資料
    容量曲線模型大小 / 複雜度B:換模型
    訓練曲線訓練步數C:訓久一點

    「加資料會不會有用」看的是學習曲線上的兩個特徵:

    1. 兩條線之間的間距。 間距大 = variance 主導 = 加資料會把間距壓小 → 有用。
    2. 兩條線收斂到的高度。 若它們已經幾乎重合,就看那個共同高度離「不可約誤差」多遠。差很多 = bias 主導 = 再多資料也停在那裡 → 沒用,該換模型。

    這正是不必先花三個月就能回答 A 的方法——用 n/8n/8、n/4n/4、n/2n/2、nn 的子集各訓一次,看趨勢。

    加資料值不值得,看的是那兩條線會合在多高的地方。

    三種形狀,三張處方

    學習曲線(誤差對資料量)的兩種典型形狀:

    • 高原很高、兩線早早重合 → 欠擬合 / bias 主導。加資料無效。處方:放大容量、加更有資訊的特徵、或檢查最佳化是否收斂。
    • 兩線間距大、驗證線仍在下降 → variance 主導。處方:加資料(曲線的斜率直接告訴你加多少大概能換到多少)、或縮小容量、加正則化。

    容量曲線是 背考古題的學生:過擬合與欠擬合 的 U 形:左側欠擬合、右側過擬合、谷底是當前資料量下的最佳。它回答 B,而且要注意谷底會隨 nn 移動——所以 A 與 B 的答案彼此相關。

    訓練曲線(誤差對步數)有三種讀法:兩線都還在降 → 訓久一點(C 有效);訓練線降而驗證線開始上升 → 該提早停止;訓練線卡住不降 → 這不是泛化問題而是最佳化問題,回去看學習率(霧中下山,一步該走多大:梯度下降的一頁)。

    一個貫穿三張圖的參考線:不可約誤差。沒有它,你不知道「高原很高」的「高」是相對於什麼。共用 toy 裡它是 0.02250.0225;真實專案裡用重複量測的散佈或人類專家的一致性來估。

    三條診斷曲線與它們的處方

    圖說: 學習、容量與訓練曲線回答三種不同的診斷問題;不可約誤差提供必要的比較基準。

    曲線的形狀從哪裡來

    用 十個房仲各看一百間房:Bias 與 Variance 的分解看學習曲線。固定演算法,資料量 nn:

    E[R(f^n)]=EXVar(Y∣X)⏟不可約+EXbiasn(X)2⏟平均預測的偏差+EXVarD(f^n(X))⏟重抽訓練資料的變動.\mathbb E\big[R(\hat f_n)\big]=\underbrace{\mathbb E_X\mathrm{Var}(Y\mid X)}_{\text{不可約}}+\underbrace{\mathbb E_X\mathrm{bias}_n(X)^2}_{\text{平均預測的偏差}}+\underbrace{\mathbb E_X\mathrm{Var}_D(\hat f_n(X))}_{\text{重抽訓練資料的變動}}.

    Bias 與 variance 都可能依 nn 改變。某些固定模型的 bias 很快接近一個正值,variance 則下降,於是形成高原;這是常見模式,不是上式保證的唯一形狀。Training 與 validation 的間距是 generalization gap,不能直接等同 variance 或 estimation error。

    驗證線 ↘ σ2+bias2 ↖ 訓練線\text{驗證線}\ \searrow\ \sigma^2+\mathrm{bias}^2\ \nwarrow\ \text{訓練線}

    這給了一個不用花錢的預測法:畫出 n/8,n/4,n/2,nn/8,n/4,n/2,n 四個點,看兩條線夾向的高度。若那個高度已經接近不可約誤差,加資料的天花板很低;若還很高,你就知道要換的是模型而不是資料量。(把驗證線外推得更遠、預測「再加十倍資料能到多少」,在很多任務上遵循冪律,這是 scaling law 研究的起點——參考文獻 2。但外推有風險,見下面的 Details。)

    注意外推學習曲線的兩個陷阱

    陷阱一:冪律只在中段成立。 實務上 log⁡(誤差)\log(\text{誤差}) 對 log⁡n\log n 常常近似直線,於是很容易用兩三個點外推十倍。但這條直線在兩端都會失效:nn 很小時模型還在「什麼都學不到」的區域,nn 很大時會撞上 σ2+bias2\sigma^2+\mathrm{bias}^2 的地板而彎平。外推超過一個數量級以上要非常小心,而且至少要有四到五個點才看得出是不是真的直線。

    陷阱二:加的資料不是同一種資料。 曲線是用「現有資料的子集」畫的,所以它預測的是「更多同分佈的資料」的效果。真實的「再標一萬筆」往往來自不同時間、不同標註員、不同來源——那是另一個分佈,曲線不適用(台北的房仲去台中:風險與經驗風險 的第二段落差)。

    一個折衷的做法:畫曲線時同時記錄「若把最新一批資料當驗證集」的表現。如果子集曲線很樂觀而最新批次的表現持平,那你面對的是偏移,不是資料量。

    把三個提案排出優先順序

    便宜的先做。 C(多訓幾輪)與「檢查最佳化」幾乎不花什麼成本,先排除。做法:看訓練誤差是否還在降、以及是否已經低於不可約誤差水準。

    接著做小資料測試。 固定一小批資料,暫時降低 augmentation 與 regularization,確認 loss、梯度與模型是否能擬合。做不到值得檢查程式、容量與最佳化;做得到也只驗證這個小測試,不代表完整任務已經沒有問題。

    再畫學習曲線。 用 n/8n/8 到 nn 的子集。兩線間距大且驗證線還在降 → A 有效,而且斜率告訴你大概能換到多少。兩線已重合在高高原 → B。

    這一切依賴什麼。 一,驗證集夠大,否則曲線的抖動比訊號大(本節最後會量)。二,每個子集都重跑完整流程(含超參數選擇)——只用大資料調好的超參數去跑小子集,畫出來的曲線會低估小資料的表現,讓「加資料」看起來比實際更有效。三,子集是隨機抽的且與整體同分佈。

    三條曲線的實測

    曲線一:誤差對資料量。 兩個模型——d=2d=2(容量不足)與 d=12d=12(容量充裕),每個 nn 重複 60 次取中位數:

        n |    d=2 訓練    d=2 風險 |   d=12 訓練   d=12 風險
       10 |    0.1393    0.2904 |       —          —
       20 |    0.1720    0.2493 |    0.0071     3.7113
       40 |    0.2007    0.2409 |    0.0138     0.0458
       80 |    0.2125    0.2275 |    0.0181     0.0282
      160 |    0.2129    0.2246 |    0.0205     0.0247
      320 |    0.2162    0.2227 |    0.0214     0.0235
      640 |    0.2182    0.2213 |    0.0219     0.0229

    兩個模型的曲線形狀完全不同,處方也相反。

    d=2d=2:訓練誤差上升(0.139→0.2180.139\to0.218)、風險下降(0.290→0.2210.290\to0.221),兩條線在 n=160n=160 左右就幾乎貼在一起,高原是 0.220.22。而不可約誤差是 0.02250.0225——高原比地板高了十倍。 從 n=160n=160 到 640640 資料量翻了四倍,風險只從 0.22460.2246 改善到 0.22130.2213(1.5%1.5\%)。結論:對這個模型,A 提案是白花錢。 而且這個結論在 n=160n=160 時就看得出來,不需要真的去蒐集 640640 筆。

    d=12d=12:n=20n=20 時兩線間距是天文數字(0.00710.0071 對 3.713.71,模型比資料點還多的區域);到 n=640n=640 兩線收斂到 0.02190.0219 與 0.02290.0229,高原幾乎就是不可約誤差 0.02250.0225。結論:A 提案有效,而且已經接近兌現完畢——再加資料的天花板只剩 0.00040.0004。

    把兩欄並排讀還有一個推論:在 n=40n=40 的時候該選 d=12d=12 嗎? d=2d=2 是 0.24090.2409、d=12d=12 是 0.04580.0458,選 d=12d=12。但在 n=20n=20 時 d=12d=12 是 3.713.71,該選 d=2d=2。最佳模型隨資料量改變——這是容量曲線的谷底會移動的另一種說法。

    曲線二:誤差對訓練步數。 n=150n=150(3030 訓練 / 120120 驗證)、d=29d=29 的模型,用固定學習率的全批次梯度下降:

         步數        訓練        驗證      真實風險
          100    0.0713    0.1167     0.1317
         1000    0.0516    0.0905     0.1015
        10000    0.0302    0.0476     0.0502
       100000    0.0196    0.0290     0.0290
      1000000    0.0147    0.0324     0.0318
      5000000    0.0130    0.0434     0.0458
    
    驗證最低點:第 179270 步,驗證 0.0284,真實風險 0.0277

    訓練誤差單調下降,驗證誤差先降後升。 最低點在約 1818 萬步;繼續訓到 500500 萬步,訓練誤差又降了 12%12\% 而真實風險惡化了 65%65\%(0.0277→0.04580.0277\to0.0458)。

    關鍵是:這裡的模型沒有換、資料沒有變、正則化沒有調——只有「訓練多久」這一個設定,就走完了從欠擬合到過擬合的全程。

    「訓練時間」本身就是一個容量設定。

    這也就是提早停止(early stopping)的全部內容:在驗證曲線的最低點停下來。它是最便宜的正則化,代價只是要維護一份驗證集。

    Validation 用來挑 stopping time 後,勝出的 validation 分數也有 selection bias,仍需要獨立 test 評估。本次 toy 能另算 population risk,才看得到兩者的差異。

    刻意違反:把驗證集縮小。 固定一個模型(真實風險 0.02580.0258),用不同大小的驗證集去估它,各重複 2000 次:

    驗證集  15 筆:估計值 0.0257 ± 0.0092   (95% 區間寬度 ≈ 0.0368,相對於真值 143%)
    驗證集  60 筆:估計值 0.0260 ± 0.0046   (95% 區間寬度 ≈ 0.0185,相對於真值  72%)
    驗證集 240 筆:估計值 0.0259 ± 0.0023   (95% 區間寬度 ≈ 0.0094,相對於真值  36%)

    三個估計都無偏(0.02570.0257、0.02600.0260、0.02590.0259 對真值 0.02580.0258)——沒有人在說謊。但 15 筆驗證集的 95%95\% 區間寬度是被估量的 143%143\%:你畫出來的那條曲線,上下抖動的幅度比它要顯示的趨勢還大。 在這樣一條曲線上判斷「驗證誤差開始上升了」或「加資料還有沒有用」,讀到的是噪聲。

    而且注意這只是單一點的抖動;一條曲線有十幾個點,每個點都在自己抖,人眼很容易在噪聲裡看出並不存在的轉折。實務規則:要用曲線做決定,先確認相鄰兩點的差距大於誤差棒。做不到就先擴大驗證集(或改用 只有三十筆資料:交叉驗證),不要先改模型。

    三條曲線並排,附誤差棒

    互動 demo:三條曲線問的是三個不同的問題,所以該做的下一件事也不一樣。

    檢查理解

    想一想

    一條學習曲線:訓練誤差 0.190.19、驗證誤差 0.200.20,兩者從 n=200n=200 之後就幾乎不再變化;已知任務的不可約誤差約 0.020.02。下列哪個提案最不可能有效?

    想一想

    在訓練曲線的實測裡,第 5 000 0005\,000\,000 步的訓練誤差(0.01300.0130)比第 100 000100\,000 步(0.01960.0196)更低,但真實風險更差(0.04580.0458 對 0.02900.0290)。這說明:

    想一想

    在 n=20n=20 時 d=12d=12 的風險是 3.713.71,在 n=640n=640 時是 0.02290.0229;d=2d=2 則從 0.24930.2493 到 0.22130.2213。一位同事總結:「所以我們該用 d=12d=12。」最完整的回應是:

    參考文獻

    1. Ng, A. Machine Learning Yearning 2018, Ch. 20–32.(把學習曲線當成專案決策工具的實務版本,含各種形狀對應的處方。)
    2. Hestness, J. et al. Deep Learning Scaling is Predictable, Empirically. arXiv 2017.(誤差對資料量的冪律在多個領域的實測,以及它在兩端如何失效。)
    3. Prechelt, L. Early Stopping — But When? Neural Networks: Tricks of the Trade, Springer 1998.(提早停止的判準比較:什麼時候該停、驗證曲線的噪聲怎麼處理。)