GBDT理論知識總結


一. GBDT的經典paper:《Greedy Function Approximation:A Gradient Boosting Machine》

Abstract

Function approximation是從function space方面進行numerical optimization,其將stagewise additive expansions和steepest-descent minimization結合起來。而由此而來的Gradient Boosting Decision Tree(GBDT)可以適用於regression和classification,都具有完整的,魯棒性高,解釋性好的優點。

 

1. Function estimation

在機器學習的任務中,我們一般面對的問題是構造loss function,並求解其最小值。可以寫成如下形式:

通常的loss function有:

1. regression:均方誤差(y-F)2,絕對誤差|y-F|

2. classification:negative binomial log-likelihood log(1+e-2yF)

一般情況下,我們會把F(x)看做是一系列帶參數的函數集合 F(x;P),於是進一步將其表示為“additive”的形式:

1.1 Numerical optimizatin

我們可以通過選取一個參數模型F(x;P),來將function optimization問題轉化為一個parameter optimization問題:

進一步,我們可以把要優化的參數也表示為“additive”的形式:

1.2 Steepest-descent

梯度下降是最簡單,最常用的numerical optimization method之一。

首先,計算出當前的梯度:

where 

而梯度下降的步長為:

where ,稱為“line search”。

 

2. Numerical optimization in function space

現在,我們考慮“無參數”模型,轉而考慮直接在function space 進行numerical optimization。這時候,我們將在每個數據點x處的函數值F(x)看做是一個“參數”,仍然是來對loss funtion求解最小值。

在function space,為了表示一個函數F(x),理想狀況下有無數個點,但在現實中,我們用有限個(N個)離散點來表示它:

按照之前的numerical optimization的方式,我們需要求解:

 使用steepest-descent,有:

where ,and 

 

3. Finite data

當我們面對的情況為:用有限的數據集表示x,y的聯合分布的時候,上述的方法就有點行不通了。我們可以試試“greedy-stagewise”的方法:

但是對於一般的loss function和base learner來說,(9)式是很難求解的。給定了m次迭代后的當前近似函數Fm-1(x),當步長的direction是指數函數集合當中的一員時,可以看做是在求解最優值上的greedy step,同樣,它也可以被看做是相同限制下的steepest-descent step。作為比較,給出了在無限制條件下,在Fm-1(x)處的steepest-descent step direction。一種行之有效的方法就是在求解的時候,把它取為無限制條件下的負梯度方向

where 

這就把(9)式中較難求解的優化問題轉化為了一個基於均方誤差的擬合問題。

Gradient Boosting的通用解法如下:

 

 

二. 對於GBDT的一些理解

1. Boosting

GBDT的全稱是Gradient Boosting Decision Tree,Gradient Boosting和Decision Tree是兩個獨立的概念。因此我們先說說Boosting。Boosting的概念很好理解,意思是用一些弱分類器的組合來構造一個強分類器。因此,它不是某個具體的算法,它說的是一種理念。和這個理念相對應的是一次性構造一個強分類器。像支持向量機,邏輯回歸等都屬於后者。通常,我們通過相加來組合分類器,形式如下:

2. Gradient Boosting Modeling(GBM)

給定一個問題,我們如何構造這些弱分類器呢?Gradient Boosting Modeling (GBM) 就是構造 這些弱分類的一種方法。同樣,它指的不是某個具體的算法,仍然只是一個理念。在理解 Gradient Boosting Modeling 之前,我們先看看一個典型的優化問題:

針對這種優化問題,有一個經典的算法叫 Steepest Gradient Descent,也就是最深梯度下降法。 這個算法的過程大致如下: 

以上迭代過程可以這么理解:整個尋優的過程就是個小步快跑的過程,每跑一小步,都往函數當前下降最快的那個方向走一點。

這樣尋優得到的結果可以表示成加和形式,即:

這個形式和以上Fm(x)是不是非常相似? Gradient Boosting 正是由此啟發而來。 構造Fm(x)本身也是一個尋優的過程,只不過我們尋找的不是一個最優點,而是一個最優的函數。優化的目標通常都是通過一個損失函數來定義,即:

其中Loss(F(xi), yi)表示損失函數Loss在第i個樣本上的損失值,xi和yi分別表示第 i 個樣本的特征和目標值。常見的損失函數如平方差函數:

類似最深梯度下降法,我們可以通過梯度下降法來構造弱分類器f1, f2, ... , fm,只不過每次迭代時,令 

即對損失函數L,以 F 為參考求取梯度。 

這里有個小問題,一個函數對函數的求導不好理解,而且通常都無法通過上述公式直接求解 到梯度函數gi。為此,采取一個近似的方法,把函數Fi−1理解成在所有樣本上的離散的函數值,即: 

不難理解,這是一個 N 維向量,然后計算

這是一個函數對向量的求導,得到的也是一個梯度向量。注意,這里求導時的變量還是函數F,不是樣本xk。 

嚴格來說 ĝi(xk) for k = 1,2, ... , N 只是描述了gi在某些個別點上的值,並不足以表達gi,但我們可以通過函數擬合的方法從ĝi(xk) for k = 1,2, ... , N 構造gi,這樣我們就通過近似的方法得到了函數對函數的梯度求導。 

因此 GBM 的過程可以總結為如下: 

常量函數f0通常取樣本目標值的均值,即 

3. Gradient Boosting Decision Tree

以上 Gradient Boosting Modeling 的過程中,還沒有說清楚如何通過離散值 ĝi−1(xj) for j = 1,2,3,...N 構造擬合函數gi−1。函數擬合是個比較熟知的概念,有很多現成的方法,不過有一種擬合方法廣為應用,那就是決策樹 Decision Tree,有關決策樹的概念,理解GBDT重點首先是Gradient Boosting,其次才是 Decision Tree。GBDT 是 Gradient Boosting 的一種具體實例,只不過這里的弱分類器是決策樹。如果你改用其他弱分類器 XYZ,你也可以稱之為 Gradient Boosting XYZ。只不過 Decision Tree 很好用,GBDT 才如此引人注目。 

4. 損失函數

談到 GBDT,常聽到一種簡單的描述方式:“先構造一個(決策)樹,然后不斷在已有模型和實際樣本輸出的殘差上再構造一顆樹,依次迭代”。其實這個說法不全面,它只是 GBDT 的一種特殊情況,為了看清這個問題,需要對損失函數的選擇做一些解釋。 

從對GBM的描述里可以看到Gradient Boosting過程和具體用什么樣的弱分類器是完全獨立的,可以任意組合,因此這里不再刻意強調用決策樹來構造弱分類器,轉而我們來仔細看看弱分類器擬合的目標值,即梯度ĝi−1(xj ),之前我們已經提到過 

5. GBDT 和 AdaBoost

Boosting 是一類機器學習算法,在這個家族中還有一種非常著名的算法叫 AdaBoost,是 Adaptive Boosting 的簡稱,AdaBoost 在人臉檢測問題上尤其出名。既然也是 Boosting,可以想象它的構造過程也是通過多個弱分類器來構造一個強分類器。那 AdaBoost 和 GBDT 有什么區別呢? 

兩者最大的區別在於,AdaBoost 不屬於 Gradient Boosting,即它在構造弱分類器時並沒有利用到梯度下降法的思想,而是用的Forward Stagewise Additive Modeling (FSAM)。為了理解 FSAM,在回過頭來看看之前的優化問題。

嚴格來說之前描述的優化問題要求我們同時找出α1, α2, ... , αm和f1, f2, f3 ... , fm,這個問題很 難。為此我們把問題簡化為分階段優化,每個階段找出一個合適的α 和f 。假設我們已經 得到前 m-1 個弱分類器,即Fm−1(x),下一步在保證Fm−1(x)不變的前提下,尋找合適的 αmfm(x)。按照損失函數的定義,我們可以得到 

 

如果 Loss 是平方差函數,則我們有 

這里yi − Fm−1(xi)就是當前模型在數據上的殘差,可以看出,求解合適的αmfm(x)就是在這 當前的殘差上擬合一個弱分類器,且損失函數還是平方差函數。這和 GBDT 選擇平方差損失 函數時構造弱分類器的方法恰好一致。 

(1)擬合的是“殘差”,對應於GBDT中的梯度方向。

(2)損失函數是平方差函數,對應於GBDT中用Decision Tree來擬合“殘差”。

其中 wim−1= exp(−yi(Fm−1(xi))和要求解的αmfm(x)無關,可以當成樣本的權重,因此在這種情況下,構造弱分類器就是在對樣本設置權重后的數據上擬合,且損失函數還是指數形式。 這個就是 AdaBoost,不過 AdaBoost 最早並不是按這個思路推出來的,相反,是在 AdaBoost 提出 5 年后,人們才開始用 Forward Stagewise Additive Modeling 來解釋 AdaBoost 背后的原理。

為什么要把平方差和指數形式 Loss 函數單獨拿出來說呢?這是因為對這兩個損失函數來說, 按照 Forward Stagewise Additive Modeling 的思路構造弱分類器時比較方便。如果是平方差損 失函數,就在殘差上做平方差擬合構造弱分類器; 如果是指數形式的損失函數,就在帶權 重的樣本上構造弱分類器。但損失函數如果不是這兩種,問題就沒那么簡單,比如絕對差值 函數,雖然構造弱分類器也可以表示成在殘差上做絕對差值擬合,但這個子問題本身也不容 易解,因為我們是要構造多個弱分類器的,所以我們當然希望構造弱分類器這個子問題比較 好解。因此 FSAM 思路無法推廣到其他一些實用的損失函數上。相比而言,Gradient Boosting Modeling (GBM) 有什么優勢呢?GBM 每次迭代時,只需要計算當前的梯度,並在平方差損 失函數的基礎上擬合梯度。雖然梯度的計算依賴原始問題的損失函數形式,但這不是問題, 只要損失函數是連續可微的,梯度就可以計算。至於擬合梯度這個子問題,我們總是可以選 擇平方差函數作為這個子問題的損失函數,因為這個子問題是一個獨立的回歸問題。

因此 FSAM 和 GBM 得到的模型雖然從形式上是一樣的,都是若干弱模型相加,但是他們求 解弱分類器的思路和方法有很大的差別。只有當選擇平方差函數為損失函數時,這兩種方法 等同。 

 6. 為何GBDT受人青睞

以上比較了 GBM 和 FSAM,可以看到 GBM 在損失函數的選擇上有更大的靈活性,但這不足以解釋GBDT的全部優勢。GBDT是拿Decision Tree作為GBM里的弱分類器,GBDT的優勢 首先得益於 Decision Tree 本身的一些良好特性,具體可以列舉如下:

  1. Decision Tree 可以很好的處理 missing feature,這是他的天然特性,因為決策樹的每個節點只依賴一個 feature,如果某個 feature 不存在,這顆樹依然可以拿來做決策,只是少一些路徑。像邏輯回歸,SVM 就沒這個好處。

  2. Decision Tree 可以很好的處理各種類型的 feature,也是天然特性,很好理解,同樣邏輯回歸和 SVM 沒這樣的天然特性。

  3. 對特征空間的 outlier 有魯棒性,因為每個節點都是 x < 𝑇 的形式,至於大多少,小多少沒有區別,outlier 不會有什么大的影響,同樣邏輯回歸和 SVM 沒有這樣的天然特性。

  4. 如果有不相關的 feature,沒什么干擾,如果數據中有不相關的 feature,頂多這個 feature 不出現在樹的節點里。邏輯回歸和 SVM 沒有這樣的天然特性(但是有相應的補救措施,比如邏輯回歸里的 L1 正則化)。

  5. 數據規模影響不大,因為我們對弱分類器的要求不高,作為弱分類器的決策樹的深 度一般設的比較小,即使是大數據量,也可以方便處理。像 SVM 這種數據規模大的時候訓練會比較麻煩。

當然 Decision Tree 也不是毫無缺陷,通常在給定的不帶噪音的問題上,他能達到的最佳分類效果還是不如 SVM,邏輯回歸之類的。但是,我們實際面對的問題中,往往有很大的噪音,使得 Decision Tree 這個弱勢就不那么明顯了。而且,GBDT 通過不斷的疊加組合多個小的 Decision Tree,他在不帶噪音的問題上也能達到很好的分類效果。換句話說,通過GBDT訓練組合多個小的 Decision Tree 往往要比一次性訓練一個很大的 Decision Tree 的效果好很多。因此不能把 GBDT 理解為一顆大的決策樹,幾顆小樹經過疊加后就不再是顆大樹了,它比一顆大樹更強。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM