🌏 English version
影片狀態:已附影片。 這篇依官方 MOOC 講義 208_handout.pdf 與這堂四支官方影片的機器轉錄逐字稿寫成,公式以講義為準;逐字稿未經人工校對。每一節開頭附該節的官方影片與大致的時間區段。文中的頁碼指投影片右下角的編號(0/25 到 25/25),寫「課堂上」的地方是轉述影片裡的說法。
這是台大林軒田 機器學習基石與技法 導讀 裡的技法第 8 堂。講義第 1 頁的 Roadmap 把技法分成三種處理特徵的技巧,這堂屬於第二種 Combining Predictive Features: Aggregation Models。上一堂技法第 7 堂:Blending 與 Bagging 在同一頁被收成一句:手上已經有一批不一樣的假說時,可以一人一票、線性、甚至非線性地把它們合起來(blending);還沒有的時候,可以從 bootstrap 抽出來的資料學出不一樣的假說(bagging)。
bagging 的多樣性靠抽樣的運氣。這堂問的是:能不能主動設計每一輪的資料,讓新學到的假說一定跟上一個不同,而且最後合起來的 G G G 有理論保證?答案是 Adaptive Boosting,簡稱 AdaBoost。
先備是上一堂的 bootstrap 與線性 blending、基石第 8 堂:雜訊與誤差衡量 的加權分類、VC bound 的形式,以及對數與根號的基本運算。讀完之後,你應該能自己推出「答錯的乘多少、答對的乘多少」這組倍數,寫出 AdaBoost 的三個步驟,對一組小資料手算每一輪的 ϵ t \epsilon_t ϵ t 、⧫ t \blacklozenge_t ⧫ t 、α t \alpha_t α t 與新權重,並說明為什麼「比亂猜好一點」就夠了。
整堂課的推導順序:
動機 :很多條粗糙的規則,加上一位會指出錯誤的老師,可以合成一個好的分類器。
把 bootstrap 看成權重 :bagging 的每個 g t g_t g t 其實在最小化加權的錯誤。
設計權重 :讓 g t g_t g t 在下一輪的權重下像丟銅板,得到最佳重新加權。
縮放因子 ⧫ t \blacklozenge_t ⧫ t :把重新加權寫成「答錯的乘、答對的除」。
票數 α t = ln ⧫ t \alpha_t = \ln\blacklozenge_t α t = ln ⧫ t :一邊學 g t g_t g t 一邊決定線性投票的權重。
保證與實作 :VC bound 的兩項都能壓小;搭配 decision stump 實際跑。
弱的規則能不能合成強的:一堂認蘋果的課
YouTube:Adaptive Boosting :: Motivation of Boosting @ Machine Learning Techniques (機器學習技法)
(影片 00:17–01:14 複習上一堂,01:14–02:22 介紹題目,02:22–10:30 是課堂故事,10:30–12:23 把角色對回演算法,之後是 Fun Time。)
二十張照片
講義第 2 頁設定了一個問題:要教一班 6 歲的小朋友分辨一張照片裡是不是蘋果。老師從 Flickr 上找了 CC-BY-2.0 授權的照片,十張是蘋果,十張不是。課堂上點名的非蘋果有香蕉、橘子、草莓,後面的故事裡還出現番茄。
課堂上先把這個情境對回機器學習的詞彙:二十張照片是 x \mathbf{x} x ,是不是蘋果是 y y y ,老師把兩者都給了學生,這是監督式學習(supervised learning),要學的是一個二元分類。
四個學生、一位老師
講義第 3 到 6 頁是四輪問答,每一頁的下方都是那二十張照片。第 3 到 5 頁用藍色底標出這一輪的規則會答錯的照片;從第 4 頁起,照片的大小會跟著上一輪的對錯改變,上一輪答錯的放大、答對的縮小。下面把四頁的圖整理成表:
輪次(講義頁) 學生說的規則 這條規則錯在哪(課堂上的說明) 全班目前的結論(講義) 1(第 3 頁) Michael:蘋果是圓的 橘子也是圓的;有一顆蘋果拍起來沒那麼圓 蘋果是圓的 2(第 4 頁) Tina:蘋果是紅的 青蘋果不紅;草莓、番茄是紅的但不是蘋果 有點圓、有點紅 3(第 5 頁) Joey:蘋果也可能是綠的 錯的照片不少,但都落在已經被縮小的照片上 有點圓、有點紅、可能是綠的 4(第 6 頁) Jessica:蘋果頂端有梗 (最後一輪,講義沒有再標錯誤) 有點圓、有點紅、可能是綠的、頂端可能有梗
重點在每兩輪之間老師做的事。Michael 說完「圓的」之後,老師沒有直接否定,講義上的台詞是:圓是個好特徵,但只說圓會犯一些錯,還能怎麼描述?課堂上把老師的動作講得很具體:把 Michael 答對的照片拿遠一點(投影片上畫成縮小),把他答錯的照片放大,再請下一位同學看。
Tina 看到的畫面跟 Michael 看到的不一樣。課堂上的描述是:被放大的照片裡有兩張又大又紅的蘋果,而其他不是蘋果的水果大多不紅,所以她說出「紅的」。這條規則是被那幾張放大的照片引出來的。
Joey 那一輪有個容易忽略的細節。課堂上說,「綠的」這條規則看起來答錯一大堆,但那些錯都發生在目前被縮得很小的照片上,不是 Joey 專心在看的東西;在他主要看到的照片上(兩顆青蘋果、一顆被放得很大的番茄),這條規則有道理。至於它犯的錯,下一輪再修。
四輪下來,課堂上的評語是:這個結論也許還稱不上完美,但比任何一位學生單獨說得出來的都豐富。
把角色對回演算法
講義第 7 頁把三個角色對上去:
故事裡 演算法裡 講義的寫法 學生 簡單的假說 g t g_t g t simple hypotheses,像垂直線或水平線 全班 合起來的複雜假說 G G G sophisticated hypothesis,像圖上的黑色曲線 老師 一個引導學生的學習演算法 讓學生把注意力放在關鍵例子(key examples)上
同一頁的圖是一個二維的例子:幾個圈與叉,背景有幾條灰色的垂直線與水平線,一條黑色的折線邊界把圈和叉完全分開。課堂上說,只准切垂直線和水平線、連斜線都不能切,是很弱的分類方式,就像那些小學生;黑色邊界是把這些線合起來的結果,比任何一條線都豐富。這張圖在講 AdaBoost-Stump 示範的地方會一輪一輪重畫。
課堂上對「關鍵例子」的定義是犯過錯的例子:把它們強調出來,下一位學生才會找出一條不一樣的線。這堂接下來要回答的就是這件事的數學:放大多少、縮小多少,最後怎麼合。
Fun Time:哪一條能幫忙認蘋果
題目(第 8 頁): 下面哪一項能幫助辨認蘋果?
蘋果通常是圓的
蘋果通常是紅的或綠的
蘋果頂端通常有梗
以上皆是
答案:4。 講義的解答只有一句恭喜你通過一年級。這題的用意在選項的措辭:每一條都只寫「通常」,單獨拿任何一條去分類都會錯(故事裡前三位學生都被老師指出過錯誤),但每一條都比亂猜有用。選 1、2、3 任何一個都漏掉了另外兩條同樣有用的規則。「每條都弱、但都比亂猜好」正是後面對基礎演算法的唯一要求。
怎麼逼出不一樣的假說:把 bootstrap 看成權重,再自己設計權重
YouTube:Adaptive Boosting :: Diversity by Re-weighting @ Machine Learning Techniques (機器學習技法)
(影片 00:00–03:03 把 bootstrap 改寫成權重,03:03–06:29 談基礎演算法怎麼吃權重,06:29–09:19 是「讓上一輪的假說像丟銅板」的想法,09:19–13:35 推最佳重新加權,之後是 Fun Time。)
bagging 其實在最小化加權的錯誤
講義第 9 頁從上一堂的 bagging 出發。假設原始資料有四筆,bootstrap 抽出來的結果是第 1 筆兩次、第 2 筆一次、第 4 筆一次,第 3 筆沒抽到:
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , ( x 4 , y 4 ) } ⇒ bootstrap D ~ t = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 4 , y 4 ) } \mathcal{D} = \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), (\mathbf{x}_3, y_3), (\mathbf{x}_4, y_4)\} \ \xRightarrow{\ \text{bootstrap}\ }\ \tilde{\mathcal{D}}_t = \{(\mathbf{x}_1, y_1), (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), (\mathbf{x}_4, y_4)\} D = {( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , ( x 4 , y 4 )} bootstrap D ~ t = {( x 1 , y 1 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 4 , y 4 )}
基礎演算法在 D ~ t \tilde{\mathcal{D}}_t D ~ t 上最小化 0/1 錯誤:
E in 0 / 1 ( h ) = 1 4 ∑ ( x , y ) ∈ D ~ t ⟦ y ≠ h ( x ) ⟧ E_{\text{in}}^{0/1}(h) = \frac{1}{4}\sum_{(\mathbf{x}, y) \in \tilde{\mathcal{D}}_t} \llbracket y \ne h(\mathbf{x}) \rrbracket E in 0/1 ( h ) = 4 1 ( x , y ) ∈ D ~ t ∑ [ [ y = h ( x ) ] ]
課堂上的觀察是:既然兩個第 1 筆一模一樣,不如留著原本的四筆資料,另外用一個變數 u n u_n u n 記錄每一筆「有幾份」。這裡 u 1 = 2 u_1 = 2 u 1 = 2 、u 2 = 1 u_2 = 1 u 2 = 1 、u 3 = 0 u_3 = 0 u 3 = 0 、u 4 = 1 u_4 = 1 u 4 = 1 ,同一件事就能寫成在原始資料 D \mathcal{D} D 上的加權錯誤:
E in u ( h ) = 1 4 ∑ n = 1 4 u n ( t ) ⋅ ⟦ y n ≠ h ( x n ) ⟧ E_{\text{in}}^{\mathbf{u}}(h) = \frac{1}{4}\sum_{n=1}^{4} u_n^{(t)} \cdot \llbracket y_n \ne h(\mathbf{x}_n) \rrbracket E in u ( h ) = 4 1 n = 1 ∑ 4 u n ( t ) ⋅ [ [ y n = h ( x n ) ] ]
課堂上的口語版本是:有兩份的資料答錯要扣兩分,有一份的扣一分。上標 ( t ) (t) ( t ) 表示第 t t t 輪,因為每一輪的 bootstrap 會抽出不同的一組 u n u_n u n 。
本文驗算一個情況:假設某個 h h h 只答錯第 1 筆。照 bootstrap 資料的寫法,D ~ t \tilde{\mathcal{D}}_t D ~ t 的四筆裡錯兩筆,錯誤率 2 4 \frac{2}{4} 4 2 ;照加權的寫法是 1 4 ( 2 ⋅ 1 + 1 ⋅ 0 + 0 ⋅ 0 + 1 ⋅ 0 ) = 2 4 \frac{1}{4}(2 \cdot 1 + 1 \cdot 0 + 0 \cdot 0 + 1 \cdot 0) = \frac{2}{4} 4 1 ( 2 ⋅ 1 + 1 ⋅ 0 + 0 ⋅ 0 + 1 ⋅ 0 ) = 4 2 。兩種寫法給出同一個數。
講義把這一頁收成一句:bagging 裡每個不一樣的 g t g_t g t ,都是靠最小化 bootstrap 給的加權錯誤得到的。這個換句話說的用處在於,權重不一定要由抽樣決定。
基礎演算法要能吃權重
講義第 10 頁把加權錯誤寫成一般形式,要最小化的是(可以再加正則化項)
E in u ( h ) = 1 N ∑ n = 1 N u n ⋅ err ( y n , h ( x n ) ) E_{\text{in}}^{\mathbf{u}}(h) = \frac{1}{N}\sum_{n=1}^{N} u_n \cdot \text{err}(y_n, h(\mathbf{x}_n)) E in u ( h ) = N 1 n = 1 ∑ N u n ⋅ err ( y n , h ( x n ))
課堂上說,權重在 bagging 裡是整數,但沒有理由只能是整數:一筆資料十倍重要就給 10,0.8 倍重要就給 0.8。接著替學生問了一個問題:以前的演算法都只是把 E in E_{\text{in}} E in 做好,現在多了 u n u_n u n 要怎麼做?講義舉兩個例子說明這通常不難。
SVM。 軟邊界 SVM 原本每筆資料違反邊界的代價都乘上 C C C ,現在第 n n n 筆的代價乘上 C u n C u_n C u n 。講義的結論是,用對偶 QP 解的時候,這等於把 α n \alpha_n α n 的上界從 C C C 改成 C u n C u_n C u n :
0 ≤ α n ≤ C u n 0 \le \alpha_n \le C u_n 0 ≤ α n ≤ C u n
課堂上的說法是:原本一個錯扣 C C C 分,現在有兩份就扣 2 C 2C 2 C 分,這個參數經過整個 QP 的推導,最後會跑到 α n \alpha_n α n 的上限去。本文把中間那一步補上(用的是技法第 4 堂:軟邊界 SVM 的推導):加權後的原始問題是最小化 1 2 w ⊤ w + C ∑ n u n ξ n \frac{1}{2}\mathbf{w}^\top\mathbf{w} + C\sum_n u_n\xi_n 2 1 w ⊤ w + C ∑ n u n ξ n 。拉格朗日函數裡含 ξ n \xi_n ξ n 的項是 ( C u n − α n − β n ) ξ n (C u_n - \alpha_n - \beta_n)\,\xi_n ( C u n − α n − β n ) ξ n ,其中 β n ≥ 0 \beta_n \ge 0 β n ≥ 0 是 ξ n ≥ 0 \xi_n \ge 0 ξ n ≥ 0 那條限制的乘數。對 ξ n \xi_n ξ n 偏微分等於 0 得到 β n = C u n − α n \beta_n = C u_n - \alpha_n β n = C u n − α n ,再由 β n ≥ 0 \beta_n \ge 0 β n ≥ 0 就得到 α n ≤ C u n \alpha_n \le C u_n α n ≤ C u n 。其餘的對偶問題完全不變。
邏輯迴歸。 用 SGD 訓練時,原本每一步均勻地隨機挑一筆資料算梯度。講義的做法是改成依照 u n u_n u n 的比例抽樣。課堂上的理由是:某筆資料如果有 10 份,它被抽到的機率本來就應該是別人的 10 倍。本文補一行式子:以機率 u n / ∑ m u m u_n / \sum_m u_m u n / ∑ m u m 抽到第 n n n 筆時,梯度的期望值是 ∑ n u n ∑ m u m ∇ err n \sum_n \frac{u_n}{\sum_m u_m}\nabla\text{err}_n ∑ n ∑ m u m u n ∇ err n ,正比於 ∇ ∑ n u n err n \nabla\sum_n u_n\,\text{err}_n ∇ ∑ n u n err n ,也就是加權錯誤的梯度方向。
講義在頁尾指出,這種「每筆資料各有權重」的學習(example-weighted learning)是基石第 8 堂 class-weighted learning 的延伸。課堂上回顧:基石第 8 堂談的是指紋辨識裡兩種錯誤哪一種比較嚴重,權重是跟著類別走的;現在權重跟著每一筆資料走。課堂上說那一堂學到的方式大部分都可以延伸過來(本文註:那一堂的做法是把代價高的資料想成複製了很多份)。
之後的推導都假設基礎演算法 A \mathcal{A} A 能接受權重:給它資料 D \mathcal{D} D 與權重 u \mathbf{u} u ,它回傳一個讓加權錯誤盡量小的假說。
讓上一輪的假說在新權重下像丟銅板
講義第 11 頁回到二元分類,問怎麼設計權重才能得到更不一樣的假說。上一堂的結論是,假說之間愈不同,合起來的效果愈好。相鄰兩輪的假說是這樣來的:
g t ← argmin h ∈ H ( ∑ n = 1 N u n ( t ) ⟦ y n ≠ h ( x n ) ⟧ ) , g t + 1 ← argmin h ∈ H ( ∑ n = 1 N u n ( t + 1 ) ⟦ y n ≠ h ( x n ) ⟧ ) g_t \leftarrow \operatorname*{argmin}_{h \in \mathcal{H}} \left(\sum_{n=1}^{N} u_n^{(t)} \llbracket y_n \ne h(\mathbf{x}_n) \rrbracket\right), \qquad g_{t+1} \leftarrow \operatorname*{argmin}_{h \in \mathcal{H}} \left(\sum_{n=1}^{N} u_n^{(t+1)} \llbracket y_n \ne h(\mathbf{x}_n) \rrbracket\right) g t ← h ∈ H argmin ( n = 1 ∑ N u n ( t ) [ [ y n = h ( x n ) ] ] ) , g t + 1 ← h ∈ H argmin ( n = 1 ∑ N u n ( t + 1 ) [ [ y n = h ( x n ) ] ] )
g t + 1 g_{t+1} g t + 1 是在 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) 下加權錯誤最小的假說。講義的推理是:如果 g t g_t g t 在 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) 下表現「不好」,那麼 g t g_t g t 以及長得像 g t g_t g t 的假說都不會被選成 g t + 1 g_{t+1} g t + 1 ,g t + 1 g_{t+1} g t + 1 就會跟 g t g_t g t 不同。課堂上的說法是:g t g_t g t 已經抓在手上了,只要把權重稍微調一下,讓它在新的一輪表現很差,跟它很像的假說就都不會被選到。
二元分類裡「表現很差」的標準是什麼?課堂上的回答是跟丟銅板沒有兩樣。丟銅板的期望錯誤率是 1 2 \frac{1}{2} 2 1 ,所以講義把目標寫成:設計 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) ,讓 g t g_t g t 的加權錯誤率剛好是一半。
∑ n = 1 N u n ( t + 1 ) ⟦ y n ≠ g t ( x n ) ⟧ ∑ n = 1 N u n ( t + 1 ) = 1 2 \frac{\sum_{n=1}^{N} u_n^{(t+1)} \llbracket y_n \ne g_t(\mathbf{x}_n) \rrbracket}{\sum_{n=1}^{N} u_n^{(t+1)}} = \frac{1}{2} ∑ n = 1 N u n ( t + 1 ) ∑ n = 1 N u n ( t + 1 ) [ [ y n = g t ( x n ) ] ] = 2 1
分母是全部權重的總和,除掉它是為了把加權錯誤換算成比例。
本文補充:為什麼目標是 1 2 \frac{1}{2} 2 1 ,而不是把 g t g_t g t 的加權錯誤率調到更高,例如 0.9 0.9 0.9 ?二元分類裡,g t g_t g t 的加權錯誤率是 0.9 0.9 0.9 ,就表示 − g t -g_t − g t 的加權錯誤率是 0.1 0.1 0.1 。如果假說集合裡同時有 h h h 與 − h -h − h (decision stump 就是,方向 s s s 可以取正負),基礎演算法下一輪會直接選 − g t -g_t − g t ,那只是同一條線反過來用,沒有帶來新資訊。1 2 \frac{1}{2} 2 1 是 g t g_t g t 與 − g t -g_t − g t 都沒有用的唯一位置,演算法只好去找別的假說。
最佳重新加權:講義的 1126 與 6211
講義第 12 頁把那個比例拆成兩塊。把 g t g_t g t 答錯的資料在新權重下的總和記成 ■ t + 1 \blacksquare_{t+1} ■ t + 1 ,答對的記成 ∙ t + 1 \bullet_{t+1} ∙ t + 1 (課堂上唸成方塊與圈圈):
■ t + 1 = ∑ n = 1 N u n ( t + 1 ) ⟦ y n ≠ g t ( x n ) ⟧ , ∙ t + 1 = ∑ n = 1 N u n ( t + 1 ) ⟦ y n = g t ( x n ) ⟧ \blacksquare_{t+1} = \sum_{n=1}^{N} u_n^{(t+1)} \llbracket y_n \ne g_t(\mathbf{x}_n) \rrbracket, \qquad \bullet_{t+1} = \sum_{n=1}^{N} u_n^{(t+1)} \llbracket y_n = g_t(\mathbf{x}_n) \rrbracket ■ t + 1 = n = 1 ∑ N u n ( t + 1 ) [ [ y n = g t ( x n ) ] ] , ∙ t + 1 = n = 1 ∑ N u n ( t + 1 ) [ [ y n = g t ( x n ) ] ]
每筆資料不是答錯就是答對,所以全部權重的總和是 ■ t + 1 + ∙ t + 1 \blacksquare_{t+1} + \bullet_{t+1} ■ t + 1 + ∙ t + 1 ,目標變成
■ t + 1 ■ t + 1 + ∙ t + 1 = 1 2 ⟺ ■ t + 1 = ∙ t + 1 \frac{\blacksquare_{t+1}}{\blacksquare_{t+1} + \bullet_{t+1}} = \frac{1}{2} \quad\Longleftrightarrow\quad \blacksquare_{t+1} = \bullet_{t+1} ■ t + 1 + ∙ t + 1 ■ t + 1 = 2 1 ⟺ ■ t + 1 = ∙ t + 1
等價的理由:左式交叉相乘是 2 ■ t + 1 = ■ t + 1 + ∙ t + 1 2\blacksquare_{t+1} = \blacksquare_{t+1} + \bullet_{t+1} 2 ■ t + 1 = ■ t + 1 + ∙ t + 1 ,移項就是右式。所以要做的事只有一件:把答錯那一群的權重總和,跟答對那一群的權重總和,調成一樣大。
課堂上說做得到這件事的方法很多,講義選的是跟故事裡放大縮小照片一樣的做法:每一群各乘上一個數。講義用一組數字示範。假設在目前的權重 u ( t ) \mathbf{u}^{(t)} u ( t ) 下,答錯的總和是 1126,答對的總和是 6211:
答錯的那一群 答對的那一群 目前的權重總和 1126 1126 1126 6211 6211 6211 佔全部(7337 7337 7337 )的比例 1126 7337 \frac{1126}{7337} 7337 1126 6211 7337 \frac{6211}{7337} 7337 6211 講義的做法:每筆乘上 6211 6211 6211 1126 1126 1126 新的權重總和 1126 × 6211 1126 \times 6211 1126 × 6211 6211 × 1126 6211 \times 1126 6211 × 1126
兩邊互乘對方的總和,新的總和當然相等,都是 6,993,586 6{,}993{,}586 6 , 993 , 586 (本文驗算)。同除以 7337 7337 7337 也一樣:答錯的每筆乘上 6211 7337 \frac{6211}{7337} 7337 6211 (答對的比例),答對的每筆乘上 1126 7337 \frac{1126}{7337} 7337 1126 (答錯的比例),兩邊都變成 1126 × 6211 7337 ≈ 953.19 \frac{1126 \times 6211}{7337} \approx 953.19 7337 1126 × 6211 ≈ 953.19 。
把數字換成符號。令 g t g_t g t 在目前權重下的加權錯誤率為
ϵ t = ∑ n = 1 N u n ( t ) ⟦ y n ≠ g t ( x n ) ⟧ ∑ n = 1 N u n ( t ) \epsilon_t = \frac{\sum_{n=1}^{N} u_n^{(t)} \llbracket y_n \ne g_t(\mathbf{x}_n) \rrbracket}{\sum_{n=1}^{N} u_n^{(t)}} ϵ t = ∑ n = 1 N u n ( t ) ∑ n = 1 N u n ( t ) [ [ y n = g t ( x n ) ] ]
再令 U = ∑ n u n ( t ) U = \sum_n u_n^{(t)} U = ∑ n u n ( t ) 。答錯那一群的總和是 ϵ t U \epsilon_t U ϵ t U ,答對那一群是 ( 1 − ϵ t ) U (1 - \epsilon_t)U ( 1 − ϵ t ) U 。答錯的每筆乘 ( 1 − ϵ t ) (1 - \epsilon_t) ( 1 − ϵ t ) 、答對的每筆乘 ϵ t \epsilon_t ϵ t 之後:
ϵ t U ⋅ ( 1 − ϵ t ) ⏟ incorrect = ( 1 − ϵ t ) U ⋅ ϵ t ⏟ correct \underbrace{\epsilon_t U \cdot (1 - \epsilon_t)}_{\text{incorrect}} \ =\ \underbrace{(1 - \epsilon_t) U \cdot \epsilon_t}_{\text{correct}} incorrect ϵ t U ⋅ ( 1 − ϵ t ) = correct ( 1 − ϵ t ) U ⋅ ϵ t
講義把這個結論叫作 'optimal' re-weighting:
答錯的乘上正比於 ( 1 − ϵ t ) (1 - \epsilon_t) ( 1 − ϵ t ) 的數,答對的乘上正比於 ϵ t \epsilon_t ϵ t 的數。
「正比於」的意思是兩個倍數可以同乘一個正的常數,因為兩邊的總和會一起放大,仍然相等。真正被決定的只有兩個倍數的比值 ( 1 − ϵ t ) : ϵ t (1 - \epsilon_t) : \epsilon_t ( 1 − ϵ t ) : ϵ t 。講義的例子裡 ϵ t = 1126 7337 ≈ 0.153 \epsilon_t = \frac{1126}{7337} \approx 0.153 ϵ t = 7337 1126 ≈ 0.153 ,這個比值是 6211 : 1126 ≈ 5.52 6211 : 1126 \approx 5.52 6211 : 1126 ≈ 5.52 :每一筆答錯的資料,相對於每一筆答對的資料,重要性被拉高到原本的 5.52 倍。
課堂上在這裡收尾:兩邊調成一樣,原本的 g t g_t g t 在新的一輪就表現得很差,應該不會再被基礎演算法選到。
Fun Time:四筆資料錯一筆
題目(第 13 頁): 四筆資料,每一筆的 u n ( 1 ) = 1 4 u_n^{(1)} = \frac{1}{4} u n ( 1 ) = 4 1 。g 1 g_1 g 1 把第 1 筆分錯,其他三筆都分對。做完 'optimal' re-weighting 之後,u 1 ( 2 ) / u 2 ( 2 ) u_1^{(2)} / u_2^{(2)} u 1 ( 2 ) / u 2 ( 2 ) 是多少?
4 4 4
3 3 3
1 / 3 1/3 1/3
1 / 4 1/4 1/4
答案:2。 權重都相等,所以 ϵ 1 = 1 4 \epsilon_1 = \frac{1}{4} ϵ 1 = 4 1 。第 1 筆答錯,乘上正比於 1 − ϵ 1 = 3 4 1 - \epsilon_1 = \frac{3}{4} 1 − ϵ 1 = 4 3 的數;第 2 筆答對,乘上正比於 ϵ 1 = 1 4 \epsilon_1 = \frac{1}{4} ϵ 1 = 4 1 的數。兩筆原本的權重相同,比值就是 3 / 4 1 / 4 = 3 \frac{3/4}{1/4} = 3 1/4 3/4 = 3 。講義的說法是第 1 筆現在比其他任何一筆重要三倍。
驗算目標有沒有達成:新權重正比於 ( 3 , 1 , 1 , 1 ) (3, 1, 1, 1) ( 3 , 1 , 1 , 1 ) ,答錯那一群的總和是 3,答對那一群是 1 + 1 + 1 = 3 1 + 1 + 1 = 3 1 + 1 + 1 = 3 ,g 1 g_1 g 1 的加權錯誤率是 3 6 = 1 2 \frac{3}{6} = \frac{1}{2} 6 3 = 2 1 。
其他選項:4 4 4 是 1 ϵ 1 \frac{1}{\epsilon_1} ϵ 1 1 ,等於只記得答對的要乘 ϵ 1 \epsilon_1 ϵ 1 ,卻讓答錯的乘 1;答錯的倍數是 1 − ϵ 1 1 - \epsilon_1 1 − ϵ 1 ,正確的比值是 1 − ϵ 1 ϵ 1 \frac{1 - \epsilon_1}{\epsilon_1} ϵ 1 1 − ϵ 1 。1 3 \frac{1}{3} 3 1 是把分子分母放反,那是 u 2 ( 2 ) / u 1 ( 2 ) u_2^{(2)} / u_1^{(2)} u 2 ( 2 ) / u 1 ( 2 ) ;1 4 \frac{1}{4} 4 1 則是 ϵ 1 \epsilon_1 ϵ 1 本身。一個快速的檢查:答錯的資料應該變重,所以答案一定大於 1,後兩個選項可以直接排除。
AdaBoost 演算法:縮放因子、票數與理論保證
YouTube:Adaptive Boosting :: Adaptive Boosting Algorithm @ Machine Learning Techniques (機器學習技法)
(影片 00:00–02:24 是縮放因子,02:24–04:58 是初步的演算法與兩個缺口,04:58–08:00 決定票數,08:00–10:01 是完整演算法,10:01–13:07 是理論保證,之後是 Fun Time。)
縮放因子 ◆:答錯的乘、答對的除
最佳重新加權的結論是兩個倍數:答錯乘 ( 1 − ϵ t ) (1 - \epsilon_t) ( 1 − ϵ t ) ,答對乘 ϵ t \epsilon_t ϵ t ,而且可以同乘一個常數。講義第 14 頁挑了一個讓式子對稱的常數,定義縮放因子(scaling factor)
⧫ t = 1 − ϵ t ϵ t \blacklozenge_t = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}} ⧫ t = ϵ t 1 − ϵ t
然後把更新規則寫成
incorrect ← incorrect ⋅ ⧫ t , correct ← correct / ⧫ t \text{incorrect} \leftarrow \text{incorrect} \cdot \blacklozenge_t, \qquad \text{correct} \leftarrow \text{correct} \,/\, \blacklozenge_t incorrect ← incorrect ⋅ ⧫ t , correct ← correct / ⧫ t
講義說這跟最佳重新加權等價,推導如下。把原本的兩個倍數同除以 ϵ t ( 1 − ϵ t ) \sqrt{\epsilon_t(1 - \epsilon_t)} ϵ t ( 1 − ϵ t ) :
1 − ϵ t ϵ t ( 1 − ϵ t ) = 1 − ϵ t ϵ t = ⧫ t , ϵ t ϵ t ( 1 − ϵ t ) = ϵ t 1 − ϵ t = 1 ⧫ t \frac{1 - \epsilon_t}{\sqrt{\epsilon_t(1 - \epsilon_t)}} = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}} = \blacklozenge_t, \qquad \frac{\epsilon_t}{\sqrt{\epsilon_t(1 - \epsilon_t)}} = \sqrt{\frac{\epsilon_t}{1 - \epsilon_t}} = \frac{1}{\blacklozenge_t} ϵ t ( 1 − ϵ t ) 1 − ϵ t = ϵ t 1 − ϵ t = ⧫ t , ϵ t ( 1 − ϵ t ) ϵ t = 1 − ϵ t ϵ t = ⧫ t 1
兩個倍數的比值仍是 ⧫ t ÷ 1 ⧫ t = ⧫ t 2 = 1 − ϵ t ϵ t \blacklozenge_t \div \frac{1}{\blacklozenge_t} = \blacklozenge_t^2 = \frac{1 - \epsilon_t}{\epsilon_t} ⧫ t ÷ ⧫ t 1 = ⧫ t 2 = ϵ t 1 − ϵ t ,課堂上也是用這個比值說明兩種寫法效果相同。直接驗算也可以:答錯那一群的新總和是 ϵ t U ⋅ ⧫ t = U ϵ t ( 1 − ϵ t ) \epsilon_t U \cdot \blacklozenge_t = U\sqrt{\epsilon_t(1 - \epsilon_t)} ϵ t U ⋅ ⧫ t = U ϵ t ( 1 − ϵ t ) ,答對那一群是 ( 1 − ϵ t ) U / ⧫ t = U ϵ t ( 1 − ϵ t ) (1 - \epsilon_t)U / \blacklozenge_t = U\sqrt{\epsilon_t(1 - \epsilon_t)} ( 1 − ϵ t ) U / ⧫ t = U ϵ t ( 1 − ϵ t ) ,兩者相等。
換成 ⧫ t \blacklozenge_t ⧫ t 的好處是它有直接的物理意義。講義寫的是 ⧫ t ≥ 1 \blacklozenge_t \ge 1 ⧫ t ≥ 1 若且唯若 ϵ t ≤ 1 2 \epsilon_t \le \frac{1}{2} ϵ t ≤ 2 1 :
⧫ t ≥ 1 ⟺ 1 − ϵ t ϵ t ≥ 1 ⟺ 1 − ϵ t ≥ ϵ t ⟺ ϵ t ≤ 1 2 \blacklozenge_t \ge 1 \iff \frac{1 - \epsilon_t}{\epsilon_t} \ge 1 \iff 1 - \epsilon_t \ge \epsilon_t \iff \epsilon_t \le \frac{1}{2} ⧫ t ≥ 1 ⟺ ϵ t 1 − ϵ t ≥ 1 ⟺ 1 − ϵ t ≥ ϵ t ⟺ ϵ t ≤ 2 1
課堂上補充,ϵ t \epsilon_t ϵ t 通常會比 1 2 \frac{1}{2} 2 1 小,因為 1 2 \frac{1}{2} 2 1 是亂猜的水準,底下有一個演算法在學,應該要學得比亂猜好。這時 ⧫ t > 1 \blacklozenge_t > 1 ⧫ t > 1 ,「乘上 ⧫ t \blacklozenge_t ⧫ t 」是真的放大,「除以 ⧫ t \blacklozenge_t ⧫ t 」是真的縮小,也就是講義寫的 scale up incorrect、scale down correct,跟故事裡的老師做的事一樣。課堂上還拿基石第 2 堂的 PLA 來比:概念上有一點像,有錯就想辦法修正。
講義舉的例子 ϵ t = 1126 7337 \epsilon_t = \frac{1126}{7337} ϵ t = 7337 1126 對應 ⧫ t = 6211 / 1126 ≈ 2.349 \blacklozenge_t = \sqrt{6211/1126} \approx 2.349 ⧫ t = 6211/1126 ≈ 2.349 (本文計算):答錯的每筆乘 2.349,答對的每筆除以 2.349。
還缺兩塊:第一輪的權重,以及最後怎麼合
講義第 15 頁把目前有的東西寫成一個初步的演算法,留了兩個問號:
u ( 1 ) = ? \mathbf{u}^{(1)} = ? u ( 1 ) = ?
對 t = 1 , 2 , … , T t = 1, 2, \dots, T t = 1 , 2 , … , T :用 A ( D , u ( t ) ) \mathcal{A}(\mathcal{D}, \mathbf{u}^{(t)}) A ( D , u ( t ) ) 得到 g t g_t g t ,其中 A \mathcal{A} A 試著最小化 u ( t ) \mathbf{u}^{(t)} u ( t ) 加權的 0/1 錯誤;再用 ⧫ t \blacklozenge_t ⧫ t 把 u ( t ) \mathbf{u}^{(t)} u ( t ) 更新成 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) 。
回傳 G ( x ) = ? G(\mathbf{x}) = ? G ( x ) = ?
第一輪的權重。 講義的回答是希望 g 1 g_1 g 1 對原本的 E in E_{\text{in}} E in 是「最好」的,所以 u n ( 1 ) = 1 N u_n^{(1)} = \frac{1}{N} u n ( 1 ) = N 1 。每筆權重相同時,加權錯誤就是一般的 E in E_{\text{in}} E in 。
最後怎麼合。 最直覺的是像 bagging 那樣一人一票。講義在這個選項旁邊寫了一句 but g 2 g_2 g 2 very bad for E in E_{\text{in}} E in ,還附了一個「why? :-)」。課堂上的解釋是:g 1 g_1 g 1 是在均勻權重下選出來的,對 E in E_{\text{in}} E in 很好;g 2 g_2 g 2 是在刻意讓 g 1 g_1 g 1 失效的權重下選出來的,跟 g 1 g_1 g 1 很不一樣,對原本的 E in E_{\text{in}} E in 大概就不好了。讓一個好的和一個差的一人一票,結果可能不會太好。
本文補充:「很差」是一個傾向,不是定理。這一堂能嚴格保證的只有加權的敘述:g t g_t g t 在 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) 下的錯誤率是 1 2 \frac{1}{2} 2 1 。後面的數值例子裡,g 2 g_2 g 2 在原始資料上的錯誤率跟 g 1 g_1 g 1 一樣是 1 3 \frac{1}{3} 3 1 。
講義接著說,要用線性或非線性的方式合都可以(as you wish),課堂上的意思是拿到一堆 g t g_t g t 之後,上一堂的各種 blending 都能再套一次。但這堂要介紹的是一個特別的做法:在學 g t g_t g t 的過程中順便把線性組合的係數決定掉,講義稱為 linear aggregation on the fly,而且有理論保證。
邊學邊決定票數
講義第 16 頁在迴圈裡加了第三步:
α t = ln ( ⧫ t ) , G ( x ) = sign ( ∑ t = 1 T α t g t ( x ) ) \alpha_t = \ln(\blacklozenge_t), \qquad G(\mathbf{x}) = \text{sign}\left(\sum_{t=1}^{T}\alpha_t g_t(\mathbf{x})\right) α t = ln ( ⧫ t ) , G ( x ) = sign ( t = 1 ∑ T α t g t ( x ) )
課堂上解釋 on the fly:決定一個 g t g_t g t 就決定一個 α t \alpha_t α t ,整個演算法跑完時兩者都有了,不需要回頭再解一次線性 blending。
α t \alpha_t α t 的設計要求是好的 g t g_t g t 拿多一點票。課堂上的推理是:好的 g t g_t g t 的 ϵ t \epsilon_t ϵ t 小,ϵ t \epsilon_t ϵ t 小則 ⧫ t \blacklozenge_t ⧫ t 大,所以讓 α t \alpha_t α t 是 ⧫ t \blacklozenge_t ⧫ t 的某個單調遞增函數就符合要求。講義寫成 α t = monotonic ( ⧫ t ) \alpha_t = \text{monotonic}(\blacklozenge_t) α t = monotonic ( ⧫ t ) ,然後直接取自然對數。課堂上只說這是設計這個演算法的人做的特殊選擇,沒有在這堂解釋為什麼是對數;講義把它稱為 'magic' linear aggregation。理由要等到技法第 11 堂:梯度提升決策樹 從最佳化的角度重看 AdaBoost 才會出現。
講義檢查了兩個極端:
ϵ t = 1 2 \epsilon_t = \frac{1}{2} ϵ t = 2 1 :⧫ t = 1 \blacklozenge_t = 1 ⧫ t = 1 ,α t = ln 1 = 0 \alpha_t = \ln 1 = 0 α t = ln 1 = 0 。課堂上的講法是,跟丟銅板一樣差的 g t g_t g t 一票也不給,等於不讓它進到 G G G 裡。
ϵ t = 0 \epsilon_t = 0 ϵ t = 0 :⧫ t = ∞ \blacklozenge_t = \infty ⧫ t = ∞ ,α t = ∞ \alpha_t = \infty α t = ∞ 。g t g_t g t 單槍匹馬就把加權錯誤做到 0,那就給它無限多票,G G G 完全聽它的。
中間的情況,本文列幾個數字(都用 α t = 1 2 ln 1 − ϵ t ϵ t \alpha_t = \frac{1}{2}\ln\frac{1 - \epsilon_t}{\epsilon_t} α t = 2 1 ln ϵ t 1 − ϵ t 算,已用 Python 驗算):
ϵ t \epsilon_t ϵ t ⧫ t \blacklozenge_t ⧫ t α t \alpha_t α t 0.10 0.10 0.10 3.000 3.000 3.000 1.099 1.099 1.099 0.25 0.25 0.25 1.732 1.732 1.732 0.549 0.549 0.549 0.40 0.40 0.40 1.225 1.225 1.225 0.203 0.203 0.203 0.49 0.49 0.49 1.020 1.020 1.020 0.020 0.020 0.020 0.50 0.50 0.50 1.000 1.000 1.000 0 0 0
錯誤率從 0.40 0.40 0.40 降到 0.10 0.10 0.10 ,票數變成原本的五倍多;只比亂猜好一點點的 g t g_t g t (ϵ t = 0.49 \epsilon_t = 0.49 ϵ t = 0.49 )幾乎沒有發言權。
同一頁把 AdaBoost 拆成三個元件,各自對回故事裡的角色:
元件 角色 做什麼 弱的基礎演算法 A \mathcal{A} A 學生 看著老師準備好的權重,挑出這一輪最好的 g t g_t g t 最佳重新加權因子 ⧫ t \blacklozenge_t ⧫ t 老師 放大答錯的、縮小答對的 'magic' 線性組合 α t \alpha_t α t 全班 把每個 g t g_t g t 依表現加權合成 G G G
完整的演算法
講義第 17 頁是完整版:
初始化 u ( 1 ) = [ 1 N , 1 N , … , 1 N ] \mathbf{u}^{(1)} = \left[\frac{1}{N}, \frac{1}{N}, \dots, \frac{1}{N}\right] u ( 1 ) = [ N 1 , N 1 , … , N 1 ] 。
對 t = 1 , 2 , … , T t = 1, 2, \dots, T t = 1 , 2 , … , T :
用 A ( D , u ( t ) ) \mathcal{A}(\mathcal{D}, \mathbf{u}^{(t)}) A ( D , u ( t ) ) 得到 g t g_t g t ,其中 A \mathcal{A} A 試著最小化 u ( t ) \mathbf{u}^{(t)} u ( t ) 加權的 0/1 錯誤。
算出 ϵ t \epsilon_t ϵ t 與 ⧫ t \blacklozenge_t ⧫ t ,把 u ( t ) \mathbf{u}^{(t)} u ( t ) 更新成 u ( t + 1 ) \mathbf{u}^{(t+1)} u ( t + 1 ) :答錯的資料 u n ( t + 1 ) ← u n ( t ) ⋅ ⧫ t u_n^{(t+1)} \leftarrow u_n^{(t)} \cdot \blacklozenge_t u n ( t + 1 ) ← u n ( t ) ⋅ ⧫ t ,答對的資料 u n ( t + 1 ) ← u n ( t ) / ⧫ t u_n^{(t+1)} \leftarrow u_n^{(t)} / \blacklozenge_t u n ( t + 1 ) ← u n ( t ) / ⧫ t 。
算出 α t = ln ( ⧫ t ) \alpha_t = \ln(\blacklozenge_t) α t = ln ( ⧫ t ) 。
回傳 G ( x ) = sign ( ∑ t = 1 T α t g t ( x ) ) G(\mathbf{x}) = \text{sign}\left(\sum_{t=1}^{T}\alpha_t g_t(\mathbf{x})\right) G ( x ) = sign ( ∑ t = 1 T α t g t ( x ) ) 。
其中
⧫ t = 1 − ϵ t ϵ t , ϵ t = ∑ n = 1 N u n ( t ) ⟦ y n ≠ g t ( x n ) ⟧ ∑ n = 1 N u n ( t ) \blacklozenge_t = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}}, \qquad \epsilon_t = \frac{\sum_{n=1}^{N} u_n^{(t)} \llbracket y_n \ne g_t(\mathbf{x}_n) \rrbracket}{\sum_{n=1}^{N} u_n^{(t)}} ⧫ t = ϵ t 1 − ϵ t , ϵ t = ∑ n = 1 N u n ( t ) ∑ n = 1 N u n ( t ) [ [ y n = g t ( x n ) ] ]
本文補充兩個實作時會遇到的細節。第一,權重不需要正規化成總和為 1:ϵ t \epsilon_t ϵ t 是比例,把所有 u n u_n u n 同乘一個常數,ϵ t \epsilon_t ϵ t 、⧫ t \blacklozenge_t ⧫ t 、α t \alpha_t α t 與「哪個假說的加權錯誤最小」都不變。後面手算時會利用這一點,把權重寫成整數比。第二,如果某一輪 ϵ t = 0 \epsilon_t = 0 ϵ t = 0 ,⧫ t \blacklozenge_t ⧫ t 要除以 0,程式得另外處理;這時 g t g_t g t 自己就完全分對了加權資料,照講義的說法它該拿無限多票。
課堂上提到 AdaBoost 有個中文譯名叫皮匠法,取三個臭皮匠勝過一個諸葛亮的意思;講義最後一頁的總結用的是英文的 two heads are better than one。讓弱的 g t g_t g t 變強這個性質叫 boosting,講義在這一頁的頁尾寫 AdaBoost 具有可以證明的 boosting 性質。
理論保證:兩項都能壓小
講義第 18 頁把基石的 VC bound 套在 G G G 上:
E out ( G ) ≤ E in ( G ) + O ( O ( d VC ( H ) ⋅ T log T ) ⏟ d VC of all possible G ⋅ log N N ) E_{\text{out}}(G) \le E_{\text{in}}(G) + O\left(\sqrt{\underbrace{O\big(d_{\text{VC}}(\mathcal{H}) \cdot T\log T\big)}_{d_{\text{VC}} \text{ of all possible } G} \cdot \frac{\log N}{N}}\right) E out ( G ) ≤ E in ( G ) + O d VC of all possible G O ( d VC ( H ) ⋅ T log T ) ⋅ N log N
右邊第一項是 G G G 在訓練資料上的表現,第二項是模型複雜度的代價。課堂上說明第二項的來源:d VC ( H ) d_{\text{VC}}(\mathcal{H}) d VC ( H ) 是單一個 g t g_t g t 所在的假說集合的複雜度,把 T T T 個合起來,整體的 VC 維度可以被證明大約是它的 T log T T\log T T log T 倍;其餘是標準的 VC bound 形式。課堂上明講這裡不做詳細的證明。
講義對兩項各下一個結論:
第一項可以很小。 只要每一輪都有 ϵ t ≤ ϵ < 1 2 \epsilon_t \le \epsilon < \frac{1}{2} ϵ t ≤ ϵ < 2 1 ,經過 T = O ( log N ) T = O(\log N) T = O ( log N ) 輪之後 E in ( G ) = 0 E_{\text{in}}(G) = 0 E in ( G ) = 0 。課堂上說這是原作者證明的結果。
第二項可以很小。 整體的 d VC d_{\text{VC}} d VC 隨 T T T 成長得「慢」。課堂上的說法是 T T T 只需要 log N \log N log N 那麼多,等資料量 N N N 夠大,整個第二項也會小。
兩項都小,E out ( G ) E_{\text{out}}(G) E out ( G ) 就小。講義把這個結論叫作 boosting view of AdaBoost:
如果 A \mathcal{A} A 很弱,但永遠比亂猜好一點(ϵ t ≤ ϵ < 1 2 \epsilon_t \le \epsilon < \frac{1}{2} ϵ t ≤ ϵ < 2 1 ),那麼 AdaBoost 加上 A \mathcal{A} A 可以很強(E in = 0 E_{\text{in}} = 0 E in = 0 而且 E out E_{\text{out}} E out 小)。
課堂上的講法是:對底下的演算法只要求一點點,就是比亂猜好一點點,AdaBoost 就能讓它愈變愈強,強到 E in E_{\text{in}} E in 是 0、E out E_{\text{out}} E out 也有保證。
本文補充:要注意條件裡的 ϵ \epsilon ϵ 是一個固定的、小於 1 2 \frac{1}{2} 2 1 的數,每一輪的 ϵ t \epsilon_t ϵ t 都不能超過它。ϵ t \epsilon_t ϵ t 是在愈來愈刁鑽的權重下量的,所以這個條件並不輕鬆:它要求基礎演算法不管面對什麼權重,都拿得出一個比亂猜好的假說。
本文補充:O(log N) 輪是怎麼來的
以下內容不在這堂的講義上,課堂上也沒有做,寫在這裡是為了讓講義第 18 頁那句「T = O ( log N ) T = O(\log N) T = O ( log N ) 」有個來由。整個論證靠三件事。第一件是 Fall 2024 作業的一題證明題(見文末的練習),所以這裡只給結論與直覺,證明留給你自己做;另外兩件本文走完。
第一件(只給結論):權重總和每一輪乘上一個小於 1 的數。 令 U t = ∑ n u n ( t ) U_t = \sum_n u_n^{(t)} U t = ∑ n u n ( t ) 。每做完一輪更新,
U t + 1 = U t ⋅ 2 ϵ t ( 1 − ϵ t ) U_{t+1} = U_t \cdot 2\sqrt{\epsilon_t(1 - \epsilon_t)} U t + 1 = U t ⋅ 2 ϵ t ( 1 − ϵ t )
ϵ t ≠ 1 2 \epsilon_t \ne \frac{1}{2} ϵ t = 2 1 時 2 ϵ t ( 1 − ϵ t ) < 1 2\sqrt{\epsilon_t(1 - \epsilon_t)} < 1 2 ϵ t ( 1 − ϵ t ) < 1 ,所以權重總和一直在縮小。這個因子只看 ϵ t \epsilon_t ϵ t :g t g_t g t 愈好(ϵ t \epsilon_t ϵ t 愈小)縮得愈快,ϵ t \epsilon_t ϵ t 愈接近 1 2 \frac{1}{2} 2 1 因子愈接近 1。可以先拿後面六張水果照片的例子對數字:三輪的 ϵ t \epsilon_t ϵ t 是 1 3 , 1 4 , 1 6 \frac{1}{3}, \frac{1}{4}, \frac{1}{6} 3 1 , 4 1 , 6 1 ,因子是 0.943 , 0.866 , 0.745 0.943, 0.866, 0.745 0.943 , 0.866 , 0.745 ,權重總和就是 1 → 0.943 → 0.816 → 0.609 1 \to 0.943 \to 0.816 \to 0.609 1 → 0.943 → 0.816 → 0.609 。
第二件:每筆資料最後的權重記錄了它的得票。 y n y_n y n 與 g t ( x n ) g_t(\mathbf{x}_n) g t ( x n ) 都是 ± 1 \pm 1 ± 1 ,答對時 y n g t ( x n ) = + 1 y_n g_t(\mathbf{x}_n) = +1 y n g t ( x n ) = + 1 、答錯時是 − 1 -1 − 1 ,所以「答錯乘 ⧫ t \blacklozenge_t ⧫ t 、答對除以 ⧫ t \blacklozenge_t ⧫ t 」可以寫成一條式子:
u n ( t + 1 ) = u n ( t ) ⋅ ⧫ t − y n g t ( x n ) = u n ( t ) ⋅ exp ( − y n α t g t ( x n ) ) u_n^{(t+1)} = u_n^{(t)} \cdot \blacklozenge_t^{-y_n g_t(\mathbf{x}_n)} = u_n^{(t)} \cdot \exp\big(-y_n\alpha_t g_t(\mathbf{x}_n)\big) u n ( t + 1 ) = u n ( t ) ⋅ ⧫ t − y n g t ( x n ) = u n ( t ) ⋅ exp ( − y n α t g t ( x n ) )
第二個等號用的是 ⧫ t = e α t \blacklozenge_t = e^{\alpha_t} ⧫ t = e α t 。從 u n ( 1 ) = 1 N u_n^{(1)} = \frac{1}{N} u n ( 1 ) = N 1 連乘 T T T 輪:
u n ( T + 1 ) = 1 N exp ( − y n ∑ t = 1 T α t g t ( x n ) ) u_n^{(T+1)} = \frac{1}{N}\exp\left(-y_n\sum_{t=1}^{T}\alpha_t g_t(\mathbf{x}_n)\right) u n ( T + 1 ) = N 1 exp ( − y n t = 1 ∑ T α t g t ( x n ) )
指數裡的加總正是 G G G 取 sign 之前的分數。對數這個選擇在這裡露出一點用意:它讓權重與投票分數直接掛勾。技法第 11 堂的講義會寫出同一條式子,並從這裡出發重看 AdaBoost。
第三件:權重總和壓住 E in ( G ) E_{\text{in}}(G) E in ( G ) 。 如果 G G G 把第 n n n 筆分錯,y n y_n y n 與分數異號(或分數是 0),指數裡的量大於等於 0,於是 u n ( T + 1 ) ≥ 1 N u_n^{(T+1)} \ge \frac{1}{N} u n ( T + 1 ) ≥ N 1 。每一筆被 G G G 分錯的資料至少貢獻 1 N \frac{1}{N} N 1 ,所以
E in ( G ) = number of errors N ≤ ∑ n = 1 N u n ( T + 1 ) = U T + 1 E_{\text{in}}(G) = \frac{\text{number of errors}}{N} \le \sum_{n=1}^{N} u_n^{(T+1)} = U_{T+1} E in ( G ) = N number of errors ≤ n = 1 ∑ N u n ( T + 1 ) = U T + 1
合起來。 U 1 = 1 U_1 = 1 U 1 = 1 ,再把第一件的結論連乘 T T T 輪。函數 x ( 1 − x ) x(1 - x) x ( 1 − x ) 在 0 ≤ x ≤ 1 2 0 \le x \le \frac{1}{2} 0 ≤ x ≤ 2 1 之間遞增,ϵ t ≤ ϵ \epsilon_t \le \epsilon ϵ t ≤ ϵ 就表示每個因子都不超過 2 ϵ ( 1 − ϵ ) 2\sqrt{\epsilon(1 - \epsilon)} 2 ϵ ( 1 − ϵ ) :
E in ( G ) ≤ U T + 1 = ∏ t = 1 T 2 ϵ t ( 1 − ϵ t ) ≤ ( 2 ϵ ( 1 − ϵ ) ) T E_{\text{in}}(G) \le U_{T+1} = \prod_{t=1}^{T} 2\sqrt{\epsilon_t(1 - \epsilon_t)} \le \Big(2\sqrt{\epsilon(1 - \epsilon)}\Big)^T E in ( G ) ≤ U T + 1 = t = 1 ∏ T 2 ϵ t ( 1 − ϵ t ) ≤ ( 2 ϵ ( 1 − ϵ ) ) T
令 r = 2 ϵ ( 1 − ϵ ) r = 2\sqrt{\epsilon(1 - \epsilon)} r = 2 ϵ ( 1 − ϵ ) ,它是一個小於 1 的常數。E in ( G ) E_{\text{in}}(G) E in ( G ) 只能是 1 N \frac{1}{N} N 1 的整數倍,所以只要 r T < 1 N r^T < \frac{1}{N} r T < N 1 ,E in ( G ) E_{\text{in}}(G) E in ( G ) 就只能是 0。解出 T T T :
r T < 1 N ⟺ T > ln N ln ( 1 / r ) r^T < \frac{1}{N} \iff T > \frac{\ln N}{\ln(1/r)} r T < N 1 ⟺ T > ln ( 1/ r ) ln N
分母是只跟 ϵ \epsilon ϵ 有關的常數,所以 T = O ( log N ) T = O(\log N) T = O ( log N ) 。舉例:ϵ = 0.4 \epsilon = 0.4 ϵ = 0.4 時 r ≈ 0.9798 r \approx 0.9798 r ≈ 0.9798 ,N = 1000 N = 1000 N = 1000 需要 T > 338.4 T > 338.4 T > 338.4 ,也就是 339 輪保證 E in ( G ) = 0 E_{\text{in}}(G) = 0 E in ( G ) = 0 。這是保證用的上界,實際上常常早得多。
Fun Time:α 什麼時候是正的
題目(第 19 頁): 依照 α t = ln ( ⧫ t ) \alpha_t = \ln(\blacklozenge_t) α t = ln ( ⧫ t ) 與 ⧫ t = 1 − ϵ t ϵ t \blacklozenge_t = \sqrt{\frac{1 - \epsilon_t}{\epsilon_t}} ⧫ t = ϵ t 1 − ϵ t ,什麼時候 α t > 0 \alpha_t > 0 α t > 0 ?
ϵ t < 1 2 \epsilon_t < \frac{1}{2} ϵ t < 2 1
ϵ t > 1 2 \epsilon_t > \frac{1}{2} ϵ t > 2 1
ϵ t ≠ 1 \epsilon_t \ne 1 ϵ t = 1
ϵ t ≠ 0 \epsilon_t \ne 0 ϵ t = 0
答案:1。 ln \ln ln 在引數大於 1 時為正,所以 α t > 0 ⟺ ⧫ t > 1 ⟺ 1 − ϵ t ϵ t > 1 ⟺ ϵ t < 1 2 \alpha_t > 0 \iff \blacklozenge_t > 1 \iff \frac{1 - \epsilon_t}{\epsilon_t} > 1 \iff \epsilon_t < \frac{1}{2} α t > 0 ⟺ ⧫ t > 1 ⟺ ϵ t 1 − ϵ t > 1 ⟺ ϵ t < 2 1 。講義的解答說數學的部分不難,有意思的是物理意義:g t g_t g t 對 G G G 有用(票數為正),若且唯若它的加權錯誤率比亂猜好。
其他選項:選項 2 的方向反了,ϵ t > 1 2 \epsilon_t > \frac{1}{2} ϵ t > 2 1 時 ⧫ t < 1 \blacklozenge_t < 1 ⧫ t < 1 ,α t \alpha_t α t 是負的。選項 3 與 4 都包含讓 α t \alpha_t α t 不為正的情況,例如 ϵ t = 0.7 \epsilon_t = 0.7 ϵ t = 0.7 既不是 1 也不是 0,但 α t = ln 3 / 7 ≈ − 0.424 \alpha_t = \ln\sqrt{3/7} \approx -0.424 α t = ln 3/7 ≈ − 0.424 。
本文補充:負的 α t \alpha_t α t 並不代表 g t g_t g t 沒用。ϵ t = 0.7 \epsilon_t = 0.7 ϵ t = 0.7 的 g t g_t g t 反過來用錯誤率就是 0.3 0.3 0.3 ,負的票數正好把它反過來,這跟上一堂說線性 blending 可以拿掉 α t ≥ 0 \alpha_t \ge 0 α t ≥ 0 限制是同一個道理。真正沒用的只有 ϵ t = 1 2 \epsilon_t = \frac{1}{2} ϵ t = 2 1 。
實際跑起來:decision stump、兩組示範與人臉偵測
YouTube:Adaptive Boosting :: Adaptive Boosting in Action @ Machine Learning Techniques (機器學習技法)
(影片 00:00–02:18 是 decision stump,02:18–05:05 是簡單資料的逐輪示範,05:05–06:35 是複雜資料,06:35–08:47 是人臉偵測,08:47–09:14 是 Fun Time,之後是總結與下一堂預告。)
弱的基礎演算法:decision stump
AdaBoost 需要一個弱的基礎演算法 A \mathcal{A} A 。講義第 20 頁的要求是它能把加權錯誤 E in u ( h ) = 1 N ∑ n u n ⋅ ⟦ y n ≠ h ( x n ) ⟧ E_{\text{in}}^{\mathbf{u}}(h) = \frac{1}{N}\sum_n u_n \cdot \llbracket y_n \ne h(\mathbf{x}_n) \rrbracket E in u ( h ) = N 1 ∑ n u n ⋅ [ [ y n = h ( x n ) ] ] 做到小「一點點」。常見的選擇是 decision stump,講義提醒這在基石的作業 2 出現過:
h s , i , θ ( x ) = s ⋅ sign ( x i − θ ) h_{s,i,\theta}(\mathbf{x}) = s \cdot \text{sign}(x_i - \theta) h s , i , θ ( x ) = s ⋅ sign ( x i − θ )
它有三個參數:看哪一個特徵 i i i 、門檻 θ \theta θ 切在哪裡、方向 s ∈ { + 1 , − 1 } s \in \{+1, -1\} s ∈ { + 1 , − 1 } (門檻右邊判成正的還是負的)。講義稱它為某個特徵上的 positive and negative rays。課堂上的形容是:它在每一個維度上就像一個只看那個維度的 perceptron,切一刀下去,一邊是正的、一邊是負的。在二維平面上,它就是講義第 7 頁那張圖裡的垂直線或水平線。
講義說它可以有效率地最佳化,時間是 O ( d ⋅ N log N ) O(d \cdot N\log N) O ( d ⋅ N log N ) ,d d d 是特徵數。課堂上的理由分兩層。第一,這三個參數的組合在資料上其實只有有限多種,全部搜尋一遍就能找到最好的,所以 decision stump 是少數能把 E in E_{\text{in}} E in 真的做到最小的假說集合,加權的版本也一樣。第二,把資料對每個特徵先排序,計算上再花點巧思,就能做到 O ( d ⋅ N log N ) O(d \cdot N\log N) O ( d ⋅ N log N ) ;課堂上把細節留給有興趣的同學。
本文把那個巧思補上。對單一特徵 i i i :把 N N N 筆資料依 x i x_i x i 排序,花 O ( N log N ) O(N\log N) O ( N log N ) 。門檻只有放在相鄰兩筆之間(或全部資料的外側)才會產生不同的分法,所以候選的 θ \theta θ 至多 N N N 個。讓 θ \theta θ 從最左邊開始一格一格往右移,每移一格只有一筆資料從門檻右邊換到左邊,加權錯誤只要加上或減去那一筆的 u n u_n u n ,是 O ( 1 ) O(1) O ( 1 ) 。s = − 1 s = -1 s = − 1 的加權錯誤等於權重總和減掉 s = + 1 s = +1 s = + 1 的加權錯誤,不用另外掃。所以每個特徵排序之後只要 O ( N ) O(N) O ( N ) ,d d d 個特徵合計 O ( d ⋅ N log N ) O(d \cdot N\log N) O ( d ⋅ N log N ) 。
講義對 decision stump 的總評是:能有效率地最小化 E in u E_{\text{in}}^{\mathbf{u}} E in u ,但單獨使用大概太弱。課堂上說只能切垂直刀和水平刀,自己用的話大部分時候不夠;現在有了 AdaBoost,弱也沒關係。兩者的組合叫 AdaBoost-Stump。
數值例子:六張水果照片手算三輪
以下是本文自擬的例子,不在講義上,數字都用 Python 算過(程式附在這一小節最後)。它沿用認蘋果的故事,但把每張照片簡化成一個特徵。
資料。 六張照片,特徵 x x x 是顏色等級,1 最綠、6 最紅。兩顆青蘋果在綠的一端,兩顆紅蘋果在紅的一端,中間是香蕉和橘子:
n n n 1 2 3 4 5 6 x n x_n x n 1 2 3 4 5 6 照片 青蘋果 青蘋果 香蕉 橘子 紅蘋果 紅蘋果 y n y_n y n + 1 +1 + 1 + 1 +1 + 1 − 1 -1 − 1 − 1 -1 − 1 + 1 +1 + 1 + 1 +1 + 1
候選的假說。 只有一個特徵,decision stump 是 h ( x ) = s ⋅ sign ( x − θ ) h(x) = s \cdot \text{sign}(x - \theta) h ( x ) = s ⋅ sign ( x − θ ) 。門檻放在 0.5 , 1.5 , … , 5.5 0.5, 1.5, \dots, 5.5 0.5 , 1.5 , … , 5.5 六個位置,各配兩個方向,共 12 條不同的規則。任何一條都只能切一刀,而正確答案是「兩端是蘋果、中間不是」,所以沒有一條能全對。真正會被用到的是下面三條,其餘九條在這三輪裡的加權錯誤率都比當輪被選中的那一條高:
代號 參數 白話 預測(n = 1 n = 1 n = 1 到 6 6 6 ) 答錯哪幾筆 A s = + 1 s = +1 s = + 1 ,θ = 0.5 \theta = 0.5 θ = 0.5 全部都是蘋果 + + + + + + + + + + + + + + + + + + 3、4 B s = − 1 s = -1 s = − 1 ,θ = 2.5 \theta = 2.5 θ = 2.5 偏綠的是蘋果 + + − − − − + + - - - - + + − − − − 5、6 C s = + 1 s = +1 s = + 1 ,θ = 4.5 \theta = 4.5 θ = 4.5 偏紅的是蘋果 − − − − + + - - - - + + − − − − + + 1、2
平手時約定取 θ \theta θ 比較小的那一條。
第 1 輪。 u n ( 1 ) = 1 6 u_n^{(1)} = \frac{1}{6} u n ( 1 ) = 6 1 ,每筆權重相同。A、B、C 各錯兩筆,加權錯誤率都是 2 6 = 1 3 \frac{2}{6} = \frac{1}{3} 6 2 = 3 1 ,是 12 條裡最低的。依約定取 A:g 1 = g_1 = g 1 = A。
ϵ 1 = 1 3 , ⧫ 1 = 2 / 3 1 / 3 = 2 ≈ 1.414 , α 1 = ln 2 ≈ 0.347 \epsilon_1 = \frac{1}{3}, \qquad \blacklozenge_1 = \sqrt{\frac{2/3}{1/3}} = \sqrt{2} \approx 1.414, \qquad \alpha_1 = \ln\sqrt{2} \approx 0.347 ϵ 1 = 3 1 , ⧫ 1 = 1/3 2/3 = 2 ≈ 1.414 , α 1 = ln 2 ≈ 0.347
更新:第 3、4 筆答錯,乘 2 \sqrt{2} 2 ,變成 1 6 2 ≈ 0.2357 \frac{1}{6}\sqrt{2} \approx 0.2357 6 1 2 ≈ 0.2357 ;其餘四筆除以 2 \sqrt{2} 2 ,變成 ≈ 0.1179 \approx 0.1179 ≈ 0.1179 。兩者的比是 ⧫ 1 2 = 2 \blacklozenge_1^2 = 2 ⧫ 1 2 = 2 ,所以新權重正比於 ( 1 , 1 , 2 , 2 , 1 , 1 ) (1, 1, 2, 2, 1, 1) ( 1 , 1 , 2 , 2 , 1 , 1 ) 。檢查:答錯那一群的總和是 2 + 2 = 4 2 + 2 = 4 2 + 2 = 4 ,答對那一群是 1 + 1 + 1 + 1 = 4 1 + 1 + 1 + 1 = 4 1 + 1 + 1 + 1 = 4 ,A 在新權重下的錯誤率正好 1 2 \frac{1}{2} 2 1 。
第 2 輪。 權重正比於 ( 1 , 1 , 2 , 2 , 1 , 1 ) (1, 1, 2, 2, 1, 1) ( 1 , 1 , 2 , 2 , 1 , 1 ) ,總和 8。
A 答錯 3、4:2 + 2 8 = 1 2 \frac{2 + 2}{8} = \frac{1}{2} 8 2 + 2 = 2 1 。上一輪的贏家現在跟丟銅板一樣。
B 答錯 5、6:1 + 1 8 = 1 4 \frac{1 + 1}{8} = \frac{1}{4} 8 1 + 1 = 4 1 。
C 答錯 1、2:1 + 1 8 = 1 4 \frac{1 + 1}{8} = \frac{1}{4} 8 1 + 1 = 4 1 。
B 與 C 平手,取 θ \theta θ 小的 B:g 2 = g_2 = g 2 = B。
ϵ 2 = 1 4 , ⧫ 2 = 3 ≈ 1.732 , α 2 = ln 3 ≈ 0.549 \epsilon_2 = \frac{1}{4}, \qquad \blacklozenge_2 = \sqrt{3} \approx 1.732, \qquad \alpha_2 = \ln\sqrt{3} \approx 0.549 ϵ 2 = 4 1 , ⧫ 2 = 3 ≈ 1.732 , α 2 = ln 3 ≈ 0.549
更新:第 5、6 筆乘 3 \sqrt{3} 3 ,其餘除以 3 \sqrt{3} 3 ,答錯與答對的倍數比是 3。原本的 ( 1 , 1 , 2 , 2 , 1 , 1 ) (1, 1, 2, 2, 1, 1) ( 1 , 1 , 2 , 2 , 1 , 1 ) 變成正比於 ( 1 , 1 , 2 , 2 , 3 , 3 ) (1, 1, 2, 2, 3, 3) ( 1 , 1 , 2 , 2 , 3 , 3 ) 。檢查:B 答錯的總和是 3 + 3 = 6 3 + 3 = 6 3 + 3 = 6 ,答對的是 1 + 1 + 2 + 2 = 6 1 + 1 + 2 + 2 = 6 1 + 1 + 2 + 2 = 6 。
第 3 輪。 權重正比於 ( 1 , 1 , 2 , 2 , 3 , 3 ) (1, 1, 2, 2, 3, 3) ( 1 , 1 , 2 , 2 , 3 , 3 ) ,總和 12。
A 答錯 3、4:4 12 = 1 3 \frac{4}{12} = \frac{1}{3} 12 4 = 3 1 。
B 答錯 5、6:6 12 = 1 2 \frac{6}{12} = \frac{1}{2} 12 6 = 2 1 。這次輪到 B 變成丟銅板。
C 答錯 1、2:2 12 = 1 6 \frac{2}{12} = \frac{1}{6} 12 2 = 6 1 。
g 3 = g_3 = g 3 = C。
ϵ 3 = 1 6 , ⧫ 3 = 5 ≈ 2.236 , α 3 = ln 5 ≈ 0.805 \epsilon_3 = \frac{1}{6}, \qquad \blacklozenge_3 = \sqrt{5} \approx 2.236, \qquad \alpha_3 = \ln\sqrt{5} \approx 0.805 ϵ 3 = 6 1 , ⧫ 3 = 5 ≈ 2.236 , α 3 = ln 5 ≈ 0.805
合起來。 G ( x ) = sign ( 0.347 g 1 ( x ) + 0.549 g 2 ( x ) + 0.805 g 3 ( x ) ) G(x) = \text{sign}\big(0.347\,g_1(x) + 0.549\,g_2(x) + 0.805\,g_3(x)\big) G ( x ) = sign ( 0.347 g 1 ( x ) + 0.549 g 2 ( x ) + 0.805 g 3 ( x ) ) :
x x x y y y g 1 g_1 g 1 g 2 g_2 g 2 g 3 g_3 g 3 分數 G G G 1、2 + 1 +1 + 1 + + + + + + − - − 0.347 + 0.549 − 0.805 = 0.091 0.347 + 0.549 - 0.805 = 0.091 0.347 + 0.549 − 0.805 = 0.091 + 1 +1 + 1 3、4 − 1 -1 − 1 + + + − - − − - − 0.347 − 0.549 − 0.805 = − 1.007 0.347 - 0.549 - 0.805 = -1.007 0.347 − 0.549 − 0.805 = − 1.007 − 1 -1 − 1 5、6 + 1 +1 + 1 + + + − - − + + + 0.347 − 0.549 + 0.805 = 0.602 0.347 - 0.549 + 0.805 = 0.602 0.347 − 0.549 + 0.805 = 0.602 + 1 +1 + 1
六筆全對,E in ( G ) = 0 E_{\text{in}}(G) = 0 E in ( G ) = 0 。三個分數的精確值是 ln 6 / 5 \ln\sqrt{6/5} ln 6/5 、− ln 15 / 2 -\ln\sqrt{15/2} − ln 15/2 、ln 10 / 3 \ln\sqrt{10/3} ln 10/3 。
把三輪的數字並排:
t t t g t g_t g t ϵ t \epsilon_t ϵ t ⧫ t \blacklozenge_t ⧫ t α t \alpha_t α t 更新後的權重(正比於) 更新後的權重總和 U t + 1 U_{t+1} U t + 1 前 t t t 個合起來的 E in E_{\text{in}} E in 1 A 1 / 3 1/3 1/3 1.414 1.414 1.414 0.347 0.347 0.347 ( 1 , 1 , 2 , 2 , 1 , 1 ) (1, 1, 2, 2, 1, 1) ( 1 , 1 , 2 , 2 , 1 , 1 ) 0.943 0.943 0.943 2 / 6 2/6 2/6 2 B 1 / 4 1/4 1/4 1.732 1.732 1.732 0.549 0.549 0.549 ( 1 , 1 , 2 , 2 , 3 , 3 ) (1, 1, 2, 2, 3, 3) ( 1 , 1 , 2 , 2 , 3 , 3 ) 0.816 0.816 0.816 2 / 6 2/6 2/6 3 C 1 / 6 1/6 1/6 2.236 2.236 2.236 0.805 0.805 0.805 ( 5 , 5 , 2 , 2 , 3 , 3 ) (5, 5, 2, 2, 3, 3) ( 5 , 5 , 2 , 2 , 3 , 3 ) 0.609 0.609 0.609 0 0 0
這個結果代表什麼。
G G G 說的是「很綠或很紅的是蘋果」,這是一個兩刀才切得出來的規則,12 條 decision stump 裡沒有任何一條做得到。三條各錯三分之一的規則合起來全對,這就是 boosting。
每一輪被選中的規則,下一輪的加權錯誤率一定剛好是 1 2 \frac{1}{2} 2 1 (A 在第 2 輪、B 在第 3 輪),所以基礎演算法不會連續兩輪選同一條。這是最佳重新加權的設計目標,在數字上直接看得到。
ϵ t \epsilon_t ϵ t 一輪比一輪小(1 3 , 1 4 , 1 6 \frac{1}{3}, \frac{1}{4}, \frac{1}{6} 3 1 , 4 1 , 6 1 )只是這組資料的巧合,一般不會這樣;但三條規則在原始資料上的錯誤率都是 1 3 \frac{1}{3} 3 1 ,票數卻不同,是因為票數看的是當時權重下的表現。
A「全部都是蘋果」看起來最沒內容,卻不能少。拿掉它,x = 1 , 2 x = 1, 2 x = 1 , 2 的分數是 0.549 − 0.805 = − 0.255 0.549 - 0.805 = -0.255 0.549 − 0.805 = − 0.255 ,會被分錯。它在投票裡的作用像一個常數項,把整體的分數往正的方向推。
前兩個合起來的 E in E_{\text{in}} E in 沒有進步(α 2 > α 1 \alpha_2 > \alpha_1 α 2 > α 1 ,所以只有兩個時 G G G 就是 g 2 g_2 g 2 ),到第三輪才降到 0。E in ( G ) E_{\text{in}}(G) E in ( G ) 不保證每一輪都下降,一路下降的是權重總和:1 → 0.943 → 0.816 → 0.609 1 \to 0.943 \to 0.816 \to 0.609 1 → 0.943 → 0.816 → 0.609 ,每一輪乘上 2 ϵ t ( 1 − ϵ t ) 2\sqrt{\epsilon_t(1 - \epsilon_t)} 2 ϵ t ( 1 − ϵ t ) ,而且它一直壓在 E in ( G ) E_{\text{in}}(G) E in ( G ) 上面,跟前面補充的推導一致。
這個例子裡三條規則一人一票也剛好全對,所以它沒有展示出「一人一票會壞掉」的情況;它展示的是重新加權怎麼逼出三條不同的規則。
驗算用的程式(純 Python):
from math import sqrt, log
X = [ 1 , 2 , 3 , 4 , 5 , 6 ]
Y = [ + 1 , + 1 , - 1 , - 1 , + 1 , + 1 ]
N = len (X)
def stump (s, theta):
return lambda x: s * ( 1 if x > theta else - 1 )
# 6 個門檻各配兩個方向,共 12 條;平手時取排在前面的
candidates = [(s, th) for th in [ 0.5 , 1.5 , 2.5 , 3.5 , 4.5 , 5.5 ] for s in ( + 1 , - 1 )]
u = [ 1 / N] * N
score = [ 0.0 ] * N
for t in range ( 1 , 4 ):
def eps_of (c):
h = stump( * c)
return sum (un for un, x, y in zip (u, X, Y) if h(x) != y) / sum (u)
best = min (candidates, key = eps_of)
eps = eps_of(best)
dia = sqrt(( 1 - eps) / eps)
alpha = log(dia)
g = stump( * best)
u = [un * dia if g(x) != y else un / dia for un, x, y in zip (u, X, Y)]
score = [sc + alpha * g(x) for sc, x in zip (score, X)]
e_in = sum (( 1 if sc > 0 else - 1 ) != y for sc, y in zip (score, Y)) / N
print (t, best, round (eps, 4 ), round (dia, 4 ), round (alpha, 4 ),
[ round (un, 4 ) for un in u], round ( sum (u), 4 ), round (e_in, 4 ))
輸出的三行依序是輪次、選中的 ( s , θ ) (s, \theta) ( s , θ ) 、ϵ t \epsilon_t ϵ t 、⧫ t \blacklozenge_t ⧫ t 、α t \alpha_t α t 、更新後的六個權重、權重總和、E in ( G ) E_{\text{in}}(G) E in ( G ) :
1 (1, 0.5) 0.3333 1.4142 0.3466 [0.1179, 0.1179, 0.2357, 0.2357, 0.1179, 0.1179] 0.9428 0.3333
2 (-1, 2.5) 0.25 1.7321 0.5493 [0.068, 0.068, 0.1361, 0.1361, 0.2041, 0.2041] 0.8165 0.3333
3 (1, 4.5) 0.1667 2.2361 0.8047 [0.1521, 0.1521, 0.0609, 0.0609, 0.0913, 0.0913] 0.6086 0.0
講義的示範:十個點切五刀
講義第 21 頁用一組二維的小資料逐輪播放 AdaBoost-Stump,圖上數得出 5 個圈、5 個叉。每一張圖裡,點的大小代表那一輪更新後的權重,虛線是這一輪新切的那一刀,黑色粗線是目前 G G G 的邊界。前兩張圖的黑線跟新切的那一刀疊在一起,從 t = 3 t = 3 t = 3 的畫面起才看得出它轉彎。下表依投影片的圖與課堂上的說明整理,t = 4 t = 4 t = 4 、t = 5 t = 5 t = 5 兩列的方向與答錯的點是本文從圖上判讀的:
畫面 這一刀 這一刀答錯誰(下一張圖裡被放大) t = 1 t = 1 t = 1 靠左的垂直線,右邊判成叉、左邊判成圈 線右邊的三個圈 t = 2 t = 2 t = 2 靠右的垂直線,右邊判成叉、左邊判成圈 線左邊的四個叉 t = 3 t = 3 t = 3 偏下的水平線,上面判成叉、下面判成圈 右上的大圈、右下的叉、左邊的兩個圈 t = 4 t = 4 t = 4 中間高度的水平線,上面判成圈、下面判成叉 最上面的叉、底部的兩個圈 t = 5 t = 5 t = 5 偏上的水平線,上面判成叉、下面判成圈 線下面的四個叉;但合起來的 G G G 已經全部分對
課堂上一步一步講:一開始所有的圈和叉一樣大,decision stump 切第一刀,三個圈被分錯,AdaBoost 把它們乘上 ⧫ t \blacklozenge_t ⧫ t 放大、其他的縮小。第二刀因為那三個圈很大,傾向把它們分對,代價是幾個叉被犧牲,於是叉被放大。第三刀之後,三刀加上各自的 α t \alpha_t α t 投票,已經是一條轉彎的非線性邊界。到第五刀,所有的圈和叉都被 G G G 分開。課堂上還提醒,圖上有一個叉和一個圈看起來壓在邊界上,那是放大縮小造成的視覺效果,它們其實都在正確的一邊。
本文替前兩刀算一下數字:10 筆資料權重相同、第一刀錯 3 筆,ϵ 1 = 0.3 \epsilon_1 = 0.3 ϵ 1 = 0.3 ,⧫ 1 = 7 / 3 ≈ 1.528 \blacklozenge_1 = \sqrt{7/3} \approx 1.528 ⧫ 1 = 7/3 ≈ 1.528 ,α 1 ≈ 0.424 \alpha_1 \approx 0.424 α 1 ≈ 0.424 。三個答錯的圈各乘 1.528,七個答對的點各除以 1.528,單筆權重的比是 7 3 \frac{7}{3} 3 7 ;三個圈的總和 3 × 7 = 21 3 \times 7 = 21 3 × 7 = 21 等於七個點的總和 7 × 3 = 21 7 \times 3 = 21 7 × 3 = 21 。第二刀在這組權重(總和 42)下答錯四個叉,ϵ 2 = 4 × 3 42 = 2 7 \epsilon_2 = \frac{4 \times 3}{42} = \frac{2}{7} ϵ 2 = 42 4 × 3 = 7 2 ,α 2 = ln 5 / 2 ≈ 0.458 \alpha_2 = \ln\sqrt{5/2} \approx 0.458 α 2 = ln 5/2 ≈ 0.458 。α 2 > α 1 \alpha_2 > \alpha_1 α 2 > α 1 ,只有兩刀時 G G G 就等於第二刀,這是前兩張圖的黑線都跟新切的那一刀重疊的原因。
最後一張圖的 G G G 就是講義第 7 頁講動機時用的那張圖。講義在這頁下方寫 'Teacher'-like algorithm works!,課堂上的說法是,老師和學生的教學模型不只是想像,真的可以用 AdaBoost 這樣的演算法做出來。
複雜一點的資料:切一百刀
講義第 22 頁換成一組比較多點的資料,圈和叉之間的邊界肉眼看起來像一條正弦波。講義印出來的是 t = 100 t = 100 t = 100 的畫面:背景有很多條灰色的垂直線與水平線,黑色邊界是一條階梯狀的折線,大致沿著那條波走。
課堂上是從 10 刀一路播到 100 刀:10 刀的時候雛形已經出來,20、30 刀愈來愈細緻,E in E_{\text{in}} E in 也許還沒到 0 但已經很小,之後幾十刀多半是微調。課堂上的結論有兩點。第一,這是一個非線性的模型,一刀一刀切再拼起來,邊界愈變愈好。第二,它有效率:相較於 kernel SVM,不必把資料轉換到另一個空間再解二次規劃,切一百刀就把邊界切出來了。講義的標語是 AdaBoost-Stump: non-linear yet efficient。
應用:即時人臉偵測
講義第 23 頁的例子是它稱為「世界上第一個『即時』人臉偵測程式」的系統,核心模型是 AdaBoost-Stump。課堂上解釋「即時」的意思:影片每秒大約 30 個畫面,要在這個速度下找出畫面裡所有的人臉。講義列了兩個重點:
特徵選擇。 在 24×24 的影像裡,有 162,336 種可能的小區塊圖樣可以當特徵。每一條 decision stump 只看一個特徵,AdaBoost-Stump 跑完,等於從這十六萬多種裡挑出了關鍵的幾個,再做線性組合。課堂上的描述是:把圖片切成細細碎碎的小張(一般叫 patch),找出哪些小張帶有關鍵的圖案,再用 AdaBoost 把它們的資訊整合起來。講義的說法是 feature selection achieved through AdaBoost-Stump。
效率。 只靠上面這樣還做不到即時。課堂上指出,一張大圖裡有人臉的位置是少數,大部分位置都沒有。所以這個程式改造了線性組合 G G G :投票投到一半,如果分數已經很低,就直接判定不是人臉,不再算下去;只有可能是人臉的位置才把整個 G G G 算完。講義寫的是 modified linear aggregation G G G to rule out non-face earlier。
本文補充:講義沒有寫出這個系統的名字,它一般被稱為 Viola–Jones 人臉偵測器。
講義對這一頁的總結是:AdaBoost-Stump 同時做到有效率的特徵選擇與組合。
Fun Time:用到幾個特徵
題目(第 24 頁): 一份資料有 9876 筆,每筆 x n ∈ R 5566 \mathbf{x}_n \in \mathbb{R}^{5566} x n ∈ R 5566 。跑了 1126 輪 AdaBoost-Stump 之後,G G G 實際用到的 x \mathbf{x} x 的相異特徵有幾個?
0 ≤ number ≤ 1126 0 \le \text{number} \le 1126 0 ≤ number ≤ 1126
1126 < number ≤ 5566 1126 < \text{number} \le 5566 1126 < number ≤ 5566
5566 < number ≤ 9876 5566 < \text{number} \le 9876 5566 < number ≤ 9876
9876 < number 9876 < \text{number} 9876 < number
答案:1。 每一條 decision stump 只看一個特徵,1126 輪就是 1126 條,最多用到 1126 個不同的特徵。課堂上的說法也是這一句。
本文補充其他選項為什麼不可能:選項 2 需要超過 1126 個特徵,但只有 1126 條 stump;選項 3 與 4 更超過了特徵總數 5566。實際的數字通常比 1126 少,因為不同輪可以選到同一個特徵、切在不同的門檻。題目裡的 9876(資料筆數)不影響答案。這題就是前一小節「特徵選擇」的數字版:5566 個特徵裡,G G G 至少有 4440 個完全沒用到。
這堂的總結與下一堂
講義第 25 頁把四節各收成一句:
小節 講義的一句話 Motivation of Boosting aggregate weak hypotheses for strength Diversity by Re-weighting scale up incorrect, scale down correct Adaptive Boosting Algorithm two heads are better than one, theoretically Adaptive Boosting in Action AdaBoost-Stump useful and efficient
課堂上最後把這兩堂並排:bagging 是 uniform 的 aggregation,AdaBoost 是 linear 的 aggregation,下一堂要介紹 conditional 的 aggregation。
自我檢查
1. 五筆資料,u n ( 1 ) = 1 5 u_n^{(1)} = \frac{1}{5} u n ( 1 ) = 5 1 。g 1 g_1 g 1 答錯其中兩筆。算出 ϵ 1 \epsilon_1 ϵ 1 、⧫ 1 \blacklozenge_1 ⧫ 1 、α 1 \alpha_1 α 1 與每筆資料的 u n ( 2 ) u_n^{(2)} u n ( 2 ) ,並驗證 g 1 g_1 g 1 在新權重下的錯誤率是 1 2 \frac{1}{2} 2 1 。
答案:ϵ 1 = 2 5 \epsilon_1 = \frac{2}{5} ϵ 1 = 5 2 ,⧫ 1 = ( 3 / 5 ) / ( 2 / 5 ) = 1.5 ≈ 1.225 \blacklozenge_1 = \sqrt{(3/5)/(2/5)} = \sqrt{1.5} \approx 1.225 ⧫ 1 = ( 3/5 ) / ( 2/5 ) = 1.5 ≈ 1.225 ,α 1 = ln 1.225 ≈ 0.203 \alpha_1 = \ln 1.225 \approx 0.203 α 1 = ln 1.225 ≈ 0.203 。答錯的兩筆各是 0.2 × 1.225 ≈ 0.245 0.2 \times 1.225 \approx 0.245 0.2 × 1.225 ≈ 0.245 ,答對的三筆各是 0.2 / 1.225 ≈ 0.163 0.2 / 1.225 \approx 0.163 0.2/1.225 ≈ 0.163 。答錯的總和 2 × 0.245 = 0.490 2 \times 0.245 = 0.490 2 × 0.245 = 0.490 ,答對的總和 3 × 0.163 = 0.490 3 \times 0.163 = 0.490 3 × 0.163 = 0.490 ,相等。
2. 接續六張水果照片的例子。第 3 輪更新後權重正比於 ( 5 , 5 , 2 , 2 , 3 , 3 ) (5, 5, 2, 2, 3, 3) ( 5 , 5 , 2 , 2 , 3 , 3 ) 。第 4 輪 A、B、C 的加權錯誤率各是多少?誰被選中?α 4 \alpha_4 α 4 是多少?加進去之後 G G G 還是全對嗎?
答案:總和 20。A 答錯 3、4:4 20 = 1 5 \frac{4}{20} = \frac{1}{5} 20 4 = 5 1 ;B 答錯 5、6:6 20 = 3 10 \frac{6}{20} = \frac{3}{10} 20 6 = 10 3 ;C 答錯 1、2:10 20 = 1 2 \frac{10}{20} = \frac{1}{2} 20 10 = 2 1 (上一輪的贏家)。選 A,⧫ 4 = 4 = 2 \blacklozenge_4 = \sqrt{4} = 2 ⧫ 4 = 4 = 2 ,α 4 = ln 2 ≈ 0.693 \alpha_4 = \ln 2 \approx 0.693 α 4 = ln 2 ≈ 0.693 。A 對每個 x x x 都投 + 1 +1 + 1 ,三個分數各加 0.693 0.693 0.693 :0.784 0.784 0.784 、− 0.314 -0.314 − 0.314 、1.295 1.295 1.295 ,符號不變,G G G 仍然全對。同一條規則可以在不相鄰的輪次被重複選中。
3. 某一輪基礎演算法回傳的 g t g_t g t 加權錯誤率剛好是 1 2 \frac{1}{2} 2 1 。這一輪的 ⧫ t \blacklozenge_t ⧫ t 、α t \alpha_t α t 是多少?權重會怎麼變?之後會發生什麼事?
判準:答案要說出 ⧫ t = 1 \blacklozenge_t = 1 ⧫ t = 1 、α t = 0 \alpha_t = 0 α t = 0 ,權重完全不變;下一輪基礎演算法面對同樣的權重,如果它是確定性的,就會回傳同一個 g t g_t g t ,演算法從此原地踏步。還要能連回理論保證的條件:這正是「每一輪都要 ϵ t ≤ ϵ < 1 2 \epsilon_t \le \epsilon < \frac{1}{2} ϵ t ≤ ϵ < 2 1 」被違反的情況。
4. 為什麼最後不用一人一票,而要用 α t \alpha_t α t ?為什麼 ϵ t = 1 2 \epsilon_t = \frac{1}{2} ϵ t = 2 1 的 g t g_t g t 應該拿 0 票,ϵ t = 0.7 \epsilon_t = 0.7 ϵ t = 0.7 的 g t g_t g t 卻不是 0 票?
判準:第一問要提到 g 2 g_2 g 2 之後的假說是在刻意扭曲的權重下選出來的,對原本的 E in E_{\text{in}} E in 不一定好,所以要依表現給不同票數。第二問要算出 ϵ t = 0.7 \epsilon_t = 0.7 ϵ t = 0.7 時 ⧫ t = 3 / 7 ≈ 0.655 \blacklozenge_t = \sqrt{3/7} \approx 0.655 ⧫ t = 3/7 ≈ 0.655 、α t ≈ − 0.424 \alpha_t \approx -0.424 α t ≈ − 0.424 ,並解釋負票等於把 g t g_t g t 反過來用,而反過來的錯誤率是 0.3 0.3 0.3 ;1 2 \frac{1}{2} 2 1 是正反兩面都沒有資訊的唯一位置。
5. 用本文補充的那個上界:N = 1000 N = 1000 N = 1000 ,每一輪都有 ϵ t ≤ 0.4 \epsilon_t \le 0.4 ϵ t ≤ 0.4 。最多幾輪之後保證 E in ( G ) = 0 E_{\text{in}}(G) = 0 E in ( G ) = 0 ?如果基礎演算法更弱,只能保證 ϵ t ≤ 0.45 \epsilon_t \le 0.45 ϵ t ≤ 0.45 呢?
答案:ϵ = 0.4 \epsilon = 0.4 ϵ = 0.4 時 r = 2 0.24 ≈ 0.9798 r = 2\sqrt{0.24} \approx 0.9798 r = 2 0.24 ≈ 0.9798 ,T > ln 1000 ln ( 1 / r ) ≈ 338.4 T > \frac{\ln 1000}{\ln(1/r)} \approx 338.4 T > l n ( 1/ r ) l n 1000 ≈ 338.4 ,339 輪。ϵ = 0.45 \epsilon = 0.45 ϵ = 0.45 時 r = 2 0.2475 ≈ 0.99499 r = 2\sqrt{0.2475} \approx 0.99499 r = 2 0.2475 ≈ 0.99499 ,T > 1374.6 T > 1374.6 T > 1374.6 ,1375 輪。基礎演算法離亂猜愈近,需要的輪數增加得很快,但對 N N N 的依賴仍然只是 ln N \ln N ln N :N N N 從 1000 變成 1,000,000,輪數只變成兩倍。
練習與對應閱讀
兩個學期的對應週次。 Fall 2024 課程頁 在 W12(11/18)一口氣講技法第 8 到第 11 堂,這堂的投影片代號是 208u 。Fall 2026 課程頁 把第 7、8 堂排在 W11(11/18);這一週的 208u 投影片在 2026-09-30 查的時候還沒上線,所以本文只用 MOOC 版講義。
教科書。 兩份課程頁都沒有替這堂標 Learning from Data (LFD)的章節。課程頁列的延伸閱讀是 Freund 與 Schapire 的 A Short Introduction to Boosting ,是 AdaBoost 的作者自己寫的導論。
作業。 Fall 2024 HW7 (2024-12-02 發布、12-16 截止)裡跟這堂直接相關的題目如下,沒有官方解答:
題 類型 練什麼 Q3 自動批改 資料有 87% 是負例,g 1 g_1 g 1 回傳常數 − 1 -1 − 1 ,問第二輪正例與負例的權重比。做法跟「四筆資料錯一筆」那題 Fun Time 一樣:先算 ϵ 1 \epsilon_1 ϵ 1 ,再看答錯與答對的倍數比 Q6 人工批改 證明 U t + 1 / U t = 2 ϵ t ( 1 − ϵ t ) U_{t+1}/U_t = 2\sqrt{\epsilon_t(1 - \epsilon_t)} U t + 1 / U t = 2 ϵ t ( 1 − ϵ t ) 。題目提示這是 AdaBoost 在 O ( log N ) O(\log N) O ( log N ) 輪內收斂的證明骨幹,也就是本文補充裡只給結論的第一件事;證明要用到的東西都在「縮放因子」那一小節 Q10–12 人工批改 在 LIBSVM 的 madelon (訓練)與 madelon.t(測試)上實作 AdaBoost-Stump,跑滿 T = 500 T = 500 T = 500 輪,畫 E in ( g t ) E_{\text{in}}(g_t) E in ( g t ) 與 ϵ t \epsilon_t ϵ t 、E in ( G t ) E_{\text{in}}(G_t) E in ( G t ) 與 E out ( G t ) E_{\text{out}}(G_t) E out ( G t ) 、U t U_t U t 的曲線
Q10 要把 HW2 的 decision stump 擴充成多維、吃權重的版本,最簡單的做法是每個特徵各找最佳的 stump,再挑全部特徵裡最好的。沒有官方解答,所以要自己設驗收方法:可以拿 scikit-learn 的 AdaBoostClassifier 搭深度 1 的決策樹當對照,看 E in ( G t ) E_{\text{in}}(G_t) E in ( G t ) 的趨勢是否一致;也可以先用上面六筆資料的例子檢查自己的實作,三輪的 ϵ t \epsilon_t ϵ t 應該是 1 3 , 1 4 , 1 6 \frac{1}{3}, \frac{1}{4}, \frac{1}{6} 3 1 , 4 1 , 6 1 。本文用 scikit-learn 1.9.1 在這六筆資料上實測過:estimator_errors_ 的前四個值是 1 3 , 1 4 , 1 6 , 1 5 \frac{1}{3}, \frac{1}{4}, \frac{1}{6}, \frac{1}{5} 3 1 , 4 1 , 6 1 , 5 1 ,跟手算相同;estimator_weights_ 則是 0.693 , 1.099 , 1.609 , 1.386 0.693, 1.099, 1.609, 1.386 0.693 , 1.099 , 1.609 , 1.386 ,剛好是講義 α t \alpha_t α t 的兩倍。所有票數同乘一個正數不會改變 G G G ,所以拿它對照時比 ϵ t \epsilon_t ϵ t 與 E in ( G t ) E_{\text{in}}(G_t) E in ( G t ) 就好,不要直接比票數。整份作業的導讀在技法作業與期末專題 。
今晚可以做的一件事。 把上面那段程式改成二維:自己擺十來個圈和叉,每一輪印出權重最大的幾個點。你會看到它們多半是邊界附近、一直被分錯的那幾個,這就是老師在做的事。
下一堂。 技法第 9 堂:決策樹 講第三種合起來的方式:不同的 x \mathbf{x} x 聽不同假說的 conditional aggregation。AdaBoost 自己會在技法第 11 堂再出現一次,那時候會解釋 α t = ln ⧫ t \alpha_t = \ln\blacklozenge_t α t = ln ⧫ t 這個選擇從哪裡來。
課程影片來源
原始影片:Motivation of Boosting 、Diversity by Re-weighting 、Adaptive Boosting Algorithm 、Adaptive Boosting in Action
查核日期:2026-10-13。影片 ID、標題與長度於當天從官方播放清單取得;YouTube 上沒有字幕軌,本文的課堂說法來自自行轉錄的逐字稿。
更新紀錄
2026-10-13:系列改為一堂一篇,這篇是新拆出的一堂,依講義與影片逐字稿寫成。
參考資料