1. 程式人生 > >理解GBDT演算法(三)——基於梯度的版本

理解GBDT演算法(三)——基於梯度的版本

上一篇中我們講到了GBDT演算法的第一個版本,是基於殘差的學習思路。今天來說第二個版本,可以說這個版本的比較複雜,涉及到一些推導和矩陣論知識。但是,我們今天可以看到,兩個版本之間的聯絡,這個是學習演算法的一個重要步驟。

這篇博文主要從下面這幾個方面來說基於梯度的GBDT演算法:
(1)演算法的基本步驟;
(2)其中的學數學推導;
(3)基於梯度的版本和基於殘差的版本之間的聯絡;

在講解演算法的詳細步驟之前,我們可以先明確一個思路,就是梯度版本的GBDT是用多類分類Multi-class classification 的思想來實現的,或者可以說GBDT的這個版本融入到多類分類中可以更好的掌握。

1. 演算法的基本步驟

首先網上很多講解部落格都會出現下面這個圖:
這裡寫圖片描述
那麼也就是說梯度版的GBDT的演算法主要有8個步驟。
(0)初始化所有樣本在K個類別上的估計值。
F_k(x)是一個矩陣,我們可以初始化為全0,也可以隨機設定。如下:
這裡寫圖片描述
上面的矩陣中,我們假設有N=8個樣本,每個樣本可能會屬於K=5個類別中的一個,其中估計值矩陣F初始化為0.
除此之外,這8個訓練樣本都是帶著類別標籤的,例如:
這裡寫圖片描述
說明第i=1個樣本是屬於第3類的。

(1)迴圈下面的學習更新過程M次;

(2)對沒有樣本的函式估計值做logistic變換。
我們在前面介紹Logistic迴歸的時候提到,Logistic函式一個重要的特性就是可以轉換為0~1之間的概率值,我們通過下面的變換公式就可以把樣本的估計值轉換為該樣本屬於某一類的概率是多少:
這裡寫圖片描述


可以看到樣本初始的時候每個類別的估計值都是0,屬於類別的概率也是相等的,不過,隨著後面的不斷更新,其估計值不一樣了,概率自然也就差別開來。
比如下面:
這裡寫圖片描述

(3)遍歷所有樣本的每個類別的概率
這一步需要注意,遍歷的是每個類別,而不是所有樣本。如下:
這裡寫圖片描述
為什麼這裡是按照類別逐個學習呢?因為後面需要給每個類別k學習出一個迴歸樹。

(4)求每個樣本在第k類上概率梯度
上面一步中,我們有了許多個樣本屬於某個類別k的概率,以及它們是否真正屬於類別k的概率(這些樣本都是訓練樣本,所以它們是否屬於某個類別都是已知的,概率為0/1)。那麼這個就是一個典型的迴歸問題。我們當然可以用迴歸樹的演算法來求解(注,這裡就是多類分類問題和GBDT聯絡的關鍵)。


我們通過常見的建立代價函式,並求導的梯度下降法來學習。代價函式是對數似然函式的形式為:
這裡寫圖片描述
對這個代價函式的求導,我們可以得到:
這裡寫圖片描述
(詳細的推導過程下一節給出)
有沒有發現這裡的求導得到的梯度形式居然是殘差的形式:第i個樣本屬於第k個類別的殘差 = 真實的概率 - 估計的概率。
這一步也是殘差版本和梯度版本的聯絡。
這些的梯度也是下面我們構建迴歸樹的學習方向。

(5)沿著梯度方法學習到J個葉子結點的迴歸樹
學習的虛擬碼:
這裡寫圖片描述
我們輸入所有樣本xi, i = 1~N, 以及每個樣本在第k個類別上概率的殘差作為更新方向,我們學習到有J個葉子的迴歸樹。學習的基本過程和迴歸樹類似:遍歷樣本的特徵維數,選擇一個特徵作為分割點,需要滿足最小均方差的原則,或者滿足【左子樹樣本目標值(殘差)和的平方均值+右子樹樣本目標值(殘差)和的平方均值-父結點所有樣本目標值(殘差)和的平方均值】最大的準則,一旦學習到J個葉子結點,我們就停止學習。結果是該回歸樹中每個葉子上都會有許多個樣本分佈在上面。
記住:每個葉子上的樣本,既有自己屬於類別k的估計概率,也有真實概率,因為後面求增益需要用到它們。

(6)求每個葉子結點的增益
每個結點的增益計算公式為:
這裡寫圖片描述
注意後標,每個葉子結點j都有一個增益值(不是向量,是值)。計算的時候需要用到該葉子結點上的所有樣本的梯度。
換句話說,每個葉子結點都可以計算出一個增益值,記住是值啊!

(7)更新所有樣本在第k類下的估計值
上一步中求得的增益是基於梯度計算得到的,而且前面說到的梯度和殘差有一定的關聯,我們可以利用這個增益更新樣本的估計值。
這裡寫圖片描述
第m次迭代中的第k類下,所有樣本的估計值F可以通過上次迭代m-1中,這些樣本的估計值+增益向量求得。注意,這個增益向量需要把所有的J個葉子結點的增益值求和,然後和向量1相乘,而得。
也就是我們上面講的,第k類的所有樣本的估計值是一列:
這裡寫圖片描述
也就是按列更新,前面有對類別數k的迴圈,所以每一類(每一列)的估計值都可以更新。一定記住是按列更新,每一類(每一列)都建立一個迴歸樹來更新下去,最後原始的K類的N個樣本的估計值矩陣都更新了一遍,帶著這個新的估計值矩陣,我們進入下次m+1次的迭代學習。

如此,迭代學習M次之後,我們可以得到最終的所有樣本在所有類別下的估計值矩陣,基於這個估計值矩陣,我們可以實現多類分類。

這樣,基於梯度版本的GBDT演算法的所有詳細步驟我們都說完了。

2. 公式推導

上面建立的代價函式是對數似然函式的形式:
這裡寫圖片描述
對這個代價函式的求導,我們可以得到:
這裡寫圖片描述
那麼其中的詳細推導過程是什麼呢?
這裡寫圖片描述
其中涉及到對數函式的求導,主要是最後一步,yi是樣本屬於第k類的真實概率,故yi就是0/1數,而且K個類別中只可能屬於一個類別,也就是說只有一個yi是1,其餘全是0,所以有最後一步推導結果。

3. 兩個版本之間的聯絡

前面我們提到的一些聯絡,這兒再總結一下:

  • 基於殘差的版本四把殘差作為全域性方向,偏向於迴歸的應用。而基於梯度的版本是把代價函式的梯度方向作為更新的方向,適用範圍更廣。
  • 如果使用Logistic函式作為代價函式,那麼其梯度形式和殘差的形式類似,這個就說明兩個版本之間是緊密聯絡的,雖然實現的思路不同,但是總體的目的是一樣的。或者說殘差版本是梯度版本的一個特例,當代價函式換成其餘的函式,梯度的版本仍是適用的。