Ensemble Learning 集成學習(下)

追客 Fredrick Hong
8 min readApr 14, 2022

--

最近工作上有碰到「簡易版 feature用 gradient boosting」的成效 train的比「詳細版 feature用深度學習」的成效還好的情況,於是就把李宏毅老師2015年講 ensemble的課程拿出來看,想好好理解一下集成學習在做什麼,順邊把筆記記錄起來。

因為這次影片的內容較多,所以我把ensemble分成上中下篇來紀錄,最後這篇要介紹的是Boosting 中的 Gradient Boosting 跟 Ensemble: Stacking 的概念。

此篇筆記來自此課程:https://www.youtube.com/watch?v=tH9FH1DH5n0

上一篇介紹完AdaBoost的原理,這篇來介紹同樣是Boosting的學習方式:Gradient Boosting,前半段幾乎都是跟著公式推導的筆記,想知道結論的可以直接看後半段的小結語。

Gradient Boosting

  • 可以想像是比Bossting中比較general的版本

圖1 解釋 (General Formulation of Boosting)

* 最初的function g0(x)=0* 在T個iteration中,以t=1為例子。* 我們需要找到一個ft(x)和α來讓gt-1(x)更好,也就是說ft(x)跟ft-1(x)有互補作用。 (α = weight)* gt-1(x) = 根據ft(x)和 α weighted sum的結果。* gt(x) = gt-1(x) + αt*ft(x)* H(x) = sign(gt(x))
圖1 (截圖自課程 — ML Lecture 22: Ensemble)
  • 問題是要怎麼讓機器學習到g(x)呢?
  • 我們需要一個loss function:
loss function
  • l 是 loss function,可以是binary cross entropy 或 MSE,用來計算 g 和 y hat 之間的差異,而這邊我們先用下圖表示。
這邊範例用的loss function
  • 這樣的 loss function 合不合理?因為我們會希望 minimize 這個 loss function 時,y hat 跟 g(x) 要同號,且越大越好,因此是合理的。

圖2 解釋

* 我們要把function g(x),對L做微分,算出它的gradient,再用gradient去更新gt-1,變成gt,使得gt的loss function比gt-1還要小。* 對一個 function 做偏微分有點抽象,因為L(g)又不是參數,這邊老師解釋,可以把function想像成無窮多維的vector (無窮多個參數),既然是參數,就比較容易想像可以對 L(g)做微分。* 下圖中間是以Gradient Descent的角度去計算出gt,最下方是以Boosting的角度計算出gt,而我們會希望αt*ft跟gradient的方向相同。(η是learning rate)
圖2 (截圖自課程 — ML Lecture 22: Ensemble)

圖3 解釋

  • 經過一連串的推導,會得到「圖3藍線底」這個 weight 就是AdaBoost的weight。
圖3 (截圖自課程 — ML Lecture 22: Ensemble)

圖4 解釋

  • gt(x) = gt-1(x) + αt*ft(x)
ft(x)
* 這邊的ft(x)就是AdaBoost找出來的ft(x)。
* 可以想像成找到一個weak classifier:ft(x),然後對這個ft(x)做gradient descent。
αt
* 這邊的αt就有點像是learning rate,我們的目標是要找到一個αt,可以讓L(g)最小,而因為ft(x)本身可能就是一個weak classifier (可能是nn),所以要很謹慎地設定learning rate,因為用暴力解法太花時間 (窮舉各種不同的α)。
* 因此用快速的方式,就是計算αt跟L(g)的微分,然後看看αt是多少的時候,微分的結果等於0。* 巧妙的是找到的αt剛好就等於AdaBoost裡面的那個weight (同樣的αt)。
圖4 (截圖自課程 — ML Lecture 22: Ensemble)

我們可以把AdaBoost想像成,它是對一個loss function做gradient descent,而learning rate有一個很好的方法可以決定。

Gradient Boosting巧妙的地方,是我們永遠可以創造其他的objective function,就可以創造出其他Boosting的方法。(AdaBoost的loss function是 exp(-y^* g(x)))

小結語

因為影片看到這邊有點混淆,會覺得按照公式推導,Gradient Boosting就等於AdaBoost,但其實是當GB的loss function選擇使用exp(-y^* g(x)),這種情況下才會等於AdaBoost,否則GB可以選擇其他loss function或objective function,因此我認為GB的好壞跟loss function的選擇有很大的關係。

按照上面AdaBoost的介紹,AdaBoost是透過提升上一個function錯分資料的權重,來提升上一個function的不足,而GB則是透過gradient descent來提升模型的不足。

網路上其他人解釋AdaBoost和GB的不同

和AdaBoost一樣,Gradient Boosting也是重複選擇一個表現一般的模型並且每次基於先前模型的表現進行調整。不同的是,AdaBoost是通過提升錯分資料點的權重來定位模型的不足而Gradient Boosting是通過算梯度(gradient)來定位模型的不足。因此相比AdaBoost, Gradient Boosting可以使用更多種類的目標函式,而當目標函式是均方誤差時,計算損失函式的負梯度值在當前模型的值即為殘差。 引述來自:https://www.itread01.com/content/1550642058.html

最後來介紹最後一種Ensemble的方式,也是老師提到實務上最實用的方式。

Ensemble: Stacking

Voting

圖5 解釋

* 假設我們有好幾個model,就直接把input丟到所有model中產出output,然後再去voting。* 但在所有的model當中,我們會遇到某些model是很差的,又不好意思將它的權重設定得很低(老師這邊舉例是說每個model是由不同同學訓練出來的),因此我們就將每個model預測出來的結果,變成一組新的feature,再input進去一個final classifier裡(若前面的model已經夠複雜,final就不需要太複雜)。* 在訓練model,我們需要將training data拆分成兩組,一組用來train大家的model,一組用來train final model,就是要避免overfitting。因為如果第一層某個人的model已經overfitting,那後面final的就會覺得這個model很強,但其實它在testing data上的表現很差。* 到這邊一樣還是會給每個model一個權重,一樣會傷害到它的自尊心,但至少他是被機器傷害的XD
圖5 (截圖自課程 — ML Lecture 22: Ensemble)

老師這邊雖然說不好意思人工設定權重,因此交由機器判斷,但我認為有個好處,就是我們不需要人工先去驗證每個model的好壞,可以直接讓機器判斷,可以省去驗證的時間。

Ensemble的筆記到這邊已經結束了,如果喜歡我的筆記,歡迎給個clap或留下留言!

--

--

追客 Fredrick Hong

畢業後就到在數位廣告業打滾,之前是廣告優化師,目前則是在數據團隊任職。