02 Bootstrap:怎麼算誤差範圍
每題的解答都收合在題目下方:先自己作答,再點開「看解答」核對。
先認識這些詞
這一課新出現的詞如下(前面課程已解釋過的詞不重複,完整列表見 術語表)。
- 冷啟動:新平台只有很少題目時的情況。
- 重抽次數 B:bootstrap 重抽的次數,例如 B = 2000。它不是實驗次數,也不會增加新的實驗。
- 權重:每題在計算時佔的份量。權重為 2 的題,等於算了兩次。
- 梯度提升:一種模型。把很多簡單的規則一條一條加起來,每條新規則修正前面規則的錯誤。研究中當成黑箱使用即可。
- 百分位:把一批數字由小到大排後,位於某個百分比位置的數字。例如第 90 百分位:有 90% 的數字比它小。
- 分位(分位數):把一批數字由小到大排後,位於某個比例位置的數字。例如第 2.5% 分位:有 2.5% 的數字比它小。
- 研究問題(RQ):研究想回答的問題。RQ1、RQ2、RQ3 分別是三個問題。
- 種子(隨機種子):讓隨機結果可以重現的起始數字。同一個種子,每次跑出來的隨機數都一樣。
- 真值:真正的答案。研究中因為沒有真實標籤,很多時候只能用代理標籤近似。
- 預先登記:做實驗前,先把做法與判定規則寫下來並存檔,之後不能事後更改。
目標
讀完這課,你能:
- 用 4 張卡片說明 bootstrap 在做什麼。
- 說出一個區間是哪一個比較的區間。
- 說出判定用哪一種重抽、為什麼還要有另外兩種。
先分清三個數字
下面會反覆出現三種數字,它們的意思不同,不要混在一起:
| 符號 | 意思 | 例子 |
|---|---|---|
| 實驗次數 | 做了幾次獨立的注入實驗 | Polis 10 次、Decentraland 12 次 |
| 參照題數 n | 冷啟動時用了幾題參照 | n = 10、25,或全部 |
| 重抽次數 B | bootstrap 重抽了幾次(對同一批結果) | B = 2000 |
只有一件事要記住:每次重抽抽的次數,等於實驗次數。 下面的卡片例子有 4 次實驗,所以每次遊戲抽 4 次,和 10 或 2000 都無關。
白話:4 張卡片
實驗 4 次,就是做了 4 次實驗,每次得到一個數字。我們把它想成 4 張卡片:
| 卡片 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 數字 | 0.10 | 0.14 | 0.08 | 0.12 |
4 張卡片的平均是 0.110。這就是我們手上全部的資料,重抽不會讓它變多。
一次遊戲(也就是一次重抽)的步驟:
-
把 4 張卡片放進箱子。
-
第 1 次抽:閉眼抽一張,記下數字,放回去。
-
第 2 次抽:同上,再抽一張,記下數字,放回去。
-
第 3、4 次抽:同上。
一共抽 4 次,抽的次數和卡片數一樣。每次都放回,所以同一張卡可能被抽到好幾次,也可能一次都沒被抽到。
-
把這 4 次記下的數字算平均。這個平均就是一次遊戲的結果。
注意:「抽一次」指的是抽一張卡片;「一次遊戲」指的是抽 4 次再算平均。兩者不同。
玩 2000 次遊戲,就是把上面的 1 到 5 重複 2000 次,得到 2000 個平均。
前 5 次遊戲的結果(每一次遊戲都是抽 4 次、算一個平均):
| 遊戲 | 抽到的 4 個數字 | 平均 |
|---|---|---|
| 第 1 次 | 0.12、0.10、0.10、0.08 | 0.100 |
| 第 2 次 | 0.14、0.14、0.10、0.14 | 0.130 |
| 第 3 次 | 0.08、0.14、0.12、0.12 | 0.115 |
| 第 4 次 | 0.08、0.12、0.08、0.10 | 0.095 |
| 第 5 次 | 0.12、0.08、0.10、0.14 | 0.110 |
玩 B = 2000 次,把 2000 個平均排序,去掉最小的 2.5% 與最大的 2.5%,剩下的範圍就是 95% 區間:[0.090, 0.130]。
意思是:如果用同一批 4 張卡片換一種方式組合,平均大多落在 0.090 到 0.130 之間。
要注意三點:
- 沒有做 2000 次實驗。 實驗還是 4 次。B = 2000 只是玩遊戲的次數,目的是讓範圍穩定。
- 範圍不會超出卡片的範圍。 這 4 張最小是 0.08、最大是 0.14,平均只能落在中間。
- 卡片少時,範圍可能太窄。 如果真實的變動比這 4 張顯示的更大,遊戲只能用手上的卡片,看不見沒有出現過的數字。
抽幾次?玩幾次?
這兩個次數常被混在一起,分開看:
- 每次遊戲抽幾次:由實驗次數決定。實驗有幾次,就從中有放回地抽幾次。
- 玩幾次遊戲:是 B,研究中是 2000。它和實驗次數無關。
所以 4 次實驗時,每次遊戲抽 4 次,玩 2000 次遊戲。實驗 20 次時,每次遊戲抽 20 次,仍然玩 2000 次遊戲。
研究的兩層與交叉也是同樣的規則(程式中的實作已確認):
| 問題 | 規則 |
|---|---|
| 每次遊戲抽幾次實驗? | 等於實驗次數 |
| 兩層:每個被抽到的實驗裡抽幾題? | 等於該實驗的題目數 |
| 交叉:題目抽幾次? | 等於題目數;所有實驗共用同一次抽出的題 |
| 玩幾次遊戲? | B |
研究的遊戲不算平均,而是算 AUC,但流程相同:抽、重算、重複。
從卡片到 AUC:重抽的到底是什麼
研究的統計量不是平均,而是 AUC(見 01 課),但做法完全一樣:重抽,然後用抽到的資料重新算統計量。
差別在於,研究不會每次重新跑實驗。它只讀取已經存好的分數表。下面是一個小例子:3 次實驗,每次 4 題,每一列是一次實驗中的一題。
| 實驗 r | 題目 q | 是否被灌票 | 模型分數 |
|---|---|---|---|
| r1 | q1 | 是 | 0.9 |
| r1 | q2 | 是 | 0.6 |
| r1 | q3 | 否 | 0.5 |
| r1 | q4 | 否 | 0.2 |
| r2 | q1 | 否 | 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 題;每格是「是否被灌票,分數」):
| 實驗 | q1 | q2 | q3 | q4 |
|---|---|---|---|---|
| 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 次):
| 實驗次數 n | 95% 區間含真值的比例 | 區間平均寬度 |
|---|---|---|
| 10 | 0.891 | 1.129 |
| 12 | 0.908 | 1.050 |
| 25 | 0.930 | 0.759 |
| 99 | 0.949 | 0.388 |
理想的比例是 0.95。n = 12 時只有約 0.91。這只說明方向,不是論文的數字,因為實際的 AUC 不是常態分布。
常見誤解
- 「95% 區間」不是「真值有 95% 機率在裡面」。 它的意思是:重複做很多次同樣的實驗,約 95% 的區間會包住真值。單一區間包住或沒包住真值,不是機率問題。
- B = 2000 不是實驗次數。 實驗次數是 10 到 12 次(或更多),B = 2000 只是重抽次數。
- 區間窄不代表結果可靠。 區間只反映已經觀察到的變動;如果實驗次數少,真實的變動可能比區間顯示的更大。
- 重抽不能增加資訊。 它只是重新組合已經存在的資料。
判定用哪一種:摘要
判定用哪一種區間,是在不同時間、因為不同理由決定的。完整的時間線與來源見 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。