搜尋課程與筆記

搜尋筆記

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

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

    L3.3 13 分鐘閱讀 2026年10月

    L3.3 同一個實驗跑三次結果都不同,該報哪一個?

    本篇重用1 篇

    三次結果都不一樣

    你把同一份程式跑了三次,只換了 random seed。測試準確率是 0.8310.831、0.8470.847、0.8220.822。

    該報哪一個?

    「報最好的 0.8470.847」聽起來有點心虛但很常見——畢竟那確實是你跑出來的。「報平均 0.8330.833」比較誠實。「三個都報」看起來很囉唆。

    而真正的問題還在後面:你的同事用 baseline 跑了三次,得到 0.8180.818、0.8350.835、0.8090.809,報了 0.8350.835。你比他好 1.21.2 個百分點。這代表什麼?

    看那六個數字就知道:兩組的範圍幾乎完全重疊。1.21.2 個百分點的「優勢」小於任何一組自己的散佈。

    這一篇要把這件事變成兩張可以直接使用的表:取最好的那一次能無中生有多大的差距,以及要幾個種子才分得出一個真實的差距。

    同一個實驗跑三次結果都不同,該報哪一個?
    如果兩個方法其實一樣好,
    「各跑三次、各報最好」會讓贏家看起來好多少?

    課堂提問Q1

    把「該報哪一個」翻成統計問題:你在估的是什麼?「取最好的 kk 次」與「取中位數」各是那個量的什麼估計?以及,為什麼兩個方法各自跑 kk 次再比最好的,會系統性地製造差距?

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

    在估什麼。 一次實驗的結果 XX 是一個隨機變數,隨機性來自初始化、minibatch 順序、資料增強的抽樣、以及非確定性的 GPU 運算。你真正想知道的是這個方法的典型表現——也就是 XX 的分布的一個中心位置(平均或中位數)。

    兩種報法估的不是同一個東西。

    • 平均在獨立同分布、期望有限時無偏;若變異數有限,標準誤為 σ/k\sigma/\sqrt{k}。樣本中位數不一般無偏;在唯一中位數附近密度正且夠平滑時,才有常見的 1/k1/\sqrt{k} 漸近尺度。
    • 最好的那一次估的是分布的極值,不是中心。而且它隨 kk 系統性地往好的方向漂:kk 越大,max⁡\max 越大。它不是「比較樂觀的中心估計」,它根本不是中心的估計。

    兩個同分布方法獨立取最好結果,兩者的有號差在期望上仍為零;但事後把較好的叫作贏家,報的便是非負的絕對差。這會出現表面優勢,卻不代表取極值一定放大變異數;本篇表中的差距反而隨 kk 縮小。

    於是「贏家」一定存在——只要有兩個數字,其中一個就比較大。問題不是「誰贏」,而是贏多少才算有意義。而那個門檻由那個差的散佈決定,下一節把它量出來。

    先量抖動本身

    任何關於「差多少才有意義」的判斷,都要先知道單一次實驗的抖動有多大。

    沿用 同一張地圖從不同地方出發:損失曲面與初始化 那組設定(1→32→32→11\to32\to32\to1 的 tanh⁡\tanh 網路、Adam η=0.01\eta=0.01、4000 步、共用 toy),200 個 seed 的最終訓練 MSE:

    中位數 0.0034   標準差 0.0010   範圍 [0.0023, 0.0085]

    標準差是中位數的 29%29\%。 這個比例是後面每一個判斷的基礎——它告訴你「一次實驗」這個量測工具的解析度有多粗。

    真實任務上這個比例差異很大:影像分類的準確率可能只有 0.3%0.3\% 的抖動,強化學習可能超過 50%50\%。所以這個數字要在自己的專案上量一次,它比任何通用的建議都有用,而且只要跑五到十個 seed 就估得出來。

    兩個一模一樣的方法,各跑三次

    圖說: 只報每個方法最好的 seed 會憑空造出優勢;seed 數也決定能辨識多小的真實差距。

    第一張表:取最好的能無中生有多少

    模擬:兩個方法的結果都從那 200 個 seed 的分布裡抽,也就是它們真實品質完全相同。各抽 kk 個,各取自己最好的那一個,看「贏家」比「輸家」好多少(相對值)。重複兩萬次:

      k=  1  「贏家」比「輸家」好的幅度  中位數 16.9%   90 百分位 70.1%
      k=  3  「贏家」比「輸家」好的幅度  中位數 10.5%   90 百分位 26.8%
      k=  5  「贏家」比「輸家」好的幅度  中位數  8.9%   90 百分位 23.3%
      k= 10  「贏家」比「輸家」好的幅度  中位數  6.9%   90 百分位 19.1%

    這次重抽實驗中,k=3k=3 的假優勢中位數是 10.5%10.5\%,不是平均值。數字只描述這個訓練 MSE 分布,不能拿來校正另一個任務的準確率。

    只報各自最好的一次,不能把看起來的優勢直接當成方法的典型改善。

    這裡增加 kk 後差距變小,但最好結果仍不是中心估計。若分布有有限下界,樣本最小值可以收斂到支撐的下端點;所以不能說「極值不會收斂」。問題是它收斂的物件不是平均或中位數。

    所以問題不在種子數,在報法。 換成中位數之後,kk 增加就真的在買精度(1/k1/\sqrt k),這是下一張表的前提。

    注意隨機性的來源不只有 seed,而且有些不在你的控制裡

    上面模擬的隨機性來自初始化與訓練過程。真實實驗還有幾層:

    • 資料切分的隨機:換一個 train/val 切法,結果會變(只有三十筆資料:交叉驗證 量過單次留出的估計標準差是 0.40690.4069 而 5-fold 是 0.03040.0304)。這一層常常比 seed 更大,卻更少被重複。
    • 資料增強、dropout、shuffle 的抽樣:通常和 seed 綁在一起。
    • 非確定性的硬體運算:GPU 上的浮點加法順序不固定,所以同一個 seed 也可能給不同的結果。這一層無法用固定 seed 消除,只能用確定性模式(通常更慢)或接受它。

    實務上的建議是:重複的時候把能重抽的都重抽(seed 與資料切分一起換),因為你要估的是「這整套流程的表現」,不是「在這個特定切分上的表現」。只固定切分而換 seed,會系統性地低估抖動。

    要跑幾次,先看我們要比較的差值

    讓第 ii 次配對結果為 Di=XiA−XiBD_i=X_i^A-X_i^B。若各次重複獨立,差值有有限變異數 σD2\sigma_D^2,則

    Dˉ=1k∑i=1kDi,SE⁡(Dˉ)=σDk.\bar D=\frac1k\sum_{i=1}^kD_i, \qquad\operatorname{SE}(\bar D)=\frac{\sigma_D}{\sqrt{k}}.

    這比只知道 A 自己的抖動更有用:我們要辨識的是 A 與 B 的差。想讓標準誤縮小一半,大約要四倍次數;想辨識更小的差距,也需要更多次。若使用近似信賴區間,還要選信心水準;若問檢定 power,還要指定真實差距、顯著水準與檢定方式。只知道相對抖動是 29%29\%,不能推出固定的種子數。

    在花掉算力之前,先問自己這個實驗有沒有能力回答我要問的問題。

    配對為什麼可能省次數? 因為 Var⁡(XA−XB)=Var⁡(XA)+Var⁡(XB)−2Cov⁡(XA,XB)\operatorname{Var}(X^A-X^B)=\operatorname{Var}(X^A)+\operatorname{Var}(X^B)-2\operatorname{Cov}(X^A,X^B)。共用資料切分等因素若造成正協方差,就會減少差值的變異數;若沒有正相關,便沒有這個好處。相同 seed 編號也不自動代表兩個不同架構用了相同隨機量。

    該報什麼

    把最好結果與中心估計的差別,整理成報告時要交代的項目:

    1. 報中位數與範圍(或四分位距),加上種子數。 「0.8330.833(5 seeds,範圍 0.8220.822–0.8470.847)」比「0.8470.847」誠實,而且資訊量更大——讀者可以自己判斷一個差距有沒有意義。
    2. 做配對比較:兩個方法共用同一組 seed 與同一組資料切分,報差值的分布而不是兩個分布。
    3. 報 mm:你總共比較過幾組設定(從一百個學生裡挑最好的,他下次會考得更好嗎? 的那個數字)。它和種子數是兩件不同的事,而且兩個都影響該怎麼讀你的數字。
    4. 不要用「取最好的」當成績,除非你明確說明那是最好的一次、並同時報中位數。
    5. 測試集只讀一次,而且是在所有種子都跑完、決定都做完之後。

    報告時要交代:重複的是固定資料上的訓練,還是重新抽資料的整個流程。兩種問題的隨機來源不同;表中的 MSE 也不能直接換成準確率的相對百分比。範圍、四分位距描述單次散佈,信賴區間則描述某個估計量的不確定性。

    把那個 29%29\% 量成自己的數字

    先量單次實驗的散佈,才能知道評估的不確定性有多大;比較兩個方法時,再記錄逐次配對差值。下面的程式先示範第一步。

    做法只要五到十次重複:

    res = [run_everything(seed=s) for s in range(8)]     # seed 與資料切分一起換
    med = np.median(res); spread = np.std(res)
    print(f"中位數 {med:.4f}   標準差 {spread:.4f}   相對抖動 {spread/med*100:.0f}%")

    少量重複提供初步線索,對長尾分布的標準差估計仍可能不穩。比較方法時,最好同時保留逐次配對差值;需要的次數還取決於這些差值的分布,不能只縮放一個標準差就宣稱極值表形狀不變。

    改變重複次數,觀察兩種報法

    互動 demo: 用指定的右偏分布比較最好結果與中位數;圖中的正確率是兩組中位數排名正確的比例,不是有顯著水準控制的檢定 power,也不是其他任務需要多少次的答案。

    檢查理解

    想一想

    一篇報告寫「我們的方法達到 0.8470.847,優於 baseline 的 0.8350.835」,兩者各跑了三次並各報最好的一次。根據本篇的模擬(相對抖動 29%29\%),最合適的評論是:

    想一想

    在第一張表裡,假優勢從 k=1k=1 的 16.9%16.9\% 只降到 k=10k=10 的 6.9%6.9\%。為什麼增加種子數對它幫助這麼小?

    想一想

    一個團隊的相對抖動是 29%29\%,想驗證預期 2%2\% 的改善。規劃重複次數時,還需要什麼?

    想一想

    下列哪一句不對?

    參考文獻

    1. Dodge, J. et al. Show Your Work: Improved Reporting of Experimental Results. EMNLP 2019.(把「調了多少、跑了幾次」當成結果的一部分報告,並給出一個隨預算變化的表現曲線。)
    2. Bouthillier, X. et al. Accounting for Variance in Machine Learning Benchmarks. MLSys 2021.(系統性地拆開各層隨機性的貢獻,並指出只換 seed 會低估抖動。)
    3. Henderson, P. et al. Deep Reinforcement Learning that Matters. AAAI 2018.(在抖動特別大的領域裡,把「取最好的幾次」造成的假結論量出來。)