跳到主要内容

02 Bootstrap:怎麼算誤差範圍

導航:← 01 AUC | 目錄 | 03 替換式注入 →

每題的解答都收合在題目下方:先自己作答,再點開「看解答」核對。

先認識這些詞​

這一課新出現的詞如下(前面課程已解釋過的詞不重複,完整列表見 術語表)。

  • 冷啟動:新平台只有很少題目時的情況。
  • 重抽次數 B:bootstrap 重抽的次數,例如 B = 2000。它不是實驗次數,也不會增加新的實驗。
  • 權重:每題在計算時佔的份量。權重為 2 的題,等於算了兩次。
  • 梯度提升:一種模型。把很多簡單的規則一條一條加起來,每條新規則修正前面規則的錯誤。研究中當成黑箱使用即可。
  • 百分位:把一批數字由小到大排後,位於某個百分比位置的數字。例如第 90 百分位:有 90% 的數字比它小。
  • 分位(分位數):把一批數字由小到大排後,位於某個比例位置的數字。例如第 2.5% 分位:有 2.5% 的數字比它小。
  • 研究問題(RQ):研究想回答的問題。RQ1、RQ2、RQ3 分別是三個問題。
  • 種子(隨機種子):讓隨機結果可以重現的起始數字。同一個種子,每次跑出來的隨機數都一樣。
  • 真值:真正的答案。研究中因為沒有真實標籤,很多時候只能用代理標籤近似。
  • 預先登記:做實驗前,先把做法與判定規則寫下來並存檔,之後不能事後更改。

目標​

讀完這課,你能:

  1. 用 4 張卡片說明 bootstrap 在做什麼。
  2. 說出一個區間是哪一個比較的區間。
  3. 說出判定用哪一種重抽、為什麼還要有另外兩種。

先分清三個數字​

下面會反覆出現三種數字,它們的意思不同,不要混在一起:

符號意思例子
實驗次數做了幾次獨立的注入實驗Polis 10 次、Decentraland 12 次
參照題數 n冷啟動時用了幾題參照n = 10、25,或全部
重抽次數 Bbootstrap 重抽了幾次(對同一批結果)B = 2000

只有一件事要記住:每次重抽抽的次數,等於實驗次數。 下面的卡片例子有 4 次實驗,所以每次遊戲抽 4 次,和 10 或 2000 都無關。

白話:4 張卡片​

實驗 4 次,就是做了 4 次實驗,每次得到一個數字。我們把它想成 4 張卡片:

卡片1234
數字0.100.140.080.12

4 張卡片的平均是 0.110。這就是我們手上全部的資料,重抽不會讓它變多。

一次遊戲(也就是一次重抽)的步驟:

  1. 把 4 張卡片放進箱子。

  2. 第 1 次抽:閉眼抽一張,記下數字,放回去。

  3. 第 2 次抽:同上,再抽一張,記下數字,放回去。

  4. 第 3、4 次抽:同上。

    一共抽 4 次,抽的次數和卡片數一樣。每次都放回,所以同一張卡可能被抽到好幾次,也可能一次都沒被抽到。

  5. 把這 4 次記下的數字算平均。這個平均就是一次遊戲的結果。

注意:「抽一次」指的是抽一張卡片;「一次遊戲」指的是抽 4 次再算平均。兩者不同。

玩 2000 次遊戲,就是把上面的 1 到 5 重複 2000 次,得到 2000 個平均。

前 5 次遊戲的結果(每一次遊戲都是抽 4 次、算一個平均):

遊戲抽到的 4 個數字平均
第 1 次0.12、0.10、0.10、0.080.100
第 2 次0.14、0.14、0.10、0.140.130
第 3 次0.08、0.14、0.12、0.120.115
第 4 次0.08、0.12、0.08、0.100.095
第 5 次0.12、0.08、0.10、0.140.110

玩 B = 2000 次,把 2000 個平均排序,去掉最小的 2.5% 與最大的 2.5%,剩下的範圍就是 95% 區間:[0.090, 0.130]。

意思是:如果用同一批 4 張卡片換一種方式組合,平均大多落在 0.090 到 0.130 之間。

要注意三點:

  1. 沒有做 2000 次實驗。 實驗還是 4 次。B = 2000 只是玩遊戲的次數,目的是讓範圍穩定。
  2. 範圍不會超出卡片的範圍。 這 4 張最小是 0.08、最大是 0.14,平均只能落在中間。
  3. 卡片少時,範圍可能太窄。 如果真實的變動比這 4 張顯示的更大,遊戲只能用手上的卡片,看不見沒有出現過的數字。

抽幾次?玩幾次?​

這兩個次數常被混在一起,分開看:

  • 每次遊戲抽幾次:由實驗次數決定。實驗有幾次,就從中有放回地抽幾次。
  • 玩幾次遊戲:是 B,研究中是 2000。它和實驗次數無關。

所以 4 次實驗時,每次遊戲抽 4 次,玩 2000 次遊戲。實驗 20 次時,每次遊戲抽 20 次,仍然玩 2000 次遊戲。

研究的兩層與交叉也是同樣的規則(程式中的實作已確認):

問題規則
每次遊戲抽幾次實驗?等於實驗次數
兩層:每個被抽到的實驗裡抽幾題?等於該實驗的題目數
交叉:題目抽幾次?等於題目數;所有實驗共用同一次抽出的題
玩幾次遊戲?B

研究的遊戲不算平均,而是算 AUC,但流程相同:抽、重算、重複。

從卡片到 AUC:重抽的到底是什麼​

研究的統計量不是平均,而是 AUC(見 01 課),但做法完全一樣:重抽,然後用抽到的資料重新算統計量。

差別在於,研究不會每次重新跑實驗。它只讀取已經存好的分數表。下面是一個小例子:3 次實驗,每次 4 題,每一列是一次實驗中的一題。

實驗 r題目 q是否被灌票模型分數
r1q1是0.9
r1q2是0.6
r1q3否0.5
r1q4否0.2
r2q1否0.4
…………

重抽的做法:每次重抽,給每一列一個「被抽到幾次」的權重。例如這次抽到 r1 兩次、r3 一次、r2 零次,就給 r1 的每一列權重 2、r3 的每一列權重 1、r2 的每一列權重 0。然後用這些權重重算 AUC。

分數本身從不改變。 重抽只改變哪些列「算數」。

真實的研究也是這樣:每次實驗都存有一張這樣的表(每列是一個題目與一種攻擊的組合),存在 outputs/phase05/draws/。bootstrap 讀的就是這些表。

  • 它能看到的:哪些實驗、哪些題目被抽到,造成 AUC 的變化。
  • 它看不到的:沒有跑過的實驗,或沒有被存下來的分數。

模型訓練本身是確定的(梯度提升固定 random_state=0,且沒有提前停止),所以同樣的資料會得到同樣的模型。變動的來源只剩兩種:每次實驗的注入不同,以及題目組合不同。

三種重抽:各自重抽什麼​

方法每次重抽什麼反映什麼變動在研究中的用途
抽樣層級(以實驗為單位)只重抽實驗,題目固定每次實驗的注入不同第 1 到第 4 階段的判定
兩層先重抽實驗,再在每次被抽到的實驗裡重抽題目注入不同,加上題目組合不同第 5 階段起的判定
交叉重抽實驗;題目只重抽一次,所有實驗共用同上,但題目變動不會在實驗之間互相抵消第 8 階段的檢查,判定仍以兩層為準

「抽樣層級」中的「抽樣」,指的就是「以實驗為單位」。論文中一次注入實驗也叫「抽樣」,見術語表。

一個 3 次實驗、4 題的例子​

完整列出上面的分數表(3 次實驗,每次 4 題;每格是「是否被灌票,分數」):

實驗q1q2q3q4
r1是,0.9是,0.6否,0.5否,0.2
r2否,0.4是,0.8是,0.7否,0.3
r3是,0.7否,0.2否,0.6是,0.5
  • 用全部 12 列算:AUC = 0.944。

  • 抽樣層級的一次重抽(抽到 r1 兩次、r3 一次、r2 零次):AUC = 0.917。

  • 兩層的一次重抽:先抽實驗(r1、r1、r3),再在每次被抽到的實驗裡有放回抽 4 題:

    • 第一個 r1:q1、q2、q2、q4
    • 第二個 r1:q3、q3、q1、q4
    • r3:q3、q4、q4、q2

    AUC = 0.861。

這三個數字都只是一次重抽的結果,用來說明做法。區間要重複 2000 次,取第 2.5 與第 97.5 百分位。

真實的例子:Polis,參照題數 n = 10​

第 4 階段的 RQ2,Polis,10 題參照時的區間(來源:outputs/phase05/phase04_two_level.csv):

方法95% 區間寬度
抽樣層級[0.173, 0.228]0.055
兩層[0.166, 0.232]0.066

兩層較寬,因為多計入了題目組合的變動。

B = 2000 與實驗次數 10 到 12:兩個不同的數字​

  • 實驗次數(真實研究的 10 到 12):獨立的注入實驗,每次用不同的種子重新製造假灌票、重新訓練、重新打分。Decentraland 有 12 次,Polis 有 10 次。
  • 重抽次數 B(2000):對同一批實驗結果做有放回的抽取,每次算一個統計量。

為什麼是 2000? 它是程式中設定的重抽次數(見 src/config.py)。下面的模擬說明實驗次數少時的問題。

次數少時區間會偏窄。 簡化模擬(每次實驗的結果是常態分布、各次獨立、真值為 0;每個設定模擬 2000 次研究,每次研究重抽 1000 次):

實驗次數 n95% 區間含真值的比例區間平均寬度
100.8911.129
120.9081.050
250.9300.759
990.9490.388

理想的比例是 0.95。n = 12 時只有約 0.91。這只說明方向,不是論文的數字,因為實際的 AUC 不是常態分布。

常見誤解​

  1. 「95% 區間」不是「真值有 95% 機率在裡面」。 它的意思是:重複做很多次同樣的實驗,約 95% 的區間會包住真值。單一區間包住或沒包住真值,不是機率問題。
  2. B = 2000 不是實驗次數。 實驗次數是 10 到 12 次(或更多),B = 2000 只是重抽次數。
  3. 區間窄不代表結果可靠。 區間只反映已經觀察到的變動;如果實驗次數少,真實的變動可能比區間顯示的更大。
  4. 重抽不能增加資訊。 它只是重新組合已經存在的資料。

判定用哪一種:摘要​

判定用哪一種區間,是在不同時間、因為不同理由決定的。完整的時間線與來源見 review/interval_history.md。

時間判定用的區間原因(摘要)
第 1 到第 4 階段(預先登記)抽樣層級當時的設計假設檢驗題固定,只有注入的隨機性會變
第 5 階段(預先登記,模擬審查後)兩層審查指出抽樣層級的區間可能偏窄;兩層同時計入題目的變動
第 8 階段(預先登記,論文審查後)仍以兩層為準;交叉作為檢查審查指出兩層仍可能低估題目的變動;交叉用來看哪些結論會改變

為什麼要有交叉? 嚴格審查(B1)認為,兩層每次都抽同一批題目,題目的變動會在所有實驗之間互相抵消,所以可能仍然偏窄。這是審查意見的估計,我們沒有另外驗證。

看這裡​

  • src/selfinj.py 第 142–160 行:boot_weights。two_level=False 是抽樣層級,True 是兩層。
  • src/selfinj.py 第 163–168 行:diff_ci,計算兩個方法的差的區間。論文中 d − e 的區間來自這裡。
  • src/phase08.py 附近:crossed_weights,交叉的權重。
  • src/audit.py 第 73–88 行:boot_ci。這是產生器稽核用的區間(在 judge 中使用),正例(被攻擊的題)與負例(正常題)各自重抽,人數不變。它不是論文主要結果的區間。

問自己​

1. 重抽 100 次和 B = 2000 次,區間會差多少?為什麼?

看解答

重抽次數越多,估計越穩定,但區間寬度主要由資料本身的變異決定,不會因為多抽幾次就變寬或變窄。100 次時取百分位仍有明顯跳動;B = 2000 次通常足夠。

2. 為什麼兩層區間通常比抽樣層級寬?

看解答

兩層同時計入「實驗」與「題目」兩種變動;抽樣層級只計入實驗的變動,所以通常較窄。

3. 「95% 區間」是說「真值有 95% 機率落在裡面」嗎?

看解答

不是。它的意思是:重複做很多次同樣的實驗,約 95% 的區間會包住真值。

練習​

1. 4 張卡片全部都是 0.10。重抽 B = 2000 次後,95% 區間是什麼?

看解答

[0.10, 0.10]。每次抽到的 4 個數字都是 0.10,平均永遠是 0.10,所以區間只有一個點。這說明區間寬度來自卡片彼此的差異。

2. 3 次實驗的結果是 0.06、0.10、0.14。重抽後,區間的上下界最多會到多少?

看解答

上界最多是 0.14,下界最少是 0.06。平均只能落在原本數字的最小與最大之間,bootstrap 不會產生新的數字。

檢核​

1. 2000 次重抽的目的是什麼?

看解答

讓區間的計算穩定。它不會增加新的實驗,也不會增加新的資訊。

2. 抽樣層級和兩層的差別是什麼?

看解答

抽樣層級只重抽實驗,題目固定;兩層先重抽實驗,再在每次實驗裡重抽題目。

3. 交叉為什麼比兩層保守?

看解答

交叉讓所有實驗共用同一組重抽的題目,所以題目的變動不會在實驗之間被平均掉。這是審查意見的論證,判定仍以兩層為準。

本課重點​

  • Bootstrap 是「重抽、重算統計量、取範圍」,不是重跑實驗。
  • 研究讀取已存的分數表,只改變哪些列算數。
  • 區間寬度來自實驗之間的差異;重抽次數只影響穩定度。
  • 三種重抽回答三個不同的問題:抽樣層級、兩層、交叉。判定以兩層為準。
  • 次數少時區間可能偏窄,這是本研究的已知限制。

導航​

引用文獻​

  • Efron, B., & Tibshirani, R. J. (1993). An introduction to the bootstrap. Chapman & Hall/CRC. [未收入 bib]
  • 本課的兩層與交叉區間是本研究的設計,並非引用自某篇文獻;實作與預先登記見 phase05_protocol.md 與 phase08_protocol.md。
  • 審查文件與時間線:review/interval_history.md。