集成學習之Boosting —— AdaBoost原理


集成學習之Boosting —— AdaBoost原理

集成學習之Boosting —— AdaBoost實現

集成學習之Boosting —— Gradient Boosting原理

集成學習之Boosting —— Gradient Boosting實現



集成學習大體可分爲兩大類:Bagging和Boosting。Bagging通常使用強學習器,其個體學習器之間不存在強依賴關係,容易並行。Boosting則使用弱分類器,其個體學習器之間存在強依賴關係,是一種序列化方法。Bagging主要關注下降方差,而Boosting主要關注下降誤差。Boosting是一族算法,其主要目標爲將弱學習器「提高」爲強學習器,大部分Boosting算法都是根據前一個學習器的訓練效果對樣本分佈進行調整,再根據新的樣本分佈訓練下一個學習器,如此迭代M次,最後將一系列弱學習器組合成一個強學習器。而這些Boosting算法的不一樣點則主要體如今每輪樣本分佈的調整方式上。本系列文章先討論Boosting的兩大經典算法 —— AdaBoost和Gradient Boosting,再探討近年來在各大數據科學比賽中大放異彩的XGBoost和LightGBM。html


AdaBoost原理概述

AdaBoost是一個具備里程碑意義的算法,由於其是第一個具備適應性的算法,即能適應弱學習器各自的訓練偏差率,這也是其名稱的由來(Ada爲Adaptive的簡寫)。web

AdaBoost的具體流程爲先對每一個樣本賦予相同的初始權重,每一輪學習器訓練事後都會根據其表現對每一個樣本的權重進行調整,增長分錯樣本的權重,這樣先前作錯的樣本在後續就能獲得更多關注,按這樣的過程重複訓練出M個學習器,最後進行加權組合,以下圖所示。算法

下圖顯示經過將簡單學習器加權組合就能生成具備複雜邊界的強學習器。api


這裏有兩個關鍵問題:框架

  1. 每輪訓練事後如何調整樣本權重\(w\)
  2. 如何肯定最後各學習器的權重 \(\alpha\)

這兩個問題可由加法模型和指數損失函數推導出來。機器學習



加法模型 (Additive Model) 和指數損失函數 (Exponential Loss)

由上圖能夠看出,AdaBoost最後獲得的強學習器是由一系列的弱學習器的線性組合,此即加法模型:
\[ f(x) = \sum_{m=1}^{M}\alpha_{m}G_{m}(x)\]函數

其中\(G_{m}(x)\)爲基學習器,\(\alpha_{m}\)爲係數。學習

在第m步,咱們的目標是最小化一個指定的損失函數\(L(y,f(x))\),即 :
\[\min\limits_{(\alpha_{m}\,,\,G_{m})}\sum\limits_{i=1}^{N}L(y_{i}, \,\sum\limits_{m=1}^{M}\alpha_{m}G_{m}(x_{i})) \qquad (1.1)\]測試

其中 \((x_{1},y_{1}),(x_{2},y_{2}),\cdots(x_{N},y_{N})\)爲訓練數據集。大數據

這是個複雜的全局優化問題,一般咱們使用其簡化版,即假設在第m次迭代中,前m-1次的係數\(\alpha\)和基學習器\(G(x)\)都是固定的,則\(f_{m}(x) = f_{m-1}(x) + \alpha_{m}G_{m}(x)\),這樣在第m步咱們只需就當前的\(\alpha_{m}\)\(G_{m}(x)\)最小化損失函數。


AdaBoost採用的損失函數爲指數損失,形式以下:
\[L(y,\,f(x)) = e^{-yf(x)} \qquad (1.2)\]

結合上文,咱們如今的目標是在指數函數最小的狀況下求得\(\alpha_{m}\)\(G_{m}(x)\)
\[(\alpha_{m},G_{m}(x)) = \mathop{\arg\min}\limits_{(\alpha,G)}\sum\limits_{i=1}^{N}e^{-y_{i}f_{m}(x_{i})} = \mathop{\arg\min}\limits_{(\alpha,G)}\sum\limits_{i=1}^{N}e^{-y_{i}(f_{m-1}(x_{i}) + \alpha G(x_{i}))} \qquad (1.3)\]

\(w_{i}^{(m)} = e^{-y_{i}f_{m-1}(x_{i})}\),因爲\(w_i^{(m)}\)不依賴於\(\alpha\)\(G(x)\),因此可認爲其是第m步訓練以前賦予每一個樣本的權重。然而\(w_i^{(m)}\)依賴於\(f_{m-1}(x_i)\),因此每一輪迭代會改變。


因而式 (1.3) 變爲:

\[\sum\limits_{i=1}^{N}w_{i}^{(m)}e^{-y_i\alpha G(x_i)} = e^{-\alpha}\sum\limits_{y_{i}=G(x_{i})}w_{i}^{(m)} + e^{\alpha}\sum\limits_{y_i \neq G(x_i)}w_i^{(m)} \qquad\qquad (1.4)\]

\[= (e^{\alpha} - e^{-\alpha})\sum\limits_{i=1}^Nw_i^{(m)}\mathbb{I}(y_i \neq G(x_i)) + e^{-\alpha}\sum\limits_{i=1}^Nw_i^{(m)} \qquad\qquad\quad (1.5)\]


由上面幾個式子能夠獲得AdaBoost算法的幾個關鍵點:

(1) 基學習器\(G_m(x)\) :

求令式 (1.5) 最小的\(G_m(x)\)等價於令 \(\sum\limits_{i=1}^Nw_i^{(m)}\mathbb{I}(y_i \neq G(x_i))\) 最小化的\(G_m(x)\),所以可認爲每一輪基學習器都是經過最小化帶權重偏差獲得。


(2) 下一輪樣本權值\(w_i^{(m+1)}\)

\(w_{i}^{(m+1)} = e^{-y_{i}f_{m}(x_{i})} = e^{-y_{i}(f_{m-1}(x_{i}) + \alpha G(x_{i}))} = e^{-y_if_{m-1}(x_i)}e^{-y_i\alpha_mG_m(x_i)} = w_i^{(m)}e^{-y_i\alpha_mG_m(x_i)}\)

能夠看到對於\(\alpha_m>0\),若\(y_i = G_m(x_i)\),則\(w_i^{(m+1)} = w_i^{(m)}e^{-\alpha_m}\),代表前一輪被正確分類樣本的權值會減少; 若\(y_i \neq G_m(x_i)\),則\(w_i^{(m+1)} = w_i^{(m)}e^{\alpha_m}\),代表前一輪誤分類樣本的權值會增大。


(3) 各基學習器的係數 \(\alpha_m\)

\(G_m(x)\)在訓練集上的帶權偏差率爲 \(\epsilon_m = \frac{\sum\limits_{i=1}^Nw_i^{(m)}\mathbb{I}(y_i \neq G_m(x_i))}{\sum\limits_{i=1}^Nw_i^{(m)}}\)

式 (1.4) 對\(\alpha\) 求導並使導數爲0: $-e^{-\alpha}\sum\limits_{y_{i}=G(x_{i})}w_{i}^{(m)} + e^{\alpha}\sum\limits_{y_i \neq G(x_i)}w_i^{(m)} = 0 $ ,

兩邊同乘以\(e^\alpha\),得 \(e^{2\alpha} = \frac{\sum\limits_{y_{i}=G(x_{i})}w_{i}^{(m)}}{\sum\limits_{y_{i} \neq G(x_{i})}w_{i}^{(m)}} = \frac{1-\epsilon_m}{\epsilon_m}\) \(\quad {\color{Red}{\Longrightarrow}} \quad\) \(\alpha_m = \frac{1}{2}ln\frac{1-\epsilon_m}{\epsilon_m}\)

能夠看出,\(\epsilon_m​\)越小,最後獲得的\(\alpha_m​\)就越大,代表在最後的線性組合中,準確率越高的基學習器會被賦予較大的係數。



AdaBoost算法

在瞭解了\(G_m(x)\)\(w_i^{(m+1)}\)\(\alpha_m\)的由來後,AdaBoost算法的總體流程也就呼之欲出了:

輸入: 訓練數據集 \(T = \left \{(x_1,y_1), (x_2,y_2), \cdots (x_N,y_N)\right \}\)\(y\in\left\{-1,+1 \right\}\),基學習器\(G_m(x)\),訓練輪數M

  1. 初始化權值分佈: \(w_i^{(1)} = \frac{1}{N}\:, \;\;\;\; i=1,2,3, \cdots N\)
  2. for m=1 to M:
    (a) 使用帶有權值分佈的訓練集學習獲得基學習器\(G_m(x)\):
    \[G_m(x) = \mathop{\arg\min}\limits_{G(x)}\sum\limits_{i=1}^Nw_i^{(m)}\mathbb{I}(y_i \neq G(x_i))\]
    (b) 計算\(G_m(x)\)在訓練集上的偏差率:
    \[\epsilon_m = \frac{\sum\limits_{i=1}^Nw_i^{(m)}\mathbb{I}(y_i \neq G_m(x_i))}{\sum\limits_{i=1}^Nw_i^{(m)}}\]
    (c) 計算\(G_m(x)\)的係數: \(\alpha_m = \frac{1}{2}ln\frac{1-\epsilon_m}{\epsilon_m}\)
    (d) 更新樣本權重分佈: \(w_{i}^{(m+1)} = \frac{w_i^{(m)}e^{-y_i\alpha_mG_m(x_i)}}{Z^{(m)}}\; ,\qquad i=1,2,3\cdots N\)
      其中\(Z^{(m)}\)是規範化因子,\(Z^{(m)} = \sum\limits_{i=1}^Nw^{(m)}_ie^{-y_i\alpha_mG_m(x_i)}\),以確保全部的\(w_i^{(m+1)}\)構成一個分佈。
  3. 輸出最終模型: \(G(x) = sign\left[\sum\limits_{m=1}^M\alpha_mG_m(x) \right]\)



AdaBoost採用指數損失的緣由

若將指數損失表示爲指望值的形式:

\[E(e^{-yf(x)}|x) = P(y=1|x)e^{-f(x)} + P(y=-1|x)e^{f(x)}\]

因爲是最小化指數損失,則將上式求導並令其爲0:

\[\frac{\partial E(e^{-yf(x)}|x)}{\partial f(x)} = -P(y=1|x) e^{-f(x)} + P(y=-1|x)e^{f(x)} = 0\quad ,\]
\[f(x) = \frac12 log\frac{P(y=1|x)}{P(y=-1|x)},或寫爲 P(y=1|x) = \frac{1}{1+e^{-2f(x)}}\]

仔細看,這不就是logistic regression嗎?兩者只差係數\(\frac12\),所以每一輪最小化指數損失其實就是在訓練一個logistic regression模型,以逼近對數概率 (log odds)。


因而,

\[\begin{equation} \begin{aligned} sign(f(x)) &= sign(\frac12 log\frac{P(y=1|x)}{P(y=-1|x)}) \\ & =\left\{\begin{matrix} 1 & \;\; P(y=1|x) > p(y=-1|x)\\ -1 & \;\; P(y=1|x) < P(y=-1|x) \end{matrix}\right. \\&=\mathop{\arg\max} \limits_{y \in\{-1,1\}}P(y|x) \end{aligned} \end{equation}\]

這意味着\(sign(f(x))\)達到了貝葉斯最優錯誤率,即對於每一個樣本\(x\)都選擇後驗機率最大的類別。若指數損失最小化,則分類錯誤率也將最小化。這說明指數損失函數是分類任務本來0-1損失函數的一致性替代函數。因爲這個替代函數是單調連續可微函數,所以用它代替0-1損失函數做爲優化目標。



Real AdaBoost

上文推導出的AdaBoost算法被稱爲"Discrete AdaBoost",由於其各個基學習器\(G_m(x)\)的輸出爲{-1,1} 。若是將基學習器的輸出改成一個類別機率,則產生了Real AdaBoost。Real AdaBoost一般在更少的輪數達到更高的精度,像scikit-learn中的AdaBoostClassifier就是默認優先使用Real AdaBoost (SAMME.R),不過Real AdaBoost中的基學習器必須支持機率估計。

推導與Discrete AdaBoost相似,仍最小化指數損失:

\[\begin{equation} \begin{aligned} E(e^{-yf_m(x)}|x) &= E(e^{-y(f_{m-1}(x) + G(x))}|x) \\ &=E(w \cdot e^{-yG(x)}|x) \\&=e^{-G(x)}P_w(y=1|x) + e^{G(x)}P_w(y=-1|x)\end{aligned} \end{equation}\]


\(G(x)\)求導: \(G(x) = \frac12log\frac{P_w(y=1|x)}{P_w(y=-1|x)}\)

其中\(P_w(y=1|x)\)是權重爲\(w\)下y=1的機率,注意這裏的\(G(x)\)不是基學習器,而是基學習器的類別機率的一個對數轉換。由此Real AdaBoost的算法流程以下:

  1. 初始化權重分佈:\(w_i^{(1)} = \frac1N, \qquad i = 1,2 \cdots N\)
  2. for m=1 to M:
      (a) 使用帶權重分佈的訓練集訓練基學習器,獲得類別機率\(P_m(x) = P_w(y=1|x) \;\in [0,1]\)
      (b) \(G_m(x) = \frac12 log\frac{P_m(x)}{1-P_m(x)} \;\in R\)
      (c) 更新權重分佈: \(w_i^{(m+1)} = \frac{w_i^{(m)}e^{-y_iG_m(x_i)}}{Z^{(m)}}\)
  3. 輸出最終模型:\(G(x) = sign\left[\sum\limits_{m=1}^MG_m(x)\right]\)



正則化 (Regularization) 和其餘


一、Shrinkage

對每一個基學習器乘以一個係數\(\nu\) (0 < \(\nu\) <1),使其對最終模型的貢獻減少,從而防止學的太快產生過擬合。\(\nu\)又稱學習率,即scikit-learn中的 learning rate。因而上文的加法模型就從:

\[f_m(x) = f_{m-1}(x) + \alpha_m G_m(x)\]

變爲:

\[f_m(x) = f_{m-1}(x) + \nu \cdot \alpha_m G_m(x)\]

通常\(\nu\)要和迭代次數M結合起來使用,較小的\(\nu\)意味着須要較大的M。ESL中提到的策略是先將\(\nu\)設得很小 (\(\nu\) < 0.1),再經過early stopping選擇M,不過現實中也經常使用cross-validation進行選擇。


二、Early stopping

將數據集劃分爲訓練集和測試集,在訓練過程當中不斷檢查在測試集上的表現,若是測試集上的準確率降低到必定閾值之下,則中止訓練,選用當前的迭代次數M,這一樣是防止過擬合的手段。


三、Weight Trimming

weight trimming不是正則化的方法,其主要目的是提升訓練速度。在AdaBoost的每一輪基學習器訓練過程當中,只有小部分樣本的權重較大,於是能產生較大的影響,而其餘大部分權重小的樣本則對訓練影響甚微。Weight trimming的思想是每一輪迭代中刪除那些低權重的樣本,只用高權重樣本進行訓練。具體是設定一個閾值 (好比90%或99%),再將全部樣本按權重排序,計算權重的累積和,累積和大於閾值的權重 (樣本) 被捨棄,不會用於訓練。注意每一輪訓練完成後全部樣本的權重依然會被從新計算,這意味着以前被捨棄的樣本在以後的迭代中若是權重增長,可能會從新用於訓練。

根據 [Friedman et al., 2000] 中的描述,weighting trimming能夠提升計算效率,且不會犧牲準確率,下一篇中將經過實現來驗證。



終末

AdaBoost的原始論文 [Freund & Schapire, 1997] 並不是使用了上文中的推導方法,而是基於PAC學習框架下進行解釋的。上文的將AdaBoost視爲 「加法模型 + 指數損失」 的觀點,由斯坦福的幾位統計系大牛 [Friedman et al., 2000] 提出,於是這一派也被稱爲「統計視角」。沿着這個路子,若將指數損失替換爲其餘損失函數並依此不斷訓練新學習器,則誕生了Gradient Boosting算法,是爲下一篇的主題。




Reference :

  1. Friedman, J., Hastie, T. and Tibshirani, R. Additive logistic regression: a statistical view of boosting
  2. Friedman, J., Hastie, T. and Tibshirani, R. The Elements of Staistical Learning
  3. 周志華. 《機器學習》
  4. 李航. 《統計學習方法》
  5. Schapire R. E. Expalining AdaBoost

/

相關文章
相關標籤/搜索