Lightgbm源论文解析:LightGBM: A Highly Efficient Gradient Boosting Decision Tree
寫這篇博客的原因是,網上很多關于Lightgbm的講解都是從Lightgbm的官方文檔來的,官方文檔只會告訴你怎么用,很多細節都沒講。所以自己翻過來Lightgbm的源論文:LightGBM: A Highly Efficient Gradient Boosting Decision Tree仔細看了幾遍,現在整理一下源論文,加深自己對Lightgbm技術細節的認識和思考。
首先感謝網友立刻有的博客,省去了我很多翻譯的工作。我更改了他博客的部分不當(翻譯或者公式)的地方,又加入了自己的一些思考。
Abstract
Gradient Boosting Decision Tree (GBDT)非常流行卻鮮有實現,只有像XGBoost和pGBRT實現。當特征維度較高和數據量巨大的時候,仍然存在效率和可擴展性的問題。一個主要原因就是對于每一個特征的每一個分裂點,都需要遍歷全部數據計算信息增益,這一過程非常耗時。針對這一問題,本文提出兩種新方法:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基于梯度的one-side采樣和互斥的特征捆綁)。在GOSS中,我們排除了重要的比例-具有小梯度的實例,只用剩下的來估計信息增益,我們證明,這些梯度大的實例在計算信息增益中扮演重要角色,GOSS可以用更小的數據量對信息增益進行相當準確的估計。對于EFB,我們捆綁互斥的特征(例如,特征間很少同時非零的特征),來降低特征的個數。我們完美地證明了捆綁互斥特征是NP難的,但貪心算法能夠實現相當好的逼近率,因此我們能夠在不損害分割點準確率許多的情況下,有效減少特征的數量。(犧牲一點分割準確率降低特征數量),這一算法命名為LightGBM。在多個公共數據集實驗證明,LightGBM加速了傳統GBDT訓練過程20倍以上,同時達到了幾乎相同的精度。
?
1. Introduction
GBDT因為其本身的有效性、準確性、可解釋性,成為了廣泛使用的機器學習算法。GBDT在許多機器學習任務上均取得了最好的效果,例如多分類,點擊預測,排序。但最近幾年隨著大數據的爆發(特征量和數據量),GBDT面臨平衡準確率和效率的調整。
GBDT缺點:對于每一個特征的每一個分裂點,都需要遍歷全部數據來計算信息增益。因此,其計算復雜度將受到特征數量和數據量雙重影響,造成處理大數據時十分耗時。
解決這個問題的直接方法就是減少特征量和數據量而且不影響精確度,有部分工作根據數據權重采樣來加速boosting的過程,但由于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能夠有效解決稀疏特征中的0值,那么這樣將會有很好的性能。
下圖為直方圖算法的流程:
3. Gradient-based One-Side Sampling
GOSS是一種在減少數據量和保證精度上平衡的算法。
3.1 Algorithm Description
AdaBoost中,樣本權重是數據實例重要性的指標。然而在GBDT中沒有原始樣本權重,不能應用權重采樣。幸運的事,我們觀察到GBDT中每個數據都有不同的梯度值,對采樣十分有用,即實例的梯度小,實例訓練誤差也就較小,已經被學習得很好了,直接想法就是丟掉這部分梯度小的數據。然而這樣做會改變數據的分布,將會影響訓練的模型的精確度,為了避免此問題,我們提出了GOSS。
GOSS保留所有的梯度較大的實例,在梯度小的實例上使用隨機采樣。為了抵消對數據分布的影響,計算信息增益的時候,GOSS對小梯度的數據引入常量乘數。GOSS首先根據數據的梯度絕對值排序,選取top a個實例。然后在剩余的數據中隨機采樣b個實例。接著計算信息增益時為采樣出的小梯度數據乘以(1-a)/b(即,小梯度樣本總數/隨機采樣出的小梯度樣本數量),這樣算法就會更關注訓練不足的實例,而不會過多改變原數據集的分布。
GOSS的算法流程如下:
3.2 Theoretical Analysis
GBDT使用決策樹,來學習獲得一個將輸入空間映射到梯度空間的函數。假設訓練集有n個實例 ,特征維度為s。每次迭代時,模型數據變量的損失函數的負梯度方向表示為,決策樹通過最優切分點(最大信息增益點)將數據分到各個節點。GBDT通過分割后的方差衡量信息增益
定義3.1:O表示某個固定葉子節點的訓練集,分割特征j的分割點d定義為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中,(某個固定葉子節點的訓練集樣本的個數),(在第j個特征上值小于等于d的樣本個數),(在第j個特征上值大于d的樣本個數)。
遍歷每個特征的每個分裂點,找到 并計算最大的信息增益,然后,將數據根據特征的分裂點?將數據分到左右子節點。
在GOSS中,
首先根據數據的梯度進行降序排序。
保留top %a個數據實例,作為數據子集A。
對于剩下的數據的實例集合,隨機采樣獲得大小為的數據子集B。
最后我們在集合上,通過以下方程估計信息增益:
? ? ? ? ? ? ? ? ?
此處GOSS通過較小的數據集估計信息增益 ,將大大地減小計算量。更重要的是,我們接下來理論表明GOSS不會丟失許多訓練精度,且勝過隨機采樣,理論的證明在附加材料(參考文獻【2】)。
Theorem 3.2:我們定義GOSS近似誤差為,,,概率至少是,有:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其中。
根據理論3.2,我們得出以下結論:
GOSS的漸近近似比率?。如果數據分割不是極不平衡(也就是 且),那么定理3.2中近似誤差將由第二項主導,且在第二項中,當n趨于無窮(數據量很大)時將趨于0,即數據量越大,誤差越小,精度越高。
隨機采樣是GOSS在a=0的一種情況。多數情況下,GOSS性能優于隨機采樣,即以下情況:(C代表誤差,即隨機抽比例的誤差大于先抽top a%比例再抽比例的誤差),等價于,其中。
(其實這里,,代入,就可以得到等價的不等式)
下面分析GOSS的泛化性。考慮GOSS泛化誤差,這是GOSS抽樣的的實例計算出的方差增益與實際樣本方差增益之間的差距。變換為,,因此,在GOSS準確的情況下,GOSS泛化誤差近似于全量的真實數據。另一方面,采樣將增加基學習器的多樣性(因為每次采樣獲得的數據可能會不同),這將提高泛化性。
4 Exclusive Feature Bundling
這一章介紹如何有效減少特征的數量。
高維的數據通常是稀疏的,這種稀疏性啟發我們可以設計一種無損地方法來減少特征的維度。特別地,在稀疏特征空間中,許多特征是互斥的,即它們從不同時為非零值。我們可以綁定互斥的特征為單一特征,通過仔細設計特征掃描算法,我們從特征捆綁中構建了與單個特征相同的特征直方圖。這種方式的構建直方圖時間復雜度從O(#data * #feature)降到O(#data * #bundle),由于#bundle << # feature,我們能夠極大地加速GBDT的訓練過程而且不損失精度。(構造直方圖的時候,遍歷一個“捆綁的大特征”可以得到一組exclusive feature的直方圖。這樣只需要遍歷這些“大特征”就可以獲取到所有特征的直方圖,降低了需要遍歷的特征量。)
有兩個問題:
怎么判定哪些特征應該綁在一起(build bundled)?
怎么把特征綁為一個(merge feature)?
4.1 bundle(什么樣的特征被綁定)?
理論 4.1:將特征分割為較小量的互斥特征群是NP難的。
證明:將圖著色問題歸約為此問題,而圖著色是NP難的,所以此問題就是NP難的。
給定圖著色實例G=(V, E)。以G的關聯矩陣的每一行為特征,得到我們問題的一個實例有|V|個特征。 很容易看到,在我們的問題中,一個獨特的特征捆綁包與一組具有相同顏色的頂點相對應,反之亦然。
對于第1個問題,理論4.1說明在多項式時間中求解這個NP難問題是不可行的。為了尋找好的近似算法,我們將最優捆綁問題歸結為圖著色問題,如果兩個特征之間不是相互排斥,那么我們用一個邊將他們連接,然后用合理的貪婪算法(具有恒定的近似比)用于圖著色來做特征捆綁。 此外,我們注意到通常有很多特征,盡管不是100%相互排斥的,也很少同時取非零值。 如果我們的算法可以允許一小部分的沖突,我們可以得到更少的特征包,進一步提高計算效率。經過簡單的計算,隨機污染小部分特征值將影響精度最多(參考文獻【2】), 是每個綁定中的最大沖突比率,當其相對較小時,能夠完成精度和效率之間的平衡。
基于上面的討論,我們設計了算法3,偽代碼見下圖,具體算法:
算法3的時間復雜度是,訓練之前只處理一次,其時間復雜度在特征不是特別多的情況下是可以接受的,但難以應對百萬維的特征。為了繼續提高效率,我們提出了一個更加高效的不用構建圖的排序策略:將特征按照非零值個數排序,這和使用圖節點的度排序相似,因為更多的非零值通常會導致沖突。新算法在算法3基礎上只是改變了排序策略。
4.2 merging features(特征合并)
對于第2個問題,如何合并同一個bundle的特征來降低訓練時間復雜度。關鍵在于原始特征值可以從bundle中區分出來。鑒于直方圖算法存儲離散值而不是連續特征值,我們通過將互斥特征放在不同的箱中來構建bundle。這可以通過將偏移量添加到特征原始值中實現,例如,假設bundle中有兩個特征,原始特征A取值[0, 10],B取值[0, 20]。我們添加偏移量10到B中,因此B取值[10, 30]。通過這種做法,就可以安全地將A、B特征合并,使用一個取值[0, 30]的特征取代A和B。算法見算法4,算法流程如下:
EFB算法能夠將許多互斥的特征變為低維稠密的特征,就能夠有效的避免不必要0值特征的計算。實際,對每一個特征,建立一個記錄數據中的非零值的表,通過用這個表,來忽略零值特征,達到優化基礎的直方圖算法的目的。通過掃描表中的數據,建直方圖的時間復雜度將從O(#data)降到O(#non_zero_data)。當然,這種方法在構建樹過程中需要而額外的內存和計算開銷來維持這種表。我們在lightGBM中將此優化作為基本函數,因為當bundles是稀疏的時候,這個優化與EFB不沖突(可以用于EFB)
5?Experiments
實驗部分,比較簡單。主要用了五個公開數據集,且這些數據集都比較大,而且包含了稀疏和稠密的特征,涵蓋了很多真實的業務,因此它們能夠完全地測試lightGBM的性能。
經過與XGBoost,lightgbm without GOSS and EFB和SGB的對比,證明了LightGBM在計算速度和內存消耗上明顯優于XGBoost和SGB,且不損失準確率。
這部分詳細內容可以看參考文獻1和2.
6 Conclusion
本文提出了新穎的GBDT算法–LightGBM,它包含了2個新穎的技術:Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基于梯度的one-side采樣和互斥的特征捆綁)來處理大數據量和高維特征的場景。我們在理論分析和實驗研究表明,GOSS和EFB使得LightGBM在計算速度和內存消耗上明顯優于XGBoost和SGB。
未來,我們將研究優化如何在GOSS中選擇a,b。繼續提高EFB在高維特征上的性能,無論其是否是稀疏的。
?
參考文獻
【1】https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf
【2】https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree
【3】https://blog.csdn.net/shine19930820/article/details/79123216
總結
以上是生活随笔為你收集整理的Lightgbm源论文解析:LightGBM: A Highly Efficient Gradient Boosting Decision Tree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信贷种类
- 下一篇: 面试官提出的Io问题 如何去做解答呢?