大白話5分鐘帶你走進人工智能-第31節集成學習之最通俗理解GBDT原理和過程

目錄html

一、前述算法

二、向量空間的梯度降低:app

三、函數空間的梯度降低:函數

四、梯度降低的流程:工具

五、在向量空間的梯度降低和在函數空間的梯度降低有什麼區別呢?學習

六、咱們看下GBDT的流程圖解:測試

七、咱們看一個GBDT的例子:優化

八、咱們看下GBDT不一樣版本的理解:url


一、前述

從本課時開始,咱們講解一個新的集成學習算法,GBDT。spa

首先咱們回顧下有監督學習。假定有N個訓練樣本,$\{(X(1), y(1)),(X(2), y(2)), \cdots,(X(m), y(m))\}$, 找到一個函數 F(x),對應一種映射使得損失函數最小。即:

                                                                                F^{*}=\underset{F(X)}{\operatorname{argmin}} L(y, F(X))

如何保證最小呢?就是經過咱們解函數最優化的算法去使得最小,常見的有梯度降低這種方式。

二、向量空間的梯度降低

咱們想一想在梯度降低的時候,更新w是怎麼更新的呢,先是隨機找到一個w0,而後舉根據梯度降低的迭代公式:     

                                                                     w_{n}=w_{n-1}+\left(-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}\right)

詳細解釋下這個公式,其中

                                                                                              -\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}

意思是把損失函數先對w進行求導,獲得一個導函數,或者說獲得一組導函數,由於w是多元函數,獲得了一組導函數以後,再把Wn-1這一組w帶進去,獲得一組值,這組值咱們稱做梯度,把梯度加個負號就是負梯度,乘一個λ是學習率。 這個公式總體的意思是 我只要把w加上一個L對於w的負梯度,把-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}} 做爲∆w,加到原來的w上,新產生出來的w就是比原來的w要好一些,能讓損失函數更小一些,這就是對於w參數的一個提高。因此接下來咱們的迭代步驟就是w1=w0+△w0,w2=w1+△w1=w0+△w0+△w1,這裏是把w2用w1表示出來。w3=w2+△w2=w0+△w0+△w1+△w2,....因此最終的wn能夠表達爲wn=w0+△w1+△w2+...+△w(n-1)。通常狀況下咱們初始的時候w0=0。因此最後能夠表達爲

                                                                                             w_{n}=\sum_{t=0}^{n} \Delta w_{t}

這就是向量空間的梯度降低的過程。所謂向量空間的梯度降低,爲何叫作向量空間的梯度降低,由於w是一組向量,咱們是在w上給它往降低因此稱爲向量空間的梯度降低

三、函數空間的梯度降低

這裏面的F*在假如邏輯迴歸裏面就是1/1+e^-z。在其餘算法裏各自對應其損失函數。對於決策樹來講,樹其實也是有損失函數的,好比咱們以前在後剪枝的時候,一般作法就是,拿測試集或者驗證集去檢驗一下我cancel掉葉子節點會不會變好一點,但實際上還有另外一種減枝方式,就是根據損失函數來的,別管損失函數是什麼,它是一個L,L跟x有關的,跟葉子節點的數量T有關,表達爲L (x,T)。T至關於一個正則項,葉子節點算的數量越多,它的損失函數就越大,它不想讓樹太複雜了,經過剪枝剪一次去去看損失函數,是上升了仍是降低了,若是損失函數降低了,剪枝就認可它,之後就都不要節點了,因此說對於決策樹自己是能夠定義一個損失函數的,只不過定義出來它意義不大,只能在剪枝的時候看看用來效果怎麼樣,由於咱們知道損失函數是用來評估結果的,評估你的模型到底怎麼樣的,那咱們剪枝的時候拿它進行一個評估也是一個比較科學的方法,可是訓練的過程當中是用不到損失函數,由於你不知道怎麼分裂能夠影響到損失函數,因此訓練的時候基本都沒有提損失函數,而是用基尼係數,信息熵這種變通的方式。另外一方面,樹的損失函數也不能直接使用梯度降低來降低這個損失函數,按原來的作法咱們有一堆w把空先給你留好了,而後你找到一組最好的w讓損失函數最小就能夠了,但樹按照這個思路怎麼來呢,應該是找到全部可能性的樹,挑出一個能使損失函數最小的樹,按理說應該這麼作,可是這麼作不現實,由於樹有無窮多個,因此咱們採用其它方式獲得一個近似最好的可能性。因此對與單純的決策樹咱們通常不適用損失函數。

可是一旦變成了集成學習,咱們又能夠把損失函數又讓它重出江湖了。對於決策樹咱們不能使用梯度降低的方式,由於在決策樹裏面損失函數就像一個黑盒,沒有具體的參數經過損失函數供咱們優化。可是對於集成學習則可使用,由於集成學習對應着不少樹。首先決策樹是根據選取的特定條件由根節點開始逐級分裂,直到知足純度要求或達到預剪枝設置的中止而造成的一種樹。那如何選取特定條件? 常見的有:GINI係數, Entropy,最小二乘MSE。而迴歸樹就是每次分裂後計算分裂出的節點的平均值, 將平均值帶入MSE損失函數進行評估。而GBDT是一種決策樹的提高算法 ,經過所有樣本迭代生成多棵迴歸樹, 用來解決迴歸預測問題(迭代生成的每棵樹都是迴歸樹),經過調整目標函數也能夠解決分類問題。傳統的迴歸問題損失函數是:

                                                                                                $L=\sum(y -\hat{y})^{2}$

yi是真實的樣本的結果,y^是預測的結果。而在集成學習裏面,y^就是咱們每一次的預測的G(x),因此如今咱們的損失函數變成yi和大G(x)的一個損失函數了,所以集成學習裏面損失函數表達式爲L=L(yi,G)。我雖然不能寫出來具體的損失函數,可是確定是關於yi和G的一個表達式,我想找到一個最好的大G(x),一步去找,找不到,怎麼辦,我就分步去找,最開始找到一個G0(x),它通常不是能讓損失函數最小的,我知道有梯度降低這個工具,能讓它更接近損失函數最低點一些。咱們但願損失函數降低,但願每一次能找到一個新的G(x),就像向量空間梯度降低中更新w同樣,咱們但願找到一個新的w,w是損失函數改變的緣由,如今變成了每一次的G(x)是損失函數改變的緣由,每一次的G(x)的改變必定會改變損失函數,G(x)只要它能改變損失函數,損失函數不是上升就是降低。怎麼着能讓它損失函數下降呢?咱們知道最終的G(x)是一堆g(x)相加,換一個角度來說,第一步迭代咱們獲得了一個G1(x)=g1(x),第二步迭代咱們獲得了G2(x)=G1(x)+g2(x),第三步就是G3(x)=G2(x)+g3(x),注意這個形式,集成樹的每一步迭代形式和梯度降低每一步的迭代形式彷佛很像,咱們注意觀察,在梯度降低裏,每一步迭代所要加的△w只要是前一項的值帶到損失函數裏面的負梯度-\lambda \frac{\partial L\left(y, w_{n-1}\right)}{\partial w_{n-1}}=\Delta w_{n},就可讓損失函數變得更小。而我如今所謂的集成學習一輪一輪的迭代,第一輪我想加上一個g1(x),第二輪我想再加上g2(x),第三輪我想再加上g3(x),根據梯度降低的原則,加上的每個g(x)等於什麼的時候可以讓集成學習的損失函數愈來愈小呢?能不能也讓它等於損失函數對於上一次的預測總體的結果G(x)這個東西的負梯度?這樣損失函數必定會也是降低的。我把G(x)當作一個總體來看待,相似於原先的w變量。反正都是讓損失函數改變的緣由。這種梯度降低的過程就稱爲函數空間的梯度降低過程函數空間的梯度降低是什麼意思呢?由於在函數空間中這個函數它寫不出來是由什麼w組成的,它的最小單位就是這個弱分類器自己,因此咱們只能在函數空間進行梯度降低。

最開始無論用什麼方法,已經獲得了第一代G0(x),這時能算出來損失函數,它是能讓損失函數結果最小的那個G(x)嗎?應該不是。咱們但願把它修改修改,讓它變好一些,能讓損失函數下降。我令G1(x)=G0(x)加上損失函數對於G0的負梯度,即             

                                                                      G_{1}(x)=G_{0}(x)+\left(-\lambda \frac{\partial L}{\partial G_{0}(x)}\right)

即G1(x)=G0(x)+∆G0,此時的G1(x)就能比G(x)讓損失函數變得更低一些了。而後依次G2(x)去迭代。G2(x)=G1(X)+∆G1,∆Gt應該等於損失函數L對於Gt的梯度,即

                                                                                          \Delta Gt= \frac{\partial L\left(y, G \right)}{\partial G_{t}}

只要每次加上的都是∆Gt這麼個東西,每一步帶入各自的∆Gt,第一次帶入∆G0,第二次帶入∆G1,以此類推,就能保證最後獲得的G一次比一次的可以讓損失函數變小。一直到GT(X)=GT-1(X)+∆GT-1。此時GT(X)就是咱們最終要獲得的GT(X)。表達以下:

                                                                                        \\G_{1}(x)=G_{0}(x)+\Delta G_{0} \\ \\ \quad G_{2}(x)=G_{1}(x)+\Delta G_{1} \\...\\ G_{T}(x)=G_{T-1}(x)+\Delta G_{T-1}

這裏面每一步的所加的∆G不就是集成學習裏邊每一步加的弱分類器g(x)嗎,第一次你但願加上一個g1(x),第二次加上一個g2(x),一直加到gt(x),最終的大Gt(x)等於什麼呢,假設G0(x)=g0(x)=0,Gt(x)=g0(x)+g1(x)+g2(x)……一直加到gt-1(x),這不就是一個另外一個視角看的集成學習嘛。對於最小二乘損失函數來講,損失函數是:

                                                                                               $L=\sum(y -\hat{y})^{2}$

對y^求偏導就是2(y-y^),一般在前面還有個學習率,假如學習率是1/2的話那麼會和2相乘抵消,因此最後的求導結果是y-y^,對於咱們的集成學習來講y^就是上一步的總體的預測結果Gt-1(x)。因此集成學習的損失函數對G(x)的求導結果就是:

                                                                                 -\frac{\partial L\left(y, G_{t-1}(x)\right)}{\partial G_{t-1}(x)}=y-G_{t-1}(x)

因此在t輪咱們應該訓練出的gt(x)的預測結果應該等於y-F_{t-1}(x)。對於決策樹算法來講的話,即爲以y-F_{t-1}(x)爲新的標籤,x爲feature,擬合一顆新的決策樹。經過這種方式,來訓練的G(x),就叫作GBDT

四、梯度降低的流程:

說了這麼多,到底什麼是梯度降低?所謂梯度降低,也就是對於任何一個函數來講,只要這個函數是個凸函數,它的自變量是x,也就是說這個函數受x改變而改變,你只要瞎蒙出來一代x,你接下來不停的去迭代,每次迭代的準則就是加上一個函數對上一代自變量的求導,即負梯度,表達爲xn=xo-∂F/∂x ,這麼不停的迭代,最終獲得的x就可以找到F(x)的最小值,這個東西就叫作梯度降低

梯度降低和L-BFGS同樣,它就是一個算法,一個函數關於一個變量的算法。每次我就讓這個函數加上關於自變量的負梯度,就能讓函數愈來愈小。因此我不限制這個變量究竟是w仍是G,只要你這個東西能真真切切地影響個人大小,我去求你的負梯度,就能讓你越降越低。這就是隨機梯度降低算法的過程。它是不挑食的。

你優化的內容就是你去調整的內容,在函數性模型裏,真真正正影響損失函數大小的是w,因此我去調整w,讓w始終朝着負梯度的方向去改變,最終就能讓損失函數降到最低。而在帶着樹的集成學習裏面,最小的可以調整的單位沒有w了,你只能調整你加進來那棵小樹,因此你就去優化這棵小樹,讓你新加進來的小樹的預測結果儘可能等於函數空間上的負梯度方向。

其實它比向量空間的梯度降低的運算量至少是要少的,爲何呢?由於在向量空間中,w是一個向量,它要求一系列偏導,而在函數空間的梯度降低中,此時的變量就是一個數,因此就是一個求導數的概念了,也就是一維空間的梯度降低,每次加上一個數。


五、在向量空間的梯度降低和在函數空間的梯度降低有什麼區別呢?

 

詳細解釋下:

首先向量空間的梯度降低,翻譯是GradientDescent,函數空間的梯度降低,翻譯是GradientBoosting,說明是用在Boosting裏面的。其次向量空間的梯度降低優化內容是w,而函數空間優化函數F(x) ,爲何優化內容不一樣,向量空間如LR和線性迴歸,是有w的,能夠優化w,獲得model。而函數空間中,如DT,沒有w,只能對總體F(x)求導, 認爲模型訓練內部是黑盒子 只能改變預測值 y^, 輸入給訓練找到合適的model。向量空間中是對w求導,即

                                                                                   d_{i}=-\frac{\partial}{\partial w} f\left.(w)\right|_{w_{i}}

而函數空間是直接對總體F(x)求導,即

                                                                              g_{m}(X)=\left[\frac{\partial L(y, F(X))}{\partial F(X)}\right]_{F(X)=F_{m-1}(X)}

這裏面直接對F(x)求導,而且把上一代的F(x)值給帶進去。迭代公式也發生了變化。

向量空間中是w_{i+1}=w_{i}+\rho \cdot d_{i},函數空間中是f_{i}(x)=f_{i-1}(x)-\rho_{i} g_{m}(x)

 

六、咱們看下GBDT的流程圖解:

解釋下上面流程:

首先訓練集x0和y0,我在原始的訓練集上訓練一個比較弱的決策樹,長成了一棵樹。這是第一個模型1。經過預測的結果把訓練集上的標籤轉化爲X1,Y1。原來Adaboost是改變數據的權重,如今GBDT是改變Y的標籤,而後再訓練第二個模型,再改變標籤。反覆迭代下去,將全部的預測結果綜合做爲最後的預測結果,這就是GBDT的流程。

 

七、咱們看一個GBDT的例子:

 

假如用購物金額和是否常常去百度知道提問這兩個條件做爲x去判斷這我的的年齡,訓練的時候我有四條數據,分別是14歲,16歲,24歲和26歲。

我上來想訓練出一棵迴歸樹來,在根節點的時候平均值是20。接下來回歸樹怎麼訓練?拿什麼評估參數?拿mse,抱得最緊的放到一塊兒。此時給它一分爲二,我發現購物金額小於等於1000和大於1000,可以把14,16分到左邊,24和26分到右邊。這個樹我人爲的限制它只容許你有兩層。如今左邊這個節點輸出的結果統統是15,假如4條樣本數據分別對應編號是A,B,C,D的話,此時y^A,y^B等於15,y^C,y^D 等於25。

此時y^與真實的y之間有沒有殘差?有殘差,咱們知道負梯度就是殘差。接下來我想訓練第二棵樹,第二棵樹但願輸出結果是負梯度,也就是我但願輸出結果是殘差。那麼我就想要把殘差當作label放回到原來去,那麼對於這四條數據,它們的y原來是14,16,24,26,咱如今就變成-1,+1,-1,+1 。怎麼來的?原本是14,預測成了15,y- y^等於-1;那麼原來是24變成25了,它也是-1。

接下來我再根據常常到百度提問做爲條件進行一次分類,迴歸樹是無論你的label的,我就想把最接近的給湊到一塊兒去,因此接下來就把兩個-1湊到一塊兒了,把兩個+1湊到一塊兒了。那麼第二代的y^A就等於-1,y^B等於1。由於這兩個1分到一塊兒,它們平均值也是1就預測準了。 y^C等於-1,y^D 等於+1。

如今兩棵樹訓練完了,最終咱們來一條數據,好比說來一條數據14,它要怎麼來作預測?把它丟到第一個樹裏面,獲得一個15;再丟到第二棵樹裏面,獲得一個-1,最終的G=15-1=14,獲得一個正確的預測結果。

 

八、咱們看下GBDT不一樣版本的理解:

GBDT直觀的來看,就是說好比這我的90歲,第一個數給它預測成了78歲,還剩12歲,第二棵樹就把12歲做爲標準預測,結果它只預測到了十歲,還差兩歲。第三個樹又根據兩歲做爲標準,此時再次預測爲1.5,第四個樹根據0.5做爲標準預測結果爲0.5,最後四棵數加到一塊兒正好是90,每次擬合的都是殘差,這是簡單版的理解GBDT的過程。

核心版的理解是爲何每次要預測殘差,由於對於迴歸問題來說,恰好負梯度等於殘差,因此去預測的是殘差。由於你的mse帶着平方求導就是殘差。一般F(x)在相加的時候,會給這殘差也乘一個縮水的學習率,好比0.1。第二次雖然預測出12,我只給你加上1.2,防止你走過了,下次從78就變成79.2了,還差一大截的,你第三個再照樣去努力預測,再給乘一個縮水系數,跟我們的梯度降低的學習率是如出一轍的。

這個其實是原始的GBDT應對迴歸問題的時候,可使用簡單的把y level作一個替換,去從新訓練的這麼一種方式。可是對於分類問題,它就很差使了,因此xgboost提供了一個最終版的解決方案。

相關文章
相關標籤/搜索