1. 程式人生 > >李巨集毅機器學習課程筆記10:Ensemble、Deep Reinforcement Learning

李巨集毅機器學習課程筆記10:Ensemble、Deep Reinforcement Learning

臺灣大學李巨集毅老師的機器學習課程是一份非常好的ML/DL入門資料,李巨集毅老師將課程錄影上傳到了YouTube,地址:NTUEE ML 2016
這篇文章是學習本課程第27-28課所做的筆記和自己的理解。

Lecture 27: Ensemble

Ensemble類似於“打群架”“大家一起上”,在Kaggle中是重要的方法。
Ensemble的Framework是:

  1. 先找到若干分類器,這些分類器是彼此不同;
  2. 再將這些分類器妥當地集合起來。

Ensemble的不同方法,是為了應對不同的狀況。

Ensemble: Bagging

Bagging 是 Bootstrap Aggregation 的簡寫。

這裡寫圖片描述
model變複雜時,error會先降後升,這是因為簡單的model(underfitting)有小的variance、大的bias, 而複雜的model(overfitting)有大的variance、小的bias。如果模型很複雜,可以訓練出多個複雜的模型,取平均,以減小variance,提高泛化能力。

這裡寫圖片描述
實際中的做法是Bagging。在模型比較複雜(variance大、bias小)、比較容易overfitting時才用Bagging。其實NN不是很容易overfitting,而是卡在訓練集上得不到好的結果,而像decision tree就很容易在訓練集上很低(0%)的錯誤率、容易overfitting。
對decision tree做bagging就是random forest。

這裡寫圖片描述
隨機森林的做法:若是對訓練資料重取樣,那麼得到的各棵樹太像了。所以在每次分裂節點時隨機限制哪些feature可用哪些feature不可用,避免各棵樹長得太像。
Out-of-bag方法:假設現在有訓練資料x1, x2, x3, x4,每次取樣出部分資料訓練function,如用x1, x2訓練f1,用x3, x4訓練f2,用x1, x3訓練f3,用x2, x4訓練f4。這樣,x1沒有被用於訓練f2, f4,所以可用f2, f4組成隨機森林來測試x1, 其餘x2, x3, x4同理。
Out-of-bag (OOB) error是對測試集上錯誤率的一個很好的估計。
之前要切出驗證集才知道在測試集上的錯誤率,而用OOB就不用驗證集了,因為部分訓練資料沒有被包含在訓練中,它們可以拿來當做驗證集。

OOB樣本可以用來估計變數的重要性
這裡寫圖片描述

下面是單棵決策樹和100棵決策樹組成的隨機森林用來擬合“初音函式”的結果:
這裡寫圖片描述
Bagging並不是為了提升在訓練集上的performance。在初音這個任務上並沒有什麼訓練、測試,目標是看有多能擬合初音函式,與你的函式的泛化特性無關。所以現在加上隨機森林並不能更加擬合初音函式,原來深度為5的單棵決策樹不能擬合初音函式,那麼加上隨機森林還是不能擬合初音函式。但是Bagging可以讓variance比較小,得到的function比較平滑。

Ensemble: Boosting

Bagging是要把已經很容易overfitting的model讓它不那麼容易overfitting。
Boosting是對沒法fit訓練資料的model, 想辦法提升它的performance:Improving Weak Classifiers.

這裡寫圖片描述
如果分類器在訓練資料上有大於50%的正確率,那麼在Boosting之後會得到100%的正確率。
Boosting的流程是:先有最初的分類器f1, 然後找到與f1互補的分類器f2,……
在Bagging中每個分類器都是獨立的,訓練時不相干,可以同時訓練。而在Boosting中,要先訓練完f1,再根據f1的特性訓練f2……

這裡寫圖片描述
在不同訓練資料上訓練就會得到不同的分類器,不同的訓練資料一般通過re-weighting training data得到,實際上修改了目標函式。
Adaboost的做法就是,訓練好f1後,調整training set的weight,讓f1在新的training set上錯誤率達到50%, 再用新的training set訓練f2……
調整training set的weight 的方法是,對f1正確分類的example, 其weight除以一個大於1的值;對f1錯誤分類的example, 其weight乘以相同的值,這個值可以計算出來。
這裡寫圖片描述

Adaboost演算法如下:
這裡寫圖片描述
unt+1unt×exp(y^nft(xn)αt)
在aggregate classifiers時,用uniform weight的方式比較不好,因為不同的分類器有強弱之別。

下面證明隨著T 的增大,H(x) 會在訓練資料上取得越來越小的錯誤率。
首先給出訓練錯誤率的upper-bound,然後證明這個upper-bound恰好等於1NZT+1,之後往證T,ZT+1
這裡寫圖片描述

這裡寫圖片描述
隨著輪數T 的增加,H(x) 在訓練資料上的錯誤率降為0,但是訓練錯誤率為0之後,測試錯誤率還在繼續下降。
我們將y^g(x) 作為margin,margin越“正”表示越正確。可見,5個分類器的組合已經有0%的訓練錯誤率,但再增加新的分類器margin會被往右推,也就是說就算訓練錯誤率為0,Adaboost也會繼續放大margin。放大margin,相當於在減小penalty。

Adaboost是Boosting的特例,一般的Boosting演算法是:
這裡寫圖片描述
用gradient descent最小化objective function, 希望下圖中兩個紅框中的項是同向的:
這裡寫圖片描述

exp(...) 作為Gradient Boosting 的 loss function的話,所找出來的ft,αt 就是Adaboost中的ft,αt
Gradient Boosting是更一般化的想法,因為可以改loss function。

Ensemble: Stacking

這裡寫圖片描述
注意訓練資料的劃分:前面的四個系統和final classifier要使用不同的訓練資料。
final classifier決定各系統的weight.

Lecture 28: Deep Reinforcement Learning

李巨集毅機器學習課程筆記