搜尋課程與筆記

搜尋筆記

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

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

    L3.0 14 分鐘閱讀 2026年10月

    L3.0 火力與時間是食譜的一部分,還是煮的時候決定的?

    食譜上的與鍋子前的

    一份食譜會寫「牛肉 300 克、醬油兩大匙」。它不會寫「第 7 分 32 秒時把火轉到 62% 並把鍋鏟往左移三公分」。

    前者是事先決定、寫在紙上、每次照做的;後者是站在鍋子前、看著現場調整出來的。

    訓練一個模型也有這兩層。網路的每一個權重是站在鍋子前調出來的——最佳化器看著資料,一步一步把它們挪到位。而「用幾層」「學習率多少」「訓多久」則是事先寫下來的:最佳化器不會去動它們,因為它們定義了那個最佳化問題本身。

    前幾篇出現了不少設定。就像試煮食譜,這鍋煮得順不順,與換一批食材後是否仍好吃,是不同問題。我們要選的是訓練損失最低的設定,還是對新資料最好用的設定? 同一個數字未必能回答兩者。

    哪些東西是事先寫在紙上的,哪些是現場調出來的?
    既然兩者都在「讓損失變小」,
    為什麼只有後者可以看訓練集?

    課堂提問Q1

    把「參數」與「超參數」的分界寫清楚:判準是什麼?把前面三個 class 出現過的超參數分類——哪些控制假設空間的大小、哪些控制最佳化的行為?以及,為什麼「用訓練誤差選超參數」一定會選到某一端?

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

    判準是「誰決定它」,不是「它重不重要」。

    θ^(λ)=arg⁡min⁡θ R^n(fθ;λ).\hat\theta(\lambda)=\arg\min_{\theta}\ \widehat R_n\big(f_\theta;\lambda\big).

    θ\theta 是那個 arg⁡min⁡\arg\min 裡面的東西(最佳化器動它);λ\lambda 是寫在式子外面、定義了那個 arg⁡min⁡\arg\min 長什麼樣的東西(你動它)。學習率不在式子裡,但它決定 arg⁡min⁡\arg\min 實際上怎麼被求解,所以也在外面。

    分成兩類,因為它們壞掉的方式不同。

    控制假設空間(容量)控制最佳化
    例子多項式次數、層數、寬度、L2L_2 的 λ\lambda、dropout 率學習率 η\eta、batch size、動量 β\beta、初始化的 gain、訓練步數
    調錯的徵狀U 形的兩端:欠擬合或過擬合發散、卡住、或走不完(霧中下山,一步該走多大:梯度下降的一頁 的三種)
    診斷工具該收資料、換模型,還是多訓幾輪:學習曲線 的兩條曲線損失曲線的形狀、λmax⁡\lambda_{\max} 與條件數

    為什麼它不能單獨選容量? 若 F1⊆F2\mathcal F_1\subseteq\mathcal F_2,精確求得的最小訓練誤差滿足 min⁡f∈F2R^n(f)≤min⁡f∈F1R^n(f)\min_{f\in\mathcal F_2}\widehat R_n(f)\leq\min_{f\in\mathcal F_1}\widehat R_n(f)。較大的集合至少可以沿用較小集合的答案。

    因此最大容量總是某個訓練誤差最小的候選,卻不一定是唯一候選:資料已被內插時可能並列,實際求解還有數值與最佳化誤差。真正缺少的是新資料的代價,而不是「再多跑幾次」就能補上的資訊。

    兩類超參數,兩種調法

    分成兩類之後,調的順序就清楚了:先讓它能訓,再讓它訓得對。

    最佳化那一類先調,因為它們壞掉時會掩蓋其他所有訊號。一個 η\eta 越過穩定門檻的模型,你從它的驗證分數上讀不出任何關於容量的資訊——它根本沒開始學。判斷方式在 霧中下山,一步該走多大:梯度下降的一頁 與 同一張地圖從不同地方出發:損失曲面與初始化 都給過:看損失曲線有沒有在降、梯度的量級對不對、小資料能不能過擬合。

    容量那一類後調,而且要用 該收資料、換模型,還是多訓幾輪:學習曲線 的兩條曲線判斷方向:間距大就往下調(或加資料),兩線重合在高原就往上調。

    還有一類超參數同時屬於兩邊,而它們是最容易出事的:

    • 訓練步數:既是最佳化預算,也可能限制學到的特徵方向;在線性二次模型中,和 ridge 的尺度關係約是 λ≈1/(ηt)\lambda\approx1/(\eta t),不是完全等價。
    • 學習率:既決定能不能收斂,也透過上面那條式子決定隱含的正則化強度。
    • batch size:既決定每步的成本,也決定噪聲地板(民調只問一千人:小批次與噪聲 的 η/B\eta/B)。

    這三個不能用「它是最佳化超參數,所以看訓練誤差沒關係」來處理,本篇最後會回到這件事。

    兩類超參數,兩種壞掉的方式

    圖說: 容量超參數要看泛化曲線,最佳化超參數要看訓練動態;先確認最佳化正常,容量訊號才可信。

    訓練誤差選出來的不是選擇

    把 Q1 的論證量出來。每次抽 120 筆資料,切 60 訓練 / 30 驗證 / 30 測試,候選是 degree 11 到 1515,用兩種方式各挑一個,再看它們真實的風險。重複 200 次:

    fits = [Polynomial.fit(x[tr], y[tr], d) for d in DEG]
    te = [((f(x[tr]) - y[tr])**2).mean() for f in fits]   # 用訓練集挑
    ve = [((f(x[va]) - y[va])**2).mean() for f in fits]   # 用驗證集挑
      用訓練集選:選中的 degree 眾數 15(200 次裡 200 次)  選到上限的比例 100%  真實風險中位數 0.0530
      用驗證集選:選中的 degree 眾數  5(200 次裡  58 次)  選到上限的比例   3%  真實風險中位數 0.0262

    這次 200 次實驗都選了 degree 15,符合大空間對訓練誤差較有利的現象。但延長到 degree 30 後,可能出現並列最小或數值問題,不能保證每次一定選到 30。

    代價是真實風險的兩倍(0.05300.0530 對 0.02620.0262)。而且注意驗證集那一列的眾數是 5——正是 十個房仲各看一百間房:Bias 與 Variance 那張分解表裡 bias² 剛好降到 0.00000.0000、variance 還很小的位置。驗證集真的在做選擇,訓練集只是在複讀「越大越好」。

    用訓練誤差選容量,答案在看到資料之前就已經寫好了。

    補充那為什麼權重可以用訓練誤差決定?

    同一份資料,決定權重可以、決定容量不行——這個不對稱要分清楚。

    差別在候選的數量與它們的自由度。給定容量之後,權重是在一個受限的空間裡被挑的,而那個限制正是讓「訓練誤差低」對「真實風險低」有意義的東西(房仲怎麼估價:從例子學規則 的 Details 講過:把 F\mathcal F 設成所有函數,ERM 就退化成內插)。容量這個超參數做的事,是選擇那個限制本身——它在比較「限制強一點」與「限制鬆一點」,而訓練誤差對後者永遠比較友善。

    換句話說:訓練誤差可以在一個固定的假設空間裡挑一個好的 ff,但它沒有能力比較兩個大小不同的假設空間,因為它完全沒有計入「大空間比較容易在這些點上好看」這件事。統計學上補這個洞的方法是加一個隨複雜度成長的懲罰(AIC、BIC、MDL 都是這個形狀),而實務上更直接的方法就是留一份資料。

    那「最佳化超參數」呢?

    上面的論證是針對容量的。一個很自然的反問是:學習率、訓練步數這些不影響假設空間,用訓練誤差選應該沒關係吧?

    這個說法對其中一部分成立,對另一部分是陷阱。

    成立的部分:純粹的最佳化選擇——例如「同樣的模型與步數,哪個 η\eta 讓訓練損失降得最低」——確實可以用訓練損失判斷,因為那個問題問的就是「誰把這個 arg⁡min⁡\arg\min 求得比較好」。一個 η 不夠用:動量與 Adam 各買到什麼 的那張表(GD 0.026660.02666、動量 0.015960.01596、Adam 0.016380.01638,直接解 0.014660.01466)就是這樣讀的:它比較的是求解的效率,而參照點是那個已知的直接解。

    陷阱的部分:只要那個超參數同時是隱含的正則化,用訓練誤差選就會再次退化成「選某一端」。

    訓練步數是最清楚的例子。 該收資料、換模型,還是多訓幾輪:學習曲線 量過同一個模型跑到五百萬步:

         步數        訓練        驗證      真實風險
          100    0.0713    0.1167     0.1317
        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

    訓練誤差單調下降(0.0713→0.01300.0713\to0.0130),真實風險在十八萬步左右觸底之後回升到 0.04580.0458。 用訓練誤差選「訓多久」,答案永遠是「訓到底」——又是一個在看到資料之前就寫好的答案,而且它讓真實風險差了 65%65\%。

    學習率也可能改變有限步下學到的解,但一般不具備容量那種巢狀集合的單調性:太大會不穩定,太小可能尚未學好。可以用訓練損失排除無法有效求解的設定;最後若要比較泛化,仍需留出資料。

    一個超參數只要同時影響「求解的效率」與「求到哪一個解」,它就不能用訓練誤差選。

    實用的判準是先寫清楚問題:我是在比較求解這個訓練目標的效率,還是在選新資料上較好的模型? 後者不能只靠訓練誤差;超參數是否單調,並不是唯一判準。

    這一切依賴什麼。 一,驗證集本身要乾淨(老師用考古題教學又出題:為什麼要切資料 的三條規則),而且每一個候選的整條流程都要在切分之後重跑。二,上面的實驗是在一條巢狀的候選鏈上做的;比較兩個彼此不包含的架構時「單調」不成立,但「訓練誤差對大空間比較友善」的偏差仍然在。三,n=120n=120 的驗證集只有 30 筆,所以那個中位數 0.02620.0262 本身有不小的抖動(只有三十筆資料:交叉驗證 量過那個抖動有多大)。

    一份可以照著走的順序

    把 L2 與 L3 的東西合起來,一個實際的調參順序是:

    1. 先讓它能訓。 固定一組合理的容量,掃 η\eta 找到會炸的值再退三到十倍;確認損失真的在降;做小資料過擬合測試。這一步用訓練損失判斷,因為問的就是求解效率。
    2. 再定容量。 用驗證集(或 只有三十筆資料:交叉驗證)掃容量與正則化強度。這一步一定用留出資料。
    3. 回頭微調最佳化。 容量換了之後,λmax⁡\lambda_{\max} 與條件數都變了,第 1 步的結論要重驗一次。
    4. 只在最後看一次測試集,而且要先寫下你預期會看到多少。

    第 3 步常常被跳過,但它是「兩類超參數互相耦合」的直接後果——這也是為什麼超參數搜尋不是「一個一個獨立地調」,而是下一篇要處理的在一個空間裡搜尋。

    兩類超參數、兩種選法

    互動 demo:用訓練誤差挑超參數,100% 挑到複雜度上限;換成驗證集,眾數落在真正的最佳附近。

    檢查理解

    想一想

    一個團隊用訓練損失比較了三種 batch size(32/128/512),發現 32 的訓練損失最低,於是決定用 32。這個判斷:

    想一想

    實測裡「用訓練集選 degree,200 次有 200 次選到上限 15」。若把候選清單延長到 degree 30,最可能的結果是:

    想一想

    下列哪一個超參數最不適合用訓練損失來選?

    想一想

    下列哪一句不對?

    參考文獻

    1. Bergstra, J., Bengio, Y. Random Search for Hyper-Parameter Optimization. JMLR 2012.(超參數的分類與搜尋;下一篇的主題,但它對「哪些超參數重要」的實證分析在這裡就用得上。)
    2. Hastie, T., Tibshirani, R., Friedman, J. The Elements of Statistical Learning, 2nd ed. Springer 2009, Ch. 7.2, 7.10.(訓練誤差為何對複雜度單調、以及用懲罰項或留出資料補洞的兩條路線。)
    3. Dodge, J. et al. Show Your Work: Improved Reporting of Experimental Results. EMNLP 2019.(把「調了多少」當成結果的一部分報告;本篇第 4 步與下兩篇的動機。)