---
# System prepended metadata

title: Adaptive Boosting
tags: [機器學習技法]

---

# 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。





