秋高氣爽,天氣不錯,正是學習的大好時機~

數學準備

偏差-方差分解:假設我們永遠無法擬合出真實分佈,偏差表達預測值與真實值的偏離程度,如果預測值完美的等於真實值,那麼偏差爲零,但學習器很可能是過擬合的。方差表達同一學習器在不同數據上預測值的離散程度,如果預測值均一致,那麼方差爲零,但學習器很可能是欠擬合的。指數損失(exponential loss):樣本重要程度相同的情形下,指數損失爲

,表示真實的類別標記,

表示預測類別標記,總的損失可以理解爲對每個樣本進行預測之後的取指數損失的平均值。(與平方損失類似,它是每個樣本的殘差平方和的平均值)

錯誤率:在樣本重要程度相同的情況下,錯誤率是分類錯誤的樣本佔全部樣本的比例,表達爲;在樣本重要程度不一致的情況下,錯誤率要乘以權重係數,表達爲

。可以看出,前者只是後者的特例。

標量梯度:標量函數的梯度是一個矢量,其方向指向着該標量變化最快的方向。

泰勒級數(Talor):對於無窮可微的函數,在點處可以展開爲,其第一項的係數是函數的梯度,一般我們只保留低階項,但高階項會讓近似更加精確。

Boosting 的動機

爲了深刻地理解Boosting,我們有必要總結我們已經知道的部分:

我們在《bagging集成和stacking集成(代碼篇)》中看到,隨機森林規模的增大並不會導致過擬合,反而使集成器的泛化誤差趨於穩定,說明Bagging集成中基學習器數量的增加並不會增加模型的複雜度。我們在《過擬合(理論篇)》中提到,偏差是模型準確度的體現,方差是模型穩定性的體現。具體來說,偏差度量了學習器的擬合能力,擬合能力越強,偏差越小,當偏差太小時Loss也就很小,就導致了過擬合。這時,泛化誤差就會很大,但偏差很小,泛化誤差的主要貢獻就來自於方差。同時,訓練集和測試集是同一個分佈採樣而來,但訓練集表現好,測試集表現差,對應的方差也就很大,說明方差刻畫了學習器對不同數據的穩定性。

而Bagging集成添加了樣本擾動,隨機森林進一步地添加了特徵擾動,最後將這些差異化的模型平均化,就是在儘可能提高學習器對數據擾動的穩定性,也就是降低學習器的方差。基學習器的增加只是增加模型的多樣性,而沒有增加模型的複雜性,越複雜的模型擬合能力越強,bagging集成卻無益於降低偏差,甚至它會提高學習器的偏差。

如果我們想降低模型的偏差,bagging就不是一個好的選擇。同時呢,面對可能存在複雜關係的數據,單一的簡單模型無法得出低偏差的結果,我們把這類學習器叫做弱學習器,而所謂的強學習器設計並不容易,根據實際的應用效率和開發難度上,我們需要將弱學習器提升爲強學習器的算法,也就是我們的Boosting集成。Boosting的想法仍然是模型的加權平均:

其中

是基學習器,

是基學習器的權重係數。看起來,boosting和bagging表達式一致,但是bagging的每個基學習器是近乎獨立的訓練出來的模型,而boosting的每個基學習器卻是在優化上一步的的結果,比如Adaboost的做法是將上一步學習器分類錯的樣本賦予更大的權重,Gradient Boosting的做法是下一個學習器去擬合上一步分類器的殘差。

舉個例子,打靶的時候,我們的任務是儘可能每次都打到靶心,bagging集成就像進行十次打靶,但會把每一次的靶紙撤掉,每一次打靶都不知道上一次的表現,那麼痕跡都會很集中,方差就會很小;boosting集成就像十次打靶不更換靶紙,上一次打的偏右,我們就儘量偏左一點,痕跡不會非常集中,但偏差每次都會縮小。

從數學角度來理解,Boosting與簡單線性迴歸一致,簡單線性模型是關於特徵值的函數,而我們的Boosting是函數的函數,我們需要做的是最小化Loss function:

但這樣的優化會存在困難,因爲我們同時需要優k個函數,Boosting採取了貪心算法,只考慮當前的學習器,因爲我們是逐步將弱學習器加進去,就像打靶時候是一步步的靠近靶心,所以有遞推公式:

我們每次只需要優化一個學習器,直到達到我們需要的效果。Boosting不是一個方法,而是一類方法,下面我們針對分類和迴歸都分舉一例,主要針對性的講解很多人理解上的難點。

Adaboost

Adaboost可能是最著名的boosting集成算法,最初的算法採用了並不被經常使用的指數損失函數,在這樣的損失框架內,我們就不能把二分類樣本標記爲0,1。因爲{0,1}的樣本標記會使得只要指數項出現0,那麼損失就會變成1,取而代之的是,我們採用{-1,1}的樣本標記。

Adaboost在很多材料上都會詳細講解,但加上陌生的指數損失和貌似複雜的數學變換容易把人云裏霧裏,但最關鍵的步驟卻只有兩步:

獲得學習器的權重係數更新每一輪樣本的權重係數

開始時,我們假設每一個樣本都是同等重要的,每個樣本的權重都相等,在此基礎上我們訓練出第一個學習器

,並得出分類誤率

,並將此時的錯誤率轉化爲此時學習器的權重係數:

這樣的轉化如何理解呢?從直觀上可以理解爲來自於Logistic迴歸中的相對概率,從數學上則是對此時學習器的指數損失做優化的必然結果,我們可以優化攜帶

的指數損失函數:

作爲變量,對其求導,就可以得到上述的轉化形式,換而言之,我們之所以得到了這樣的形式,根本原因在於我們採用了指數損失函數,與其他無關。但注意到此時我們並未更新權重,因爲學習器的權重係數的更新都要利用學習器的錯誤率,錯誤率是由上一步的樣本分佈得到,我們只有獲得了學習的權重係數才能更新下一步要使用的樣本分佈。

我們假設初始權值分佈爲:

,上標表示樣本,下標表示迭代次數。那麼第一個學習器訓練完成後,我們的權值更新爲:

此關係我們可以從最小化當前損失函數來推導,但直觀來看,就是每個樣本的當前權重乘以該樣本的指數損失,類別正確的損失小,新的權重也會變小,

是全部的權重之和,相當於一個歸一化因子,因爲我們需要總的樣本出現概率爲1。

依照這樣的步驟,我們就可以依次訓練出一系列的學習器,直到達到我們需要的性能。需要注意的是,樣本更新的權重會直接參與到下一輪學習器的損失函數,而非重新採樣。

Gradient Boosting

梯度提升集成是另外一種性能優越的Boosting,常見的形式是梯度提升決策樹,也就是著名的GBDT。爲了徹底理解此算法,我們在《非參數模型進階》中詳細介紹了迴歸樹,最初的梯度集成辦法正是迴歸樹的疊加。

我們會看到很多材料上會分類爲提升樹和梯度提升樹,提升樹是在每一步去擬合上一步的殘差,而梯度提升樹是用負梯度近似殘差。但這樣的看法會讓人誤以爲殘差比起負梯度是更根本性的東西,但事實上殘差和負梯度本來就是一回事情,負梯度具有更普遍的意義。而且最重要的是,在更一般的情況下,我們理論上需要擬合的也不是負梯度。

我們首先有遞推公式:

定義Boosting的損失函數爲:

作爲變量,對損失函數做泰勒展開,保留到二階項:

要使損失函數最小,就是最小化上面的泰勒展開,第一項爲常數項,不參與優化,第二項的係數我們記爲

,第三項的係數我們記爲

,所以我們令後兩項之和爲零:

當損失是均方誤差時,

就是殘差,

爲1,所以下一步的學習器需要擬合上一步的殘差。對於更一般的損失函數,我們需要擬合一階導數和二階導數的商,只是,二階導數一般接近1,所以我們選擇負梯度作爲下一步需要擬合的目標。

但在各種Boosting的推廣中,我們還會看到一種叫做xgboost的算法,它不僅考慮了二階導數,還在二階導數中添加了正則化項,使得擬合目標變爲:

讀芯君開扒

課堂TIPS

• Adaboost採用了指數損失函數,但指數損失對於Adaboost整體框架的影響只侷限於學習器權重的更新形式和樣本權重的更新形式,我們換用其他的分類損失函數仍然可以構建出Adaboost。

• 在Adaboost中,我主要強調了樣本更新的權重要進入損失函數,使得被分錯的樣本在損失中所佔的比例更大,但實際上,我們還可以採用一種叫做重採樣的方法,是將樣本更新的權重進入採樣過程,是爲了錯誤的樣本能被更大幾率再次採到,而損失函數是不變的。

• Gradient Boosting的基本框架可以從梯度下降來理解,我們的每一步梯度下降都會使我們的Loss在前面的基礎上繼續減小,同時完成一次參數的更新,梯度集成辦法每一次基學習器的訓練就對應着梯度下降的一次更新。

作者:唐僧不用海飛絲

如需轉載,請後臺留言,遵守轉載規範

查看原文 >>
相關文章