『 論文閱讀』LightGBM原理-LightGBM: A Highly Efficient Gradient Boosting Decision Tree
17年8月LightGBM就開源了,那時候就開始嘗試上手,不過更多還是在調參層面,在作者12月論文發表之後看了卻一直沒有總結,這幾天想著一定要翻譯下,自己也梳理下GBDT相關的演算法。
Abstract
Gradient Boosting Decision Tree (GBDT)非常流行卻鮮有實現,只有像XGBoost和pGBRT。當特徵維度較高和資料量巨大的時候,其實現中仍然存在效率和可擴充套件性的問題。一個主要原因就是對於每一個特徵的每一個分裂點,都需要遍歷全部資料計算資訊增益,這一過程非常耗時。針對這一問題,本文提出兩種新方法:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)
1. Introduction
GBDT因為其的有效性、準確性、可解釋性,成為了廣泛使用的機器學習演算法。GBDT在許多機器學習任務上取得了最好的效果( state-of-the-art),例如多分類,點選預測,排序。但最近幾年隨著大資料的爆發(特徵量和資料量),GBDT面臨平衡準確率和效率的調整。
GBDT缺點:**對於每一個特徵的每一個分裂點,都需要遍歷全部資料來計算資訊增益。**因此,其計算複雜度將受到特徵數量和資料量雙重影響,造成處理大資料時十分耗時。
解決這個問題的直接方法就是減少特徵量和資料量而且不影響精確度,有部分工作根據資料權重取樣來加速booisting的過程,但由於gbdt沒有樣本權重不能應用。而本文提出兩種新方法實現此目標。
Gradient-based One-Side Sampling (GOSS):GBDT雖然沒有資料權重,但每個資料例項有不同的梯度,根據計算資訊增益的定義,梯度大的例項對資訊增益有更大的影響,因此在下采樣時,我們應該儘量保留梯度大的樣本(預先設定閾值,或者最高百分位間),隨機去掉梯度小的樣本。我們證明此措施在相同的取樣率下比隨機取樣獲得更準確的結果,尤其是在資訊增益範圍較大時。
Exclusive Feature Bundling (EFB):通常真是應用中,雖然特徵量比較多,但是由於特徵空間十分稀疏,是否可以設計一種無損的方法來減少有效特徵呢?特別在稀疏特徵空間上,許多特徵幾乎是互斥的(例如許多特徵不會同時為非零值,像one-hot),我們可以捆綁互斥的特徵。最後,我們將捆綁問題歸約到圖著色問題,通過貪心演算法求得近似解。
2. Preliminaries
2.1 GBDT and Its Complexity Analysis
GBDT是一種整合模型的決策樹,順序訓練決策樹。每次迭代中,GBDT通過擬合負梯度(殘差)來學到決策樹。
學習決策樹是GBDT主要的時間花銷,而學習決策樹中找到最優切分點最消耗時間。廣泛採用的預排序演算法來找到最優切分點,這種方法會列舉預排序中所有可能的切分點。這種演算法雖然能夠找到最優的切分點,但對於訓練速度和記憶體消耗上都效率低。另一種流行演算法是直方圖演算法(histogram-based algorithm)。直方圖演算法並不通過特徵排序找到最優的切分點,而是將連續的特徵值抽象成離散的分箱,並使用這些分箱在訓練過程中構建特徵直方圖,這種演算法更加訓練速度和記憶體消耗上都更加高效,lightGBM使用此種演算法。
histogram-based演算法通過直方圖尋找最優切分點,其建直方圖消耗O(#data * #feature),尋找最優切分點消耗O(#bin * # feature),而#bin的數量遠小於#data,所以建直方圖為主要時間消耗。如果能夠減少資料量或特徵量,那麼還能夠夠加速GBDT的訓練。
2.2 Related Work
GBDT有許多實現,如XGBoost,PGBRT,Scikit-learn,gbm in R。Scikit-learn和gbm in R實現都用了預排序,pGBRT使用了直方圖演算法那,XGBoost支援預排序和直方圖演算法,由於XGBoost勝過其他演算法,我們用它作為baseline。
為了減小訓練資料集,通常做法是下采樣。例如過濾掉權重小於閾值的資料。SGB每次迭代中用隨機子集訓練弱學習器。或者取樣率基於訓練過程動態調整。除了基於AdaBoost的SGB不能直接應用於GBDT,因為GBDT中沒有原始的權重。雖然SGB也能間接應用於GBDT,單往往會影響精度。
同樣,過濾掉弱特徵(什麼是弱特徵)來減少特徵量。通常用主成分分析或者投影法。當然,這些方法依賴於一個假設-特徵包含高度的冗餘,但實際中往往不是。(設計特徵來自於其獨特的貢獻,移除任何一維度都可以某種程度上影響精度)。
實際中大規模的資料集通常都是非常稀疏的,使用預排序演算法的GBDT能夠通過無視為0的特徵來降低訓練時間消耗。然後直方圖演算法沒有優化稀疏的方案。因為直方圖演算法無論特徵值是否為0,都需要為每個資料檢索特徵區間值。如果基於直方圖的GBDT能夠有效利用稀疏特徵將是最優。
下圖是連個演算法的對比:
3. Gradient-based One-Side Sampling
GOSS是一種在減少資料量和保證精度上平衡的演算法。
3.1 Algorithm Description
AdaBoost中,樣本權重是資料例項重要性的指標。然而在GBDT中沒有原始樣本權重,不能應用權重取樣。幸運的事,我們觀察到GBDT中每個資料都有不同的梯度值,對取樣十分有用,即例項的梯度小,例項訓練誤差也就較小,已經被學習得很好了,直接想法就是丟掉這部分梯度小的資料。然而這樣做會改變資料的分佈,將會影響訓練的模型的精確度,為了避免此問題,我們提出了GOSS。
GOSS保留所有的梯度較大的例項,在梯度小的例項上使用隨機取樣。為了抵消對資料分佈的影響,計算資訊增益的時候,GOSS對小梯度的資料引入常量乘數。GOSS首先根據資料的梯度絕對值排序,選取top a個例項。然後在剩餘的資料中隨機取樣b個例項。接著計算資訊增益時為取樣出的小梯度資料乘以(1-a)/b,這樣演算法就會更關注訓練不足的例項,而不會過多改變原資料集的分佈。
3.2 Theoretical Analysis
GBDT使用決策樹,來學習獲得一個將輸入空間對映到梯度空間的函式。假設訓練集有n個例項,特徵維度為s。每次梯度迭時,模型資料變數的損失函式的負梯度方向表示為,決策樹通過最優切分點(最大資訊增益點)將資料分到各個節點。GBDT通過分割後的方差衡量資訊增益。
定義3.1:O表示某個固定節點的訓練集,分割特徵j的分割點d定義為:
其中,.
遍歷每個特徵的每個分裂點,找到$d^*_j = argmax_d V_j(d) $ 並計算最大的資訊增益,然後,將資料根據特徵的分裂點將資料分到左右子節點。
在GOSS中,
-
首先根據資料的梯度將訓練降序排序。
-
保留top a個數據實例,作為資料子集A。
-
對於剩下的資料的例項,隨機取樣獲得大小為b的資料子集B。
-
最後我們通過以下方程估計資訊增益:
此處GOSS通過較小的資料集估計資訊增益,將大大地減小計算量。更重要的的,我們接下來理論表明GOSS不會丟失許多訓練精度,勝過隨機取樣,理論的證明在附加材料。
Theorem 3.2:我們定義GOSS近似誤差為,,$ \bar{g}l^j(d)=\frac{\sum{x_i \in (A \cup A^c)_r} |g_i|}{n_r^j(d)}$,概率至少是,有:
其中