一. 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 本身的一些良好特性,具體可以列舉如下:
-
Decision Tree 可以很好的處理 missing feature,這是他的天然特性,因為決策樹的每個節點只依賴一個 feature,如果某個 feature 不存在,這顆樹依然可以拿來做決策,只是少一些路徑。像邏輯回歸,SVM 就沒這個好處。
-
Decision Tree 可以很好的處理各種類型的 feature,也是天然特性,很好理解,同樣邏輯回歸和 SVM 沒這樣的天然特性。
-
對特征空間的 outlier 有魯棒性,因為每個節點都是 x < 𝑇 的形式,至於大多少,小多少沒有區別,outlier 不會有什么大的影響,同樣邏輯回歸和 SVM 沒有這樣的天然特性。
-
如果有不相關的 feature,沒什么干擾,如果數據中有不相關的 feature,頂多這個 feature 不出現在樹的節點里。邏輯回歸和 SVM 沒有這樣的天然特性(但是有相應的補救措施,比如邏輯回歸里的 L1 正則化)。
-
數據規模影響不大,因為我們對弱分類器的要求不高,作為弱分類器的決策樹的深 度一般設的比較小,即使是大數據量,也可以方便處理。像 SVM 這種數據規模大的時候訓練會比較麻煩。
當然 Decision Tree 也不是毫無缺陷,通常在給定的不帶噪音的問題上,他能達到的最佳分類效果還是不如 SVM,邏輯回歸之類的。但是,我們實際面對的問題中,往往有很大的噪音,使得 Decision Tree 這個弱勢就不那么明顯了。而且,GBDT 通過不斷的疊加組合多個小的 Decision Tree,他在不帶噪音的問題上也能達到很好的分類效果。換句話說,通過GBDT訓練組合多個小的 Decision Tree 往往要比一次性訓練一個很大的 Decision Tree 的效果好很多。因此不能把 GBDT 理解為一顆大的決策樹,幾顆小樹經過疊加后就不再是顆大樹了,它比一顆大樹更強。