GBDT-梯度提升决策树的一些思考
前言
最近筆者工作中用到了GBRank模型[1],其中用到了GBDT梯度提升決策樹,原論文的原文并不是很容易看懂,在本文紀錄下GBDT的一些原理和個人理解,作為筆記。如有謬誤請聯系指出,本文遵守 CC 4.0 BY-SA 版權協議,轉載請聯系作者并注明出處,謝謝。
?\nabla? 聯系方式:
e-mail: FesianXu@gmail.com
QQ: 973926198
github: https://github.com/FesianXu
知乎專欄: 計算機視覺/計算機圖形理論與應用
微信公眾號:
梯度提升決策樹(Gradient Boost Decision Tree,GBDT)是一種通過梯度提升策略去提高決策樹性能表現的一種樹模型設計思想,本文集中討論的是GBDT在回歸中的應用。對于一個數據集D={xi,yi}i=1,?,N\mathcal{D}=\{\mathbf{x}_i,y_i\}_{i=1,\cdots,N}D={xi?,yi?}i=1,?,N?而言,xi∈Rd,yi∈R\mathbf{x}_i \in \mathbb{R}^ze8trgl8bvbq, y_i \in \mathbb{R}xi?∈Rd,yi?∈R為第iii個樣本的特征和輸出目標值,我們期望學習到一個模型f(?)f(\cdot)f(?),有yi=f(xi)y_i = f(\mathbf{x}_i)yi?=f(xi?)。在GBDT中,我們用加性模型(additive model)去對這個模型建模,也即是有:
f(xi)=f0(xi)+∑k=1Kαkfk(xi)(1)f(\mathbf{x}_i) = f_0(\mathbf{x}_i)+\sum_{k=1}^{K}\alpha_k f_k(\mathbf{x}_i) \tag{1} f(xi?)=f0?(xi?)+k=1∑K?αk?fk?(xi?)(1)
其中的fk(?),k=0,?,Kf_{k}(\cdot), k=0,\cdots,Kfk?(?),k=0,?,K為基礎子模型(base model),在GBDT中使用CART決策樹作為這個基礎子模型。假設得到了fk?1(xi)f_{k-1}(\mathbf{x}_i)fk?1?(xi?)的情況下,我們期望通過CART樹模型,學習到一個hk(xi)h_k(\mathbf{x}_i)hk?(xi?),使得有式子(2)表示的loss最小,那么就可以更新模型到fk(?)f_{k}(\cdot)fk?(?)了:
∑i=1NL(yi,fk(xi))=∑i=1NL(yi,fk?1(xi)+hk(xi))(2)\sum_{i=1}^N \mathcal{L}(y_i, f_k(\mathbf{x}_i)) = \sum_{i=1}^{N} \mathcal{L}(y_i, f_{k-1}(\mathbf{x}_i)+h_{k}(\mathbf{x}_i)) \tag{2} i=1∑N?L(yi?,fk?(xi?))=i=1∑N?L(yi?,fk?1?(xi?)+hk?(xi?))(2)
那么我們要如何去更新模型,以及取得最初始的f0(?)f_0(\cdot)f0?(?)呢?我們先看一個例子,如Fig 1所示,藍色點表示若干樣本點,現在希望GBDT模型可以擬合這些樣本點,從直觀上,我們的初始值考慮需要和所有樣本的loss之和最小,也就是:
f0(x)=arg?min?c∑i=1NL(yi,c)(3)f_0(\mathbf{x}) = \arg\min_{c} \sum_{i=1}^N \mathcal{L}(y_i, c) \tag{3} f0?(x)=argcmin?i=1∑N?L(yi?,c)(3)
當損失函數為MSE函數時,也即是L(x,y)=12(x?y)2\mathcal{L}(x,y) = \dfrac{1}{2}(x-y)^2L(x,y)=21?(x?y)2時,我們通過求導的方法可以求得式子(3)的最優解為:
c=1N∑i=1Nyi(4)c = \dfrac{1}{N}\sum_{i=1}^N y_i \tag{4} c=N1?i=1∑N?yi?(4)
也即是所有待回歸值的均值,如Fig 1中的綠色虛線所示。這一點也很容易理解,在不知道其他任何信息量時,初始化選擇數據集待回歸值的中心時可能導致偏差可能性最小的。
接下來我們得考慮如何去更新模型,在得到了fk?1(x)f_{k-1}(\mathbf{x})fk?1?(x)之后,擬合并不是完美的,和最終目標yiy_iyi?仍然有偏差,這個偏差就是L(yi,fk?1(x))\mathcal{L}(y_i, f_{k-1}(\mathbf{x}))L(yi?,fk?1?(x)),為了讓模型更新方向操作縮小這個偏差的方向行進,我們可以借助負梯度方向更新的方法。首先我們得求出此時偏差的負梯度:
rki=??L(yi,fk?1(xi))?fk?1(xi)(5)r_{ki} = -\dfrac{\partial\mathcal{L}(y_i, f_{k-1}(\mathbf{x}_i))}{\partial f_{k-1}(\mathbf{x}_i)} \tag{5} rki?=??fk?1?(xi?)?L(yi?,fk?1?(xi?))?(5)
然而,式子(5)有個小問題,一個函數如何對一個函數求導數呢,我們之前接觸的都是一個函數對其中一個變量求導數。其實這個倒也不難,因為對于函數的每個輸入而言,都會輸出一個值(對于單值函數而已),因此我們可以把函數看成是一個無限維的向量,向量的每一個維度都是對應輸入的函數輸出,如f(x)=[v0,?,vn]∈R∞f(x) = [v_0,\cdots,v_n] \in \mathbb{R}^{\infty}f(x)=[v0?,?,vn?]∈R∞。在樣本有限的情況下,比如只有NNN個,那么我們可以用NNN維向量去近似表示這個函數。回歸到我們的原問題,我們的fk?1(x)f_{k-1}(\mathbf{x})fk?1?(x)其實可以表示為NNN個樣本的向量輸出表示,為fk?1(x)=[v0,?,vN]∈RNf_{k-1}(\mathbf{x}) = [v_0,\cdots,v_N] \in \mathbb{R}^{N}fk?1?(x)=[v0?,?,vN?]∈RN,那么對函數求導的問題就變成對向量求導了。如果損失函數是MSE函數,那么我們可以求得其梯度為:
?L(yi,fk?1(xi))?fk?1(xi)=fk?1(xi)?yi(6)\dfrac{\partial\mathcal{L}(y_i, f_{k-1}(\mathbf{x}_i))}{\partial f_{k-1}(\mathbf{x}_i)} = f_{k-1}(\mathbf{x}_i)-y_i \tag{6} ?fk?1?(xi?)?L(yi?,fk?1?(xi?))?=fk?1?(xi?)?yi?(6)
但是!我們注意到這個梯度計算得并不準確,因為我們只能用到能夠觀察到的NNN個訓練樣本去估計梯度,這個梯度對于未知樣本而言是不置信的。如Fig 2所示,黃色點是通過有限的NNN個樣本估計出來的NNN個梯度,而虛線才是實際梯度函數,因此我們需要用某種方式從有限個樣本中估計出梯度函數,在GBDT中采用了CART樹模型去進行這個操作。也即是說,通過樹模型hk(x)h_{k}(\mathbf{x})hk?(x)去擬合G={xi,rki},i=1,?,N\mathcal{G} = \{\mathbf{x}_i, r_{ki}\}, i=1,\cdots,NG={xi?,rki?},i=1,?,N。在損失函數為MSE函數的情況下,我們發現其實就是在擬合前k?1k-1k?1模型所造成的誤差,如式子(6)所示。
注意到得到的CART樹模型hk(x)h_{k}(\mathbf{x})hk?(x),對于每個輸入的樣本xi\mathbf{x}_ixi?其最終都會歸結為某端的某個葉子節點,也即是預測梯度值,我們用RkjR_{kj}Rkj?表示第kkk個回歸樹的第jjj個葉子節點,其中j=1,?,Jj=1,\cdots,Jj=1,?,J,JJJ為葉子節點的數量。這樣不夠準確,應該很可能不同的樣本貢獻同一個預估的梯度值,如Fig 3所示,對于屬于某個集合S\mathcal{S}S的樣本xi\mathbf{x}_ixi?來說,可能CART樹hk(?)h_k(\cdot)hk?(?)會將其歸為同一個葉子節點Rkj∣j=j0R_{kj}|_{j=j_{0}}Rkj?∣j=j0??,此時樹模型其實起到的作用跟類似與聚類,如Fig 1所示就可以發現有明顯的三個聚類簇。對于不同的聚類簇,其需要“彌補”以減少與待回歸值之前差別的值ckjc_{kj}ckj?是不同的,我們同樣可以求最小值的方法求得,如:
ckj=arg?min?c∑xi∈RkjL(yi,fk?1(xi)+c)(7)c_{kj} = \arg\min_{c} \sum_{\mathbf{x}_i \in R_{kj}} \mathcal{L}(y_i, f_{k-1}(\mathbf{x}_i)+c) \tag{7} ckj?=argcmin?xi?∈Rkj?∑?L(yi?,fk?1?(xi?)+c)(7)
這個式子一眼并不容易看懂,式子(7)其實是對于被CART回歸樹hk(?)h_k(\cdot)hk?(?)歸為同一葉子節點的樣本進行處理,對于同一類的樣本xi\mathbf{x}_ixi?而言(也即是xi∈Rkj\mathbf{x}_i \in R_{kj}xi?∈Rkj?),我們通過Linear Search的方法求得了對于該類的ccc,使得fk?1(x)+cf_{k-1}(\mathbf{x})+cfk?1?(x)+c之后使得損失最小,這就是式子(7)的含義。這個過程同樣可以通過求導的方式進行最優化求解,假如損失函數為MSE函數,那么我們可以求得:
ckj=1∣i:xi∈Rkj∣∑xi∈Rkj(yi?fk?1(xi))(8)c_{kj} = \dfrac{1}{|{i:\mathbf{x}_i \in R_{kj}}|} \sum_{\mathbf{x}_i \in R_{kj}} (y_i-f_{k-1}(\mathbf{x}_i)) \tag{8} ckj?=∣i:xi?∈Rkj?∣1?xi?∈Rkj?∑?(yi??fk?1?(xi?))(8)
其中的∣i:xi∈Rkj∣|{i:\mathbf{x}_i \in R_{kj}}|∣i:xi?∈Rkj?∣是求得該類樣本的數量,以便于做歸一化。
此時我們便有:
hk(x)=∑j=1JckjI(x∈Rkj)(9)h_k(\mathbf{x}) = \sum_{j=1}^{J} c_{kj} I(\mathbf{x} \in R_{kj}) \tag{9} hk?(x)=j=1∑J?ckj?I(x∈Rkj?)(9)
I(?)I(\cdot)I(?)表示其中條件滿足時,返回1,否則返回0。因此本輪的最終更新的回歸函數為:
fk(x)=fk?1(x)+hk(x)(10)f_k(\mathbf{x}) = f_{k-1}(\mathbf{x})+h_k(\mathbf{x}) \tag{10} fk?(x)=fk?1?(x)+hk?(x)(10)
對于k=1,?,Kk=1,\cdots,Kk=1,?,K我們不停地迭代計算,可以求得最終的回歸函數為:
f(x)=fK(x)=f0(x)+∑k=1K∑j=1JckjI(x∈Rkj)(11)f(\mathbf{x})=f_{K}(\mathbf{x}) = f_0(\mathbf{x})+\sum_{k=1}^{K}\sum_{j=1}^{J} c_{kj} I(\mathbf{x} \in R_{kj}) \tag{11} f(x)=fK?(x)=f0?(x)+k=1∑K?j=1∑J?ckj?I(x∈Rkj?)(11)
這也就是加性模型(1)的另一種表現形式而已。
因此,如果當損失函數為MSE函數時,可以表現為是用多棵CART樹模型對殘差的不斷擬合,但是如果當損失函數不是MSE時,則不能這樣解釋。
Reference
[1]. Zheng, Z., Chen, K., Sun, G., & Zha, H. (2007, July). A regression framework for learning ranking functions using relative relevance judgments. In Proceedings of the 30th annual international ACM SIGIR conference on Research and development in information retrieval (pp. 287-294).
總結
以上是生活随笔為你收集整理的GBDT-梯度提升决策树的一些思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bezier曲线与B-Spline曲线
- 下一篇: [分享] Ken Lunde《中日韓越資