# Concept From BAGging BAGging 中,由於是從 $\mathcal{D}$ 抽資料出來組成 $\tilde{\mathcal{D}}$,所以有可能會有重複的資料。 因此我們可以將原本的 $E_{in}$: $$ E_{in}^{0/1}(h)=\frac{1}{N}\sum_{(\mathbf{x},y)\in\tilde{\mathcal{D}}}[[y\ne h]] $$ 改寫為: $$ E_{in}^{\mathbf{u}}(h)=\frac{1}{N}\sum_{n=1}^{N}u_{n}[[y_{n}\ne h(\mathbf{x}_{n})]] $$ 也就是說: - 沒抽到的資料 $u_{n}=0$ - 抽到一次的資料 $u_{n}=1$ - 抽到 $k$ 次資料 $u_{n}=k$ 這樣的表示法「**將次數作為權重**」。 :::warning 所以每次 BAGging 出來的新資料集,**抽到比較多次的資料在該資料集中就會比較重要**。 ::: --- # AdaBoost 核心概念 從 BAGging 改進,變成自己調整資料的重要程度。 每一次學到新的 $g_{t}$ 時,會將當前 $g_{t}$ 犯錯的資料「變得重要」,沒犯錯的則「變得不重要」,然後以這個更改重要性的資料再去學新的 $g_{t}$。 經過每一輪更改重要性的操作可以讓前後兩個 $g_{t}$ 之間具有差異性,以達到 blending 所要求的多樣性。 ## Re-weighting 原本 $u^{t}_{n}$ 是從 Bootstraping 得到的資料中,代表第 n 筆資料「有幾份」,同時也代表著重要程度。 為了不要讓當前的 $g_{t}$ 在下一輪也會被生產出來,所以得將資料的「份數」做修改,讓預測成功跟錯誤的量達到 1 比 1。 換句話說就是讓 $g_{t}$ 在新資料中跟投骰子一樣,對錯機率都是 $\frac{1}{2}$,沒有預測的效果,也因此會跟 $g_{t+1}$ 具有差異性。 所以以此推導下去可知可以將錯誤的份數乘上成功的份數,成功的份數乘上錯誤的份數,兩者份數就一樣。 ## $\mathbf{u}^{t}$ 但這樣份數會持續變大,會有點困擾;所以想要改成乘「成功率跟錯誤率」,而原本的 $u^{t}_{n}$ 也從份數變成了佔總體比例。 這樣做不會影響: $$ \frac{1}{2}=\frac{\sum_{n=1}^{N}u_{n}^{t+1}[[y_{n}\ne g_{t}(\mathbf{x}_{n})]]}{\sum_{n=1}^{N}u_{n}^{t+1}[[y_{n}\ne g_{t}(\mathbf{x}_{n})]]+\sum_{n=1}^{N}u_{n}^{t+1}[[y_{n} = g_{t}(\mathbf{x}_{n})]]}=\frac{錯誤次數}{成功次數+錯誤次數}=錯誤率 $$ 因為 $u^{t}_{n}$ 從份數變為比例,只不過是上下同除 $N$;成功率和錯誤率其分母的 N 在計算時也可以被通分掉。 >這個 N 是由包含前幾輪的總共份數的乘積所構成:$N_{1}N_{2}...N_{t}$ ## 縮放參數 上面的想法很美好,但是會遇到一個問題,首先 $u^{t}_{n}$ 已經讓他小於 1 了,然後每輪又給他乘以一個小於 1 的數值,這樣一直乘下去就會越來越小。 所以聰明的...這方面的專家想到的是「縮放參數」: $$ \sqrt{\frac{1-\epsilon}{\epsilon}}=\sqrt{\frac{成功率}{錯誤率}}=\sqrt{\frac{成功次數}{錯誤次數}} $$ 這個函數的特點是,如果成功率大於錯誤率,縮放參數會大於 1,反之會小於 1;並且「成功的除以縮放參數,失敗的乘上縮放參數」這個操作不會影響上面 $\frac{1}{2}$ 的計算: $$ \frac{錯誤次數\times\sqrt{\frac{成功次數}{錯誤次數}}}{成功次數{\div}\sqrt{\frac{成功次數}{錯誤次數}}+錯誤次數\times\sqrt{\frac{成功次數}{錯誤次數}}}=\frac{\sqrt{成功次數\times錯誤次數}}{\sqrt{成功次數\times錯誤次數}+\sqrt{成功次數\times錯誤次數}}=\frac{1}{2} $$ 這樣一來保持了 $\frac{1}{2}$,二來有時大於 1 有時小於 1 可以避免越乘越小的問題,雖然我不是數學家,但這聽起來超厲害對吧。 ## 持有投票量 $\alpha_{t}$ 這裡使用票票不等值,總不能有些真的很差的 $g_{t}$ 還給一樣的票。 所以聰明的專家們使用的是具有單調性質的 $ln$: $$ \alpha_{t}=ln\left(\sqrt{\frac{1-\epsilon}{\epsilon}}\right) $$ 這函數的特性是,如果成功率是 $\frac{1}{2}$,代表這個 $g_{t}$ 跟投骰子沒兩樣,不要參考他,所以票量 $\alpha_{t}=0$;如果成功率接近 1,根號內的值就會很大,票量也會很大。 >如果錯誤率是 0 的話就變成無限大了,代表直接選他 # Adaptive Boosting (AdaBoost) Algorithm 初始權重:$\mathbf{u}^{(1)}=[\frac{1}{N},\frac{1}{N},...,\frac{1}{N}]$ - 也就是說每個資料一樣重要 執行 T 次迴圈,對於第 t 次: - $\mathcal{A}$ 從 $\mathcal{D}$ 中為了最小化 $E_{in}^{\mathbf{u}}(h)$ 而學到 $g_{t}$ - $\frac{1}{N}\sum_{n=1}^{N}u_{n}[[y_{n}\ne h(\mathbf{x}_{n})]]$ - 實際上可以不用管 $\frac{1}{N}$ 這個係數。 - 使用縮放參數更新錯誤率 - 對於預測錯誤的資料的權重,「乘上」縮放參數 - 對於預測正確的資料的權重,「除以」縮放參數 - 其中縮放參數為 $\sqrt{\frac{1-\epsilon}{\epsilon}}$,$\epsilon=\frac{\sum_{n=1}^{N}u_{n}^{t}[[y_{n}\ne g_{t}(\mathbf{x}_{n})]]}{\sum_{n=1}^{N}u_{n}^{t}}$ - 或者說縮放參數為 $\sqrt{\frac{正確率}{錯誤率}}$,$\epsilon=錯誤率$ - 計算 $g_{t}$ 的持有投票量 $\alpha_{t}=ln(縮放參數)$ 最後回傳 $G(\mathbf{x})=sign\left(\sum_{t=1}^{T}\alpha_{t}g_{t}(\mathbf{x})\right)$;如果不是 Classification 的話就是其他 Blending。 :::warning 再次注意 $E_{in}^{\mathbf{u}}(h)$ 是 Error Function,跟底下的 $\epsilon$ 錯誤率不一樣。 ::: # Theoretical Guarantee 可以從 [VC Bound](https://hackmd.io/r5nQOa1wS3-QKFpjHj3jbw?view#Model-Complexity) 證明出: $$ E_{out}(G)\le E_{in}(G)+O\left(\sqrt{\underbrace{O(d_{vc}(\mathcal{H})\cdot Tlog(T))}_{d_{vc}\text{ of all possible G}}\cdot\frac{log(N)}{N}}\right) $$ 然後 Adaboost 的作者也有證明,只需要 $T=log(N)$ 就可以讓 $E_{in}=0$,只要每次的錯誤率都可以小於 $\frac{1}{2}$ 就好。 一旦 $T=log(N)$,那就代表 $d_{vc}$ 會跟著 T 緩慢的成長,也就讓 $E_{out}$ 一樣很小。 ## Boosting 像這樣只要求 base Algorithm 的 $\mathcal{A}$ 不用太強,只要每次都可以比亂猜還要好,聚集起來後就可以很強大的效果叫 Boosting。 Adaboost 是逐步做到 Boosting 的演算法。 --- # AdaBoost-Stump 以 Decision stump 作為 base Algorithm。 Decision stump 就剛好符合我們需要的特性,雖然弱弱的,但是比亂猜好。 ## 人臉辨識 AdaBoost-Stump 是第一個能夠做到「實時」人臉辨識的方法。 ### Feature Selection 將圖片分成很多個小小圖片 patches,用 Adaboost 去學會哪種 patches 具有重要的特徵,最後用 Linear Aggregation 整合起來。 但是在判斷 patches 時有將 Linear Aggregation 稍微修改一下,因為圖片中如果是遠景,大部分都不會是人臉,所以如果計算到一半時 G 的分數夠低了就會直接判斷該 patch 沒有人臉。 --- # Weighted Base Algorithm 在 $E_{in}$ 中帶有權重的叫做 Weighted Base Algorithm。 ## 以選取產生帶權資料 原本沒有權重的 $E_{in}^{0/1}(h)$ 各自演算法有對應的理論保證可以最佳化;那帶有權重的 $E_{in}^{\mathbf{u}}(h)$ 我們有對應的理論保證可以最佳化嗎? 有,在 [基石上第八周](https://hackmd.io/Uq9IWK63TY2aaDruk-Sz6A?view#Weighted-Classification) 的時候老師提過了 Virtual Copy ;也就是帶有權重的 $E_{in}^{\mathbf{u}}(h)$ 其實跟另一種資料分佈的情境是等價的。 # Virtual Copy / Systematic route - 當前的資料集 $\mathcal{D}$ 有 $(\mathbf{x}_{1},y_{1}),...(\mathbf{x}_{n},y_{n})$ - 從中以你想要的資料分佈 $\mathbf{u}$ 去抽 $M$ 筆資料出來組成新資料集 $\mathcal{D}_{M}$ - 這樣 $(\mathbf{x}_{1},y_{1}),...(\mathbf{x}_{n},y_{n})$ 的資料「份數」就會呈現出你想要的分佈 - 最後只要以這個新的資料集 $\mathcal{D}_{M}$ 來執行演算法,在算 $E_{in}$ 的時候: $$ \left(E_{in}^{0/1}(h)=\frac{1}{M}\sum_{(\mathbf{x},y)\in\tilde{\mathcal{D}}}[[y\ne h]]\right) \equiv \left(E_{in}^{\mathbf{u}}(h)=\frac{1}{N}\sum_{n=1}^{N}u_{n}[[y_{n}\ne h(\mathbf{x}_{n})]]\right) $$ 由於 LHS 有對應的理論保證可以最佳化 $E_{in}^{0/1}(h)$,也就代表 RHS 一樣有理論保證可以最佳化 $E_{in}^{\mathbf{u}}(h)$。 但是由於不會真的複製出 $\mathcal{D}_{M}$,而是直接用 $E_{in}^{\mathbf{u}}(h)$,所以才會叫做 Virtual Copy。 :::warning 所以在 $\mathcal{D}_{M}$ 中有「$N$ 種資料」,並且總共有「$M$ 筆資料」 ::: ## Weighted Pocket PLA 如果 Pocket PLA 改成在 $\mathcal{D}_{M}$ 中做挑選點修正的動作,被複製出的點會更容易被抽到;因此使用 $E_{in}^{\mathbf{u}}(h)$ 的話,各個點被抽取的機率不再是平均的,而是會根據 $u_{n}$ 而有各自的比例。 ## Weighted Logistic Regression 如果 Logistic Regression 改成在 $\mathcal{D}_{M}$ 中做 SGD ,跟上面一樣,各種資料 $\mathbf{x}_{n}$ 被抽到的機率會不一樣;所以使用 $E_{in}^{\mathbf{u}}(h)$ 的話: $$ \left(E_{in}^{0/1}(h)=\frac{1}{M}\sum_{(\mathbf{x},y)\in\mathcal{D}_{M}}ln\left(1+e^{-y\mathbf{w}^{T}\mathbf{x}}\right)\right) \equiv \frac{1}{N}\sum_{n=1}^{N}u_{n} ln\left(1+e^{-y_{n}\mathbf{w}^{T}\mathbf{x}_{n}}\right) $$ 做 SGD 的時候,資料的採樣分佈要遵循 $u_{n}$ 的比率。 ## Weighted Soft-margin SVM $$ \frac{1}{2}\mathbf{w}^{T}\mathbf{w} + C\sum_{n=1}^{N}\color{green}{u_{n}}\xi_{n}+\color{red}{\sum_{n=1}^{N}\alpha_{n}(1-\xi_{n}-y_{n}(\mathbf{w}^{T}\mathbf{z}_{n}+b))}+\color{blue}{\sum_{n=1}^{N}\beta_{b}(-\xi_{n})} $$ SVM 的話,推導的過程中 $\alpha_{n}$ 的範圍就會變成: $$ 0\le \alpha_{n}\le C u_{n} $$ ## BAGging & AdaBoost 從 BAGging 跟 AdaBoost 可以發現: - BAGging 的隨機選取導致資料帶有權重,也因此該資料的重要性發生改變 - **實際上這就是把 Virtual Copy 變成了 Real Copy** - AdaBoost 則是 Virtual Copy,每輪修改權重來更新資料的重要性 --- ## Example-weighted learning 計算 $E_{in}$ 的時候為手上的「每種資料 $\mathbf{x}_{n}$」給予一個權重 $u_{n}$ $$ E_{in}^{\mathbf{u}}(h)=\frac{1}{N}\sum_{n=1}^{N}u_{n}err(y_{n},h(\mathbf{x}_{n})) $$ >像上面都是 Example-weighted。 ## class-weighted learning $$ E_{in}^{\mathbf{u}}(h)=\frac{1}{N}\sum_{n=1}^{N} \begin{Bmatrix} a&y_{n}=1\\ b&y_{n}=-1 \end{Bmatrix} err(y_{n},h(\mathbf{x}_{n})) $$ [基石上第八周的內容](https://hackmd.io/Uq9IWK63TY2aaDruk-Sz6A?view#Weighted-Classification)。 做分類的話長的如上,或者依據不同情況跟類別而有不同的權重值。 跟 Example-weighted 不一樣,不是「每種資料 $\mathbf{x}_{n}$」給予一個權重 $u_{n}$。 >如果是分類問題,則 a 的情況是 false reject,b 的情況是 false accept。