推薦系統知識梳理——GBDT&LR

越前浩波 發表於 2020-10-30

1. GBDT+LR簡介

前面介紹的協同過濾和矩陣分解存在的劣勢就是僅利用了使用者與物品相互行為資訊進行推薦, 忽視了使用者自身特徵, 物品自身特徵以及上下文資訊等,導致生成的結果往往會比較片面。 而這次介紹的這個模型是2014年由Facebook提出的GBDT+LR模型, 該模型利用GBDT自動進行特徵篩選和組合, 進而生成新的離散特徵向量, 再把該特徵向量當做LR模型的輸入, 來產生最後的預測結果, 該模型能夠綜合利用使用者、物品和上下文等多種不同的特徵, 生成較為全面的推薦結果, 在CTR點選率預估場景下使用較為廣泛。

下面首先會介紹邏輯迴歸和GBDT模型各自的原理及優缺點, 然後介紹GBDT+LR模型的工作原理和細節。

2. 邏輯迴歸模型

邏輯迴歸模型非常重要, 在推薦領域裡面, 相比於傳統的協同過濾, 邏輯迴歸模型能夠綜合利用使用者、物品、上下文等多種不同的特徵生成較為“全面”的推薦結果, 關於邏輯迴歸的更多細節, 可以參考下面給出的連結,這裡只介紹比較重要的一些細節和在推薦中的應用。

邏輯迴歸是線上性迴歸的基礎上加了一個 Sigmoid 函式(非線形)對映,使得邏輯迴歸成為了一個優秀的分類演算法, 學習邏輯迴歸模型, 首先應該記住一句話:邏輯迴歸假設資料服從伯努利分佈,通過極大化似然函式的方法,運用梯度下降來求解引數,來達到將資料二分類的目的。

相比於協同過濾和矩陣分解利用使用者的物品“相似度”進行推薦, 邏輯迴歸模型將問題看成了一個分類問題, 通過預測正樣本的概率對物品進行排序。這裡的正樣本可以是使用者“點選”了某個商品或者“觀看”了某個視訊, 均是推薦系統希望使用者產生的“正反饋”行為, 因此邏輯迴歸模型將推薦問題轉化成了一個點選率預估問題。而點選率預測就是一個典型的二分類, 正好適合邏輯迴歸進行處理, 那麼邏輯迴歸是如何做推薦的呢? 過程如下:

  1. 將使用者年齡、性別、物品屬性、物品描述、當前時間、當前地點等特徵轉成數值型向量
  2. 確定邏輯迴歸的優化目標,比如把點選率預測轉換成二分類問題, 這樣就可以得到分類問題常用的損失作為目標, 訓練模型
  3. 在預測的時候, 將特徵向量輸入模型產生預測, 得到使用者“點選”物品的概率
  4. 利用點選概率對候選物品排序, 得到推薦列表

推斷過程可以用下圖來表示:

這裡的關鍵就是每個特徵的權重引數 w w w, 我們一般是使用梯度下降的方式, 首先會先隨機初始化引數 w w w, 然後將特徵向量(也就是我們上面數值化出來的特徵)輸入到模型, 就會通過計算得到模型的預測概率, 然後通過對目標函式求導得到每個 w w w的梯度, 然後進行更新 w w w

這裡的目標函式長下面這樣:

J ( w ) = − 1 m ( ∑ i = 1 m ( y i log ⁡ f w ( x i ) + ( 1 − y i ) log ⁡ ( 1 − f w ( x i ) ) ) J(w)=-\frac{1}{m}\left(\sum_{i=1}^{m}\left(y^{i} \log f_{w}\left(x^{i}\right)+\left(1-y^{i}\right) \log \left(1-f_{w}\left(x^{i}\right)\right)\right)\right. J(w)=m1(i=1m(yilogfw(xi)+(1yi)log(1fw(xi))) 求導之後的方式長這樣: w j ← w j − γ 1 m ∑ i = 1 m ( f w ( x i ) − y i ) x j i w_{j} \leftarrow w_{j}-\gamma \frac{1}{m} \sum_{i=1}^{m}\left(f_{w}\left(x^{i}\right)-y^{i}\right) x_{j}^{i} wjwjγm1i=1m(fw(xi)yi)xji 這樣通過若干次迭代, 就可以得到最終的 w w w了, 關於這些公式的推導,可以參考下面給出的文章連結, 下面我們分析一下邏輯迴歸模型的優缺點。

優點:

  1. LR模型形式簡單,可解釋性好,從特徵的權重可以看到不同的特徵對最後結果的影響。
  2. 訓練時便於並行化,在預測時只需要對特徵進行線性加權,所以效能比較好,往往適合處理海量id類特徵,用id類特徵有一個很重要的好處,就是防止資訊損失(相對於範化的 CTR 特徵),對於頭部資源會有更細緻的描述
  3. 資源佔用小,尤其是記憶體。在實際的工程應用中只需要儲存權重比較大的特徵及特徵對應的權重。
  4. 方便輸出結果調整。邏輯迴歸可以很方便的得到最後的分類結果,因為輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cutoff,也就是劃分閾值(大於某個閾值的是一類,小於某個閾值的是一類)

當然, 邏輯迴歸模型也有一定的侷限性

  1. 表達能力不強, 無法進行特徵交叉, 特徵篩選等一系列“高階“操作(這些工作都得人工來幹, 這樣就需要一定的經驗, 否則會走一些彎路), 因此可能造成資訊的損失
  2. 準確率並不是很高。因為這畢竟是一個線性模型加了個sigmoid, 形式非常的簡單(非常類似線性
  3. 處理非線性資料較麻煩。邏輯迴歸在不引入其他方法的情況下,只能處理線性可分的資料, 如果想處理非線性, 首先對連續特徵的處理需要先進行離散化(離散化的目的是為了引入非線性),如上文所說,人工分桶的方式會引入多種問題。
  4. LR 需要進行人工特徵組合,這就需要開發者有非常豐富的領域經驗,才能不走彎路。這樣的模型遷移起來比較困難,換一個領域又需要重新進行大量的特徵工程。

所以如何自動發現有效的特徵、特徵組合,彌補人工經驗不足,縮短LR特徵實驗週期,是亟需解決的問題, 而GBDT模型, 正好可以自動發現特徵並進行有效組合

3. GBDT模型

GBDT全稱梯度提升決策樹,在傳統機器學習演算法裡面是對真實分佈擬合的最好的幾種演算法之一,在前幾年深度學習還沒有大行其道之前,gbdt在各種競賽是大放異彩。原因大概有幾個,一是效果確實挺不錯。二是即可以用於分類也可以用於迴歸。三是可以篩選特徵, 所以這個模型依然是一個非常重要的模型。

GBDT是通過採用加法模型(即基函式的線性組合),以及不斷減小訓練過程產生的誤差來達到將資料分類或者回歸的演算法, 其訓練過程如下:
gbdt通過多輪迭代, 每輪迭代會產生一個弱分類器, 每個分類器在上一輪分類器的殘差基礎上進行訓練。 gbdt對弱分類器的要求一般是足夠簡單, 並且低方差高偏差。 因為訓練的過程是通過降低偏差來不斷提高最終分類器的精度。 由於上述高偏差和簡單的要求,每個分類迴歸樹的深度不會很深。最終的總分類器是將每輪訓練得到的弱分類器加權求和得到的(也就是加法模型)。

關於GBDT的詳細細節,依然是可以參考下面給出的連結。這裡想分析一下GBDT如何來進行二分類的,因為我們要明確一點就是gbdt 每輪的訓練是在上一輪的訓練的殘差基礎之上進行訓練的, 而這裡的殘差指的就是當前模型的負梯度值, 這個就要求每輪迭代的時候,弱分類器的輸出的結果相減是有意義的, 而gbdt 無論用於分類還是迴歸一直都是使用的CART 迴歸樹, 那麼既然是迴歸樹, 是如何進行二分類問題的呢?

GBDT 來解決二分類問題和解決迴歸問題的本質是一樣的,都是通過不斷構建決策樹的方式,使預測結果一步步的接近目標值, 但是二分類問題和迴歸問題的損失函式是不同的, 關於GBDT在迴歸問題上的樹的生成過程, 損失函式和迭代原理可以參考給出的連結, 迴歸問題中一般使用的是平方損失, 而二分類問題中, GBDT和邏輯迴歸一樣, 使用的下面這個:

L = arg ⁡ min ⁡ [ ∑ i n − ( y i log ⁡ ( p i ) + ( 1 − y i ) log ⁡ ( 1 − p i ) ) ] L=\arg \min \left[\sum_{i}^{n}-\left(y_{i} \log \left(p_{i}\right)+\left(1-y_{i}\right) \log \left(1-p_{i}\right)\right)\right] L=argmin[in(yilog(pi)+(1yi)log(1pi))] 其中, y i y_i yi是第 i i i個樣本的觀測值, 取值要麼是0要麼是1, 而 p i p_i pi是第 i i i個樣本的預測值, 取值是0-1之間的概率,由於我們知道GBDT擬合的殘差是當前模型的負梯度, 那麼我們就需要求出這個模型的導數, 即 d L d p i \frac{dL}{dp_i} dpidL, 對於某個特定的樣本, 求導的話就可以只考慮它本身, 去掉加和號, 那麼就變成了 d l d p i \frac{dl}{dp_i} dpidl, 其中 l l l如下: l = − y i log ⁡ ( p i ) − ( 1 − y i ) log ⁡ ( 1 − p i )   = − y i log ⁡ ( p i ) − log ⁡ ( 1 − p i ) + y i log ⁡ ( 1 − p i )   = − y i ( log ⁡ ( p i 1 − p i ) ) − log ⁡ ( 1 − p i ) \begin{aligned} l &=-y_{i} \log \left(p_{i}\right)-\left(1-y_{i}\right) \log \left(1-p_{i}\right) \ &=-y_{i} \log \left(p_{i}\right)-\log \left(1-p_{i}\right)+y_{i} \log \left(1-p_{i}\right) \ &=-y_{i}\left(\log \left(\frac{p_{i}}{1-p_{i}}\right)\right)-\log \left(1-p_{i}\right) \end{aligned} l=yilog(pi)(1yi)log(1pi) =yilog(pi)log(1pi)+yilog(1pi) =yi(log(1pipi))log(1pi) 如果對邏輯迴歸非常熟悉的話, ( log ⁡ ( p i 1 − p i ) ) \left(\log \left(\frac{p_{i}}{1-p_{i}}\right)\right) (log(1pipi))一定不會陌生吧, 這就是對機率比取了個對數, 並且在邏輯迴歸裡面這個式子會等於 θ X \theta X θX, 所以才推出了 p i = 1 1 + e − θ X p_i=\frac{1}{1+e^-{\theta X}} pi=1+eθX1的那個形式。 這裡令 η i = p i 1 − p i \eta_i=\frac{p_i}{1-p_i} ηi=1pipi, 即 p i = η i 1 + η i p_i=\frac{\eta_i}{1+\eta_i} pi=1+ηiηi, 則上面這個式子變成了:

l = − y i log ⁡ ( η i ) − log ⁡ ( 1 − e log ⁡ ( η i ) 1 + e log ⁡ ( η i ) )   = − y i log ⁡ ( η i ) − log ⁡ ( 1 1 + e log ⁡ ( η i ) )   = − y i log ⁡ ( η i ) + log ⁡ ( 1 + e log ⁡ ( η i ) ) \begin{aligned} l &=-y_{i} \log \left(\eta_{i}\right)-\log \left(1-\frac{e^{\log \left(\eta_{i}\right)}}{1+e^{\log \left(\eta_{i}\right)}}\right) \ &=-y_{i} \log \left(\eta_{i}\right)-\log \left(\frac{1}{1+e^{\log \left(\eta_{i}\right)}}\right) \ &=-y_{i} \log \left(\eta_{i}\right)+\log \left(1+e^{\log \left(\eta_{i}\right)}\right) \end{aligned} l=yilog(ηi)log(11+elog(ηi)elog(ηi)) =yilog(ηi)log(1+elog(ηi)1) =yilog(ηi)+log(1+elog(ηi)) 這時候,我們對 l o g ( η i ) log(\eta_i) log(ηi)求導, 得 d l d log ⁡ ( η i ) = − y i + e log ⁡ ( η i ) 1 + e log ⁡ ( η i ) = − y i + p i \frac{d l}{d \log (\eta_i)}=-y_{i}+\frac{e^{\log \left(\eta_{i}\right)}}{1+e^{\log \left(\eta_{i}\right)}}=-y_i+p_i dlog(ηi)dl=yi+1+elog(ηi)elog(ηi)=yi+pi 這樣, 我們就得到了某個訓練樣本在當前模型的梯度值了, 那麼殘差就是 y i − p i y_i-p_i yipi。GBDT二分類的這個思想,其實和邏輯迴歸的思想一樣,邏輯迴歸是用一個線性模型去擬合 P ( y = 1 ∣ x ) P(y=1|x) P(y=1x)這個事件的對數機率 l o g p 1 − p = θ T x log\frac{p}{1-p}=\theta^Tx log1pp=θTx, GBDT二分類也是如此, 用一系列的梯度提升樹去擬合這個對數機率, 其分類模型可以表達為: P ( Y = 1 ∣ x ) = 1 1 + e − F M ( x ) P(Y=1 \mid x)=\frac{1}{1+e^{-F_{M}(x)}} P(Y=1x)=1+eFM(x)1

下面我們具體來看GBDT的生成過程, 構建分類GBDT的步驟有兩個:

初始化GBDT 和迴歸問題一樣, 分類 GBDT 的初始狀態也只有一個葉子節點,該節點為所有樣本的初始預測值,如下: F 0 ( x ) = arg ⁡ min ⁡ γ ∑ i = 1 n L ( y , γ ) F_{0}(x)=\arg \min {\gamma} \sum{i=1}^{n} L(y, \gamma) F0(x)=argminγi=1nL(y,γ) 上式裡面, F F F代表GBDT模型, F 0 F_0 F0是模型的初識狀態, 該式子的意思是找到一個 γ \gamma γ,使所有樣本的 Loss 最小,在這裡及下文中, γ \gamma γ都表示節點的輸出,即葉子節點, 且它是一個 l o g ( η i ) log(\eta_i) log(ηi) 形式的值(迴歸值),在初始狀態, γ = F 0 \gamma =F_0 γ=F0

​ 下面看例子(該例子來自下面的第二個連結), 假設我們有下面3條樣本:

我們希望構建 GBDT 分類樹,它能通過「喜歡爆米花」、「年齡」和「顏色偏好」這 3 個特徵來預測某一個樣本是否喜歡看電影。 我們把資料代入上面的公式中求Loss:
Loss ⁡ = L ( 1 , γ ) + L ( 1 , γ ) + L ( 0 , γ ) \operatorname{Loss}=L(1, \gamma)+L(1, \gamma)+L(0, \gamma) Loss=L(1,γ)+L(1,γ)+L(0,γ) 為了令其最小, 我們求導, 且讓導數為0, 則:

Loss ⁡ = p − 1 + p − 1 + p = 0 \operatorname{Loss}=p-1 + p-1+p=0 Loss=p1+p1+p=0 於是, 就得到了初始值 p = 2 3 = 0.67 , γ = l o g ( p 1 − p ) = 0.69 p=\frac{2}{3}=0.67, \gamma=log(\frac{p}{1-p})=0.69 p=32=0.67,γ=log(1pp)=0.69, 模型的初識狀態 F 0 ( x ) = 0.69 F_0(x)=0.69 F0(x)=0.69

  1. 迴圈生成決策樹 這裡回憶一下回歸樹的生成步驟, 其實有4小步, 第一就是計算負梯度值得到殘差, 第二步是用迴歸樹擬合殘差, 第三步是計算葉子節點的輸出值, 第四步是更新模型。 下面我們一一來看:

    • 計算負梯度得到殘差 r i m = − [ ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) ] F ( x ) = F m − 1 ( x ) r_{i m}=-\left[\frac{\partial L\left(y_{i}, F\left(x_{i}\right)\right)}{\partial F\left(x_{i}\right)}\right]{F(x)=F{m-1}(x)} rim=[F(xi)L(yi,F(xi))]F(x)=Fm1(x) 此處使用 m − 1 m-1 m1棵樹的模型, 計算每個樣本的殘差 r i m r_{im} rim, 就是上面的 y i − p i y_i-pi yipi, 於是例子中, 每個樣本的殘差:

    • 使用迴歸樹來擬合 r i m r_{im} rim, 這裡的 i i i表示樣本哈,迴歸樹的建立過程可以參考下面的連結文章,簡單的說就是遍歷每個特徵, 每個特徵下遍歷每個取值, 計算分裂後兩組資料的平方損失, 找到最小的那個劃分節點。 假如我們產生的第2棵決策樹如下:
      在這裡插入圖片描述

    • 對於每個葉子節點 j j j, 計算最佳殘差擬合值 γ j m = arg ⁡ min ⁡ γ ∑ x ∈ R i j L ( y i , F m − 1 ( x i ) + γ ) \gamma_{j m}=\arg \min {\gamma} \sum{x \in R_{i j}} L\left(y_{i}, F_{m-1}\left(x_{i}\right)+\gamma\right) γjm=argminγxRijL(yi,Fm1(xi)+γ) 意思是, 在剛構建的樹 m m m中, 找到每個節點 j j j的輸出 γ j m \gamma_{jm} γjm, 能使得該節點的loss最小。 那麼我們看一下這個 γ \gamma γ的求解方式, 這裡非常的巧妙。 首先, 我們把損失函式寫出來, 對於左邊的第一個樣本, 有 L ( y 1 , F m − 1 ( x 1 ) + γ ) = − y 1 ( F m − 1 ( x 1 ) + γ ) + log ⁡ ( 1 + e F m − 1 ( x 1 ) + γ ) L\left(y_{1}, F_{m-1}\left(x_{1}\right)+\gamma\right)=-y_{1}\left(F_{m-1}\left(x_{1}\right)+\gamma\right)+\log \left(1+e^{F_{m-1}\left(x_{1}\right)+\gamma}\right) L(y1,Fm1(x1)+γ)=y1(Fm1(x1)+γ)+log(1+eFm1(x1)+γ) 這個式子就是上面推導的 l l l, 因為我們要用迴歸樹做分類, 所以這裡把分類的預測概率轉換成了對數機率迴歸的形式, 即 l o g ( η i ) log(\eta_i) log(ηi), 這個就是模型的迴歸輸出值。而如果求這個損失的最小值, 我們要求導, 解出令損失最小的 γ \gamma γ。 但是上面這個式子求導會很麻煩, 所以這裡介紹了一個技巧就是使用二階泰勒公式來近似表示該式, 再求導, 還記得偉大的泰勒嗎? f ( x + Δ x ) ≈ f ( x ) + Δ x f ′ ( x ) + 1 2 Δ x 2 f ′ ′ ( x ) + O ( Δ x ) f(x+\Delta x) \approx f(x)+\Delta x f^{\prime}(x)+\frac{1}{2} \Delta x^{2} f^{\prime \prime}(x)+O(\Delta x) f(x+Δx)f(x)+Δxf(x)+21Δx2f(x)+O(Δx) 這裡就相當於把 L ( y 1 , F m − 1 ( x 1 ) ) L(y_1, F_{m-1}(x_1)) L(y1,Fm1(x1))當做常量 f ( x ) f(x) f(x) γ \gamma γ作為變數 Δ x \Delta x Δx, 將 f ( x ) f(x) f(x)二階展開: L ( y 1 , F m − 1 ( x 1 ) + γ ) ≈ L ( y 1 , F m − 1 ( x 1 ) ) + L ′ ( y 1 , F m − 1 ( x 1 ) ) γ + 1 2 L ′ ′ ( y 1 , F m − 1 ( x 1 ) ) γ 2 L\left(y_{1}, F_{m-1}\left(x_{1}\right)+\gamma\right) \approx L\left(y_{1}, F_{m-1}\left(x_{1}\right)\right)+L^{\prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right) \gamma+\frac{1}{2} L^{\prime \prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right) \gamma^{2} L(y1,Fm1(x1)+γ)L(y1,Fm1(x1))+L(y1,Fm1(x1))γ+21L(y1,Fm1(x1))γ2 這時候再求導就簡單了 d L d γ = L ′ ( y 1 , F m − 1 ( x 1 ) ) + L ′ ′ ( y 1 , F m − 1 ( x 1 ) ) γ \frac{d L}{d \gamma}=L^{\prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right)+L^{\prime \prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right) \gamma dγdL=L(y1,Fm1(x1))+L(y1,Fm1(x1))γ Loss最小的時候, 上面的式子等於0, 就可以得到 γ \gamma γ: γ 11 = − L ′ ( y 1 , F m − 1 ( x 1 ) ) L ′ ′ ( y 1 , F m − 1 ( x 1 ) ) \gamma_{11}=\frac{-L^{\prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right)}{L^{\prime \prime}\left(y_{1}, F_{m-1}\left(x_{1}\right)\right)} γ11=L(y1,Fm1(x1))L(y1,Fm1(x1)) 因為分子就是殘差(上述已經求到了), 分母可以通過對殘差求導,得到原損失函式的二階導: L ′ ′ ( y 1 , F ( x ) ) = d L ′ d log ⁡ ( η 1 )   = d d log ⁡ ( η 1 ) [ − y i + e log ⁡ ( η 1 ) 1 + e log ⁡ ( η 1 ) ]   = d d log ⁡ ( η 1 ) [ e log ⁡ ( η 1 ) ( 1 + e log ⁡ ( η 1 ) ) − 1 ]   = e log ⁡ ( η 1 ) ( 1 + e log ⁡ ( η 1 ) ) − 1 − e 2 log ⁡ ( η 1 ) ( 1 + e log ⁡ ( η 1 ) ) − 2   = e log ⁡ ( η 1 ) ( 1 + e log ⁡ ( η 1 ) ) 2   = η 1 ( 1 + η 1 ) 1 ( 1 + η 1 )   = p 1 ( 1 − p 1 ) \begin{aligned} L^{\prime \prime}\left(y_{1}, F(x)\right) &=\frac{d L^{\prime}}{d \log (\eta_1)} \ &=\frac{d}{d \log (\eta_1)}\left[-y_{i}+\frac{e^{\log (\eta_1)}}{1+e^{\log (\eta_1)}}\right] \ &=\frac{d}{d \log (\eta_1)}\left[e^{\log (\eta_1)}\left(1+e^{\log (\eta_1)}\right)^{-1}\right] \ &=e^{\log (\eta_1)}\left(1+e^{\log (\eta_1)}\right)^{-1}-e^{2 \log (\eta_1)}\left(1+e^{\log (\eta_1)}\right)^{-2} \ &=\frac{e^{\log (\eta_1)}}{\left(1+e^{\log (\eta_1)}\right)^{2}} \ &=\frac{\eta_1}{(1+\eta_1)}\frac{1}{(1+\eta_1)} \ &=p_1(1-p_1) \end{aligned} L(y1,F(x))=dlog(η1)dL =dlog(η1)d[yi+1+elog(η1)elog(η1)] =dlog(η1)d[elog(η1)(1+elog(η1))1] =elog(η1)(1+elog(η1))1e2log(η1)(1+elog(η1))2 =(1+elog(η1))2elog(η1) =(1+η1)η1(1+η1)1 =p1(1p1) 這時候, 就可以算出該節點的輸出: γ 11 = r 11 p 10 ( 1 − p 10 ) = 0.33 0.67 × 0.33 = 1.49 \gamma_{11}=\frac{r_{11}}{p_{10}\left(1-p_{10}\right)}=\frac{0.33}{0.67 \times 0.33}=1.49 γ11=p10(1p10)r11=0.67×0.330.33=1.49 這裡的下面 γ j m \gamma_{jm} γjm表示第 m m m棵樹的第 j j j個葉子節點。 接下來是右邊節點的輸出, 包含樣本2和樣本3, 同樣使用二階泰勒公式展開: L ( y 2 , F m − 1 ( x 2 ) + γ ) + L ( y 3 , F m − 1 ( x 3 ) + γ )   ≈ L ( y 2 , F m − 1 ( x 2 ) ) + L ′ ( y 2 , F m − 1 ( x 2 ) ) γ + 1 2 L ′ ′ ( y 2 , F m − 1 ( x 2 ) ) γ 2   + L ( y 3 , F m − 1 ( x 3 ) ) + L ′ ( y 3 , F m − 1 ( x 3 ) ) γ + 1 2 L ′ ′ ( y 3 , F m − 1 ( x 3 ) ) γ 2 \begin{array}{l} L\left(y_{2}, F_{m-1}\left(x_{2}\right)+\gamma\right)+L\left(y_{3}, F_{m-1}\left(x_{3}\right)+\gamma\right) \ \approx L\left(y_{2}, F_{m-1}\left(x_{2}\right)\right)+L^{\prime}\left(y_{2}, F_{m-1}\left(x_{2}\right)\right) \gamma+\frac{1}{2} L^{\prime \prime}\left(y_{2}, F_{m-1}\left(x_{2}\right)\right) \gamma^{2} \ +L\left(y_{3}, F_{m-1}\left(x_{3}\right)\right)+L^{\prime}\left(y_{3}, F_{m-1}\left(x_{3}\right)\right) \gamma+\frac{1}{2} L^{\prime \prime}\left(y_{3}, F_{m-1}\left(x_{3}\right)\right) \gamma^{2} \end{array} L(y2,Fm1(x2)+γ)+L(y3,Fm1(x3)+γ) L(y2,Fm1(x2))+L(y2,Fm1(x2))γ+21L(y2,Fm1(x2))γ2 +L(y3,Fm1(x3))+L(y3,Fm1(x3))γ+21L(y3,Fm1(x3))γ2 求導, 令其結果為0,就會得到, 第1棵樹的第2個葉子節點的輸出: γ 21 = − L ′ ( y 2 , F m − 1 ( x 2 ) ) − L ′ ( y 3 , F m − 1 ( x 3 ) ) L ′ ′ ( y 2 , F m − 1 ( x 2 ) ) + L ′ ′ ( y 3 , F m − 1 ( x 3 ) )   = r 21 + r 31 p 20 ( 1 − p 20 ) + p 30 ( 1 − p 30 )   = 0.33 − 0.67 0.67 × 0.33 + 0.67 × 0.33   = − 0.77 \begin{aligned} \gamma_{21} &=\frac{-L^{\prime}\left(y_{2}, F_{m-1}\left(x_{2}\right)\right)-L^{\prime}\left(y_{3}, F_{m-1}\left(x_{3}\right)\right)}{L^{\prime \prime}\left(y_{2}, F_{m-1}\left(x_{2}\right)\right)+L^{\prime \prime}\left(y_{3}, F_{m-1}\left(x_{3}\right)\right)} \ &=\frac{r_{21}+r_{31}}{p_{20}\left(1-p_{20}\right)+p_{30}\left(1-p_{30}\right)} \ &=\frac{0.33-0.67}{0.67 \times 0.33+0.67 \times 0.33} \ &=-0.77 \end{aligned} γ21=L(y2,Fm1(x2))+L(y3,Fm1(x3))L(y2,Fm1(x2))L(y3,Fm1(x3)) =p20(1p20)+p30(1p30)r21+r31 =0.67×0.33+0.67×0.330.330.67 =0.77 可以看出, 對於任意葉子節點, 我們可以直接計算其輸出值: γ j m = ∑ i = 1 R i j r i m ∑ i = 1 R i j p i , m − 1 ( 1 − p i , m − 1 ) \gamma_{j m}=\frac{\sum_{i=1}^{R_{i j}} r_{i m}}{\sum_{i=1}^{R_{i j}} p_{i, m-1}\left(1-p_{i, m-1}\right)} γjm=i=1Rijpi,m1(1pi,m1)i=1Rijrim

更新模型 F m ( x ) F_m(x) Fm(x) F m ( x ) = F m − 1 ( x ) + ν ∑ j = 1 J m γ m F_{m}(x)=F_{m-1}(x)+\nu \sum_{j=1}^{J_{m}} \gamma_{m} Fm(x)=Fm1(x)+νj=1Jmγm

這樣, 通過多次迴圈迭代, 就可以得到一個比較強的學習器 F m ( x ) F_m(x) Fm(x)

下面分析一下GBDT的優缺點:

我們可以把樹的生成過程理解成自動進行多維度的特徵組合的過程,從根結點到葉子節點上的整個路徑(多個特徵值判斷),才能最終決定一棵樹的預測值, 另外,對於連續型特徵的處理,GBDT 可以拆分出一個臨界閾值,比如大於 0.027 走左子樹,小於等於 0.027(或者 default 值)走右子樹,這樣很好的規避了人工離散化的問題。這樣就非常輕鬆的解決了邏輯迴歸那裡自動發現特徵並進行有效組合的問題, 這也是GBDT的優勢所在。

但是GBDT也會有一些侷限性, 對於海量的 id 類特徵,GBDT 由於樹的深度和棵樹限制(防止過擬合),不能有效的儲存;另外海量特徵在也會存在效能瓶頸,當 GBDT 的 one hot 特徵大於 10 萬維時,就必須做分散式的訓練才能保證不爆記憶體。所以 GBDT 通常配合少量的反饋 CTR 特徵來表達,這樣雖然具有一定的範化能力,但是同時會有資訊損失,對於頭部資源不能有效的表達。

所以, 我們發現其實GBDT和LR的優缺點可以進行互補。

4. GBDT+LR模型

2014年, Facebook提出了一種利用GBDT自動進行特徵篩選和組合, 進而生成新的離散特徵向量, 再把該特徵向量當做LR模型的輸入, 來產生最後的預測結果, 這就是著名的GBDT+LR模型了。GBDT+LR 使用最廣泛的場景是CTR點選率預估,即預測當給使用者推送的廣告會不會被使用者點選。

有了上面的鋪墊, 這個模型解釋起來就比較容易了, 模型的總體結構長下面這樣:

訓練時,GBDT 建樹的過程相當於自動進行的特徵組合和離散化,然後從根結點到葉子節點的這條路徑就可以看成是不同特徵進行的特徵組合,用葉子節點可以唯一的表示這條路徑,並作為一個離散特徵傳入 LR 進行二次訓練

比如上圖中, 有兩棵樹,x為一條輸入樣本,遍歷兩棵樹後,x樣本分別落到兩顆樹的葉子節點上,每個葉子節點對應LR一維特徵,那麼通過遍歷樹,就得到了該樣本對應的所有LR特徵。構造的新特徵向量是取值0/1的。 比如左樹有三個葉子節點,右樹有兩個葉子節點,最終的特徵即為五維的向量。對於輸入x,假設他落在左樹第二個節點,編碼[0,1,0],落在右樹第二個節點則編碼[0,1],所以整體的編碼為[0,1,0,0,1],這類編碼作為特徵,輸入到線性分類模型(LR or FM)中進行分類。

預測時,會先走 GBDT 的每棵樹,得到某個葉子節點對應的一個離散特徵(即一組特徵組合),然後把該特徵以 one-hot 形式傳入 LR 進行線性加權預測。

這個方案應該比較簡單了, 下面有幾個關鍵的點我們需要了解:

  1. 通過GBDT進行特徵組合之後得到的離散向量是和訓練資料的原特徵一塊作為邏輯迴歸的輸入, 而不僅僅全是這種離散特徵
  2. 建樹的時候用ensemble建樹的原因就是一棵樹的表達能力很弱,不足以表達多個有區分性的特徵組合,多棵樹的表達能力更強一些。GBDT每棵樹都在學習前面棵樹尚存的不足,迭代多少次就會生成多少棵樹。
  3. RF也是多棵樹,但從效果上有實踐證明不如GBDT。且GBDT前面的樹,特徵分裂主要體現對多數樣本有區分度的特徵;後面的樹,主要體現的是經過前N顆樹,殘差仍然較大的少數樣本。優先選用在整體上有區分度的特徵,再選用針對少數樣本有區分度的特徵,思路更加合理,這應該也是用GBDT的原因。
  4. 在CRT預估中, GBDT一般會建立兩類樹(非ID特徵建一類, ID類特徵建一類), AD,ID類特徵在CTR預估中是非常重要的特徵,直接將AD,ID作為feature進行建樹不可行,故考慮為每個AD,ID建GBDT樹。
    • 非ID類樹:不以細粒度的ID建樹,此類樹作為base,即便曝光少的廣告、廣告主,仍可以通過此類樹得到有區分性的特徵、特徵組合
    • ID類樹:以細粒度 的ID建一類樹,用於發現曝光充分的ID對應有區分性的特徵、特徵組合