從引數空間到函式空間理解GBDT+XGBoost

weixin_34337265發表於2018-01-03

內容摘要

  • 泰勒公式
  • 最優化方法
    • 梯度下降法
    • 牛頓法
  • 從引數空間到函式空間
    • 從Gradient descend到Gradient boosting
    • 從Newton's method到Newton Boosting
  • Gradient boosting tree演算法原理
  • Newton Boosting演算法原理
  • LightGBM

泰勒公式

  1. 定義:是一個用函式在某點的資訊,描述其附近取值的公式。
  2. 基本形式:
    8166116-bff413e83ad340e5.png

    其中一階泰勒展開式就是求一階導,二階展開式即求二階導。x0為已知,公式表示f(x)在x0附近的展開。

  3. GDBT或是xgb都是一個引數迭代的過程,因此這裡表示一個迭代形式的泰勒函式:

    假設
    8166116-7c7c8d121dedba65.png

    將f(x^t) 在x^(t-1)處進行展開:
    8166116-ded1e8460d72a848.png

梯度下降法(Gradient Descend Method)

機器學習中需要最小化損失函式L(θ),這個θ就是要求解的模型引數。GDM常用於求解無約束最優化問題,是一種迭代方法。初始話θ為θ^0,不斷迭代來更新θ的值,進行損失函式的極小化。

  • 迭代公式 θ^t = θ^(t-1)+△θ
    進行一階泰勒展開:


    8166116-549b15c3ad21fba3.png

    要使得L(θ^t) < L(θ^(t-1)),則可取:


    8166116-d462e86ffb23b93f.png
  • 其中解釋一下為何△θ要取值為上式:首先明確,a的值為正,為了保證△θ恆為負數,則需要乘上L’(θ^t-1)先保證其為整數,再加上負號即可。
  • 其實a就是我們常用的學習速率
  • a如何選取?
    對於這個問題其實有很多方法可以使用,如果考慮使用full gradient較為笨但是精確的方法是line search,但是其複雜度過高,因此通常我們選取一個很小的值即可例如0.01-0.1之間。

牛頓法

牛頓法就是求取二階泰勒展開:
8166116-8d8672c8a24617f4.png

假設我們要求的引數θ是一維,則記一階導數為g,二階導數為h,那麼上式可表示為:


8166116-46d875989eb31438.png

此時若求取L(θ^t) 的極小值,則令g△θ+h△θ^2/2極小,求取其一階導數為0時的△θ即可:
8166116-cc4a874691ed7c03.png

8166116-4f32e9a5c30d3fa9.png

8166116-8ff6a97166193d2b.png

如果引數θ是向量形式,那麼可以向高維空間推廣,此時的h為H(海森矩陣)。


以上介紹的梯度下降和牛頓法均為引數空間的優化演算法
如何從引數空間推廣到函式空間呢?即從Gradient descend到Gradient boosting;從Newton's method到Newton Boosting
下面介紹GBDT和xgb中使用的函式空間的優化演算法,其基本原理還是梯度下降和牛頓法。
關係是這樣的:
GBDT泛指一切梯度提升樹,包括XGB。為了區分二者,可以利用其梯度下降的原理進行區分:

  • GBDT在函式空間中利用梯度下降進行優化
  • XGB在函式空間利用牛頓法進行優化

1. 梯度下降從引數空間到函式空間

8166116-2be323a79d9182dc.png

其中對於函式空間,僅僅是將引數的擬合換為函式的擬合,每次仍然迭代的是一個負梯度,只是其最終得到的是增量函式的累加而不是增量引數累加。
GBDT裡,迭代項ft(x)就是我們的決策樹,最終將每棵決策樹的預測值(函式)加起來。

2. 牛頓法從引數空間到函式空間

8166116-9f5c6668bae7aa17.png

對於牛頓法的函式空間優化,其方法類似於梯度下降的函式空間優化

3. boosting演算法小結
無論是梯度下降還是牛頓法,其函式空間上的boosting優化模型都看作是一類加法模型,相加的物件可以是一系列弱分類器或是迴歸樹。

4. 牛頓法小結
牛頓法是梯度下降的進一步優化,梯度下降利用目標函式的一階偏導資訊,以負梯度方向作為搜尋方向,只考慮目標函式在迭代點的區域性性質;而牛頓法不僅使用目標函式的一階偏導數,還進一步利用了目標函式的二階偏導,這樣就考慮了梯度變化的趨勢,因而能更全面地確定合適的搜尋方向以加快收斂。


GBDT原理分析

GBDT最早由Friedman提出,其核心是擬合前面迭代所留下來的殘差,使其達到最小。

  • 模型F定義為一個加法模型:


    8166116-1575cf2c7dfdfecc.png

其中x為輸入樣本,h為分類迴歸樹,w是分類迴歸樹的引數,a是每棵樹的權重。

  • 通過最小化損失函式求解最優模型:


    8166116-bacd214258489c4f.png
  • GBDT原是論文的演算法虛擬碼:


    8166116-b9a7e8720a4e963a.png

演算法的輸入(xi,yi)分別是樣本和lable,T為樣本個數,L為損失函式

  • GBDT的學習過程是使得前面擬合的殘差達到最小,那麼首先計算殘差,即演算法中的2.1步,也稱為響應。
  • 接著學習第t棵樹時就是尋找最新的殘差的最小值。可以看到lable yi變成了前t-1棵樹的殘差值。
    然後尋找合適的步長(通常情況,不使用line search,而是手動給一個很小的值)
    最後將第t棵樹與前t-1棵樹加起來,更新模型即可。

XGBoost原理

  • 模型的函式形式


    8166116-90671b6bf9dd7377.png

xgb同樣是一個加性模型,同樣是在學習多棵樹的結果並將其累加。f(x)就是每一棵樹。其中q(x)表示將樣本x分到了某個葉子節點上,w是葉子節點的分數,所以wq(x)就表示迴歸樹對樣本的預測值。

  • 迴歸樹的預測輸出是一個實數的分數,因此可以用於迴歸和分類,以及排序等任務。

目標函式

  • 首先回憶一下引數空間的目標函式:


    8166116-cdc0250917252510.png

    實際上就是一個誤差函式+正則化項

其中誤差函式可以是平方誤差或是對數誤差等;正則化項可以是L1或L2

  • 正則化項
8166116-7546efd9bfdcf202.png

wepon大神說道,正則化項的理解可以從貝葉斯先驗角度去理解。也就是說,如果引入L2,那麼就是假設模型引數服從正態分佈(相當於對引數加上了分佈約束),這樣一來就將引數的取值進行一定的限制,同時可以知道,正態分佈取0附近的概率最大,因此又將引數空間可能的範圍進一步縮小,模型最終學習出來的引數取值都在0附近。

  • 現在來看函式空間的目標函式


    8166116-adae1bf9269449df.png

其中正則化項是對每一棵樹的複雜度進行懲罰。
相比於GBDT,xgb目標函式就是多了一個正則化項。這樣的做法使得模型不易過擬合。
既然是對複雜度做懲罰,那麼樹的什麼特性可以反映複雜度?

  • 樹的深度、內部節點個數、葉子節點個數,葉節點分數
    xgb中選用了葉子節點個數(T),葉節點分數(w)來反映樹的複雜度,其複雜度定義如下:
    8166116-05f7467e0a05c87f.png

看完正則化項後再來關心一下目標函式中的誤差函式


8166116-89c65fcc58658d3a.png
  • 首先模型第t次迭代後將ft(x)與前t次的迭代結果進行相加,並代入目標函式,即式2,然後將誤差項在yt-1處進行二階展開,然後去掉常數項得到:


    8166116-9d6641fae6686be6.png

    上面這個形式跟牛頓法的形式幾乎一樣,由於f在函式空間中是一個樹的形式,則將f寫為樹的結構:
    8166116-63313c231eae2e4c.png

    代入目標函式中得到:
    8166116-9f1614aa6a675ff3.png

    雖然現在loss函式可以求最小值了,但是公式的兩項並不統一,即:
    8166116-0f1982c4646e126b.png

    如何將兩項進行統一以方便求導呢?因為樣本都會落在每一個節點上面,因此可以定義如下:
    8166116-9ba2e33fc10882c3.png

    對每一個樣本都相應有一個gi和hi。從最終的公式可以看到,由於是按照葉子節點進行累加,所以相當於每一個葉子節點均有一個誤差函式,都要進行相應的誤差計算。
    根據轉換後的損失函式,就可以求極小值了,前提是樹結構確定:
    8166116-da2dc1d9200ec81f.png
    相當於每一棵樹的最小損失都可以計算了。

既然前提是需要樹結構確定,那麼如何確定樹的結構?即如何確定樹節點的分裂方法?

  1. 可以暴力列舉全部的樹結構然後選擇損失最小的結構即可。明顯是一個NP問題。不現實!
  2. 貪心法:每次嘗試分裂一個葉節點,計算前後增益,選擇增益最大的保留。

    那麼增益如何計算?
    8166116-c100ef8eed266a8e.png
  • xgb增益計算方法的演進:
  1. 初始版本:
    8166116-bc2d95f32d4a2d50.png

    這樣的方法相當於去遍歷所有可能分割的分割點,然後計算增益,最後選取最大的增益的分列方式去分割,明顯負責度太高!!

  2. 近似演算法:
    對於每一個特徵,只考慮分位點,以減少複雜度,分位點的選取粒度有兩種:全域性global和區域性local。全域性速度快但是經度降低。
    解釋一下:先將某特徵的特徵值從小到大排序,再選取分位點進行計算增益即可。
    8166116-7bc59a670362487f.png

    3. xgb中採用的樹節點分裂方法(增益計算)
    8166116-9dd1076ae5771453.png

    如何看權重分位點的選取呢?上圖中前六個特徵值的權重之和為0.6,7-8的權重和為0.6,最後一個為0.6,就這選取權重之和相同的點來進行分位點的選取,然後再計算增益。

內容參考wepon大神天池直播

相關文章