【三部曲03】從XGBoost到LightGBM

參考文獻引用來源:

1.lightgbm論文翻譯
2.lightgbm論文翻譯解讀
3.LightGBM——提升機器算法(圖解+理論+安裝方法+python代碼)
4.論文原文下載


Question1. LightGBM提出的原因或者說背景是什麼?

概括:面對稀疏、大數據場景,計算方式過於耗時

我們知道在LightGBM出現之前,已經有了例如 XGBoost 這樣的優化很細緻的工程實現。但是儘管在這些實現中已經採用了許多工程優化,當面對維度高,數據量大的問題時,其特徵的效率和可擴展性仍然不盡人意。其中一個主要原因是對於每個特徵,他們需要遍歷所有的數據實例來估計所有可能的分割點的信息增益,這非常耗時。


Question2. 那麼LightGBM是怎麼針對性解決這一問題的?

LightGBM提出了兩種新穎的技術:

1.基於梯度的單面採樣(GOSS)

使用GOSS排除了很大比例的小梯度數據實例,只用剩下的來估計信息收益。
文中證明,由於具有較大梯度的數據實例發揮作用在信息獲取計算中起更重要的作用,GOSS可以獲得用更小的數據量對信息增益進行相當準確的估計。

儘管GBDT中的數據實例沒有自具權重,但我們注意到具有不同梯度的數據實例在計算信息增益時扮演不同的角色。 具體而言,根據信息增益的定義,具有較大梯度的那些實例(即訓練不足的實例)將對信息增益做出更多貢獻。 因此,在對數據實例進行下采樣時,爲了保持信息增益估計的準確性,我們應該更好地保留那些具有較大梯度(例如,大於預先定義的閾值或者最高百分位數)的實例,並且只能隨機地刪除這些具有較小梯度值的實例。 我們證明,這種處理可以導致比均勻隨機採樣更準確的增益估計,具有相同的目標採樣率,特別是當信息增益值的範圍較大時。

2.互補特徵壓縮(EFB)

藉助EFB,可以將相互排斥的特徵壓縮在一起(即它們很少同時取非零值),以減少特徵的數量。
文中證明這一發現互補特徵的最佳匹配是NP難度,但是卻可以與貪婪算法一樣可以達到相當好的近似比率(因而可以有效地減少許多不影響分割點確定的準確性)。

通常在實際應用中,雖然有大量的特徵,但特徵空間相當稀疏,這爲我們設計幾乎無損的方法來減少有效特徵的數量提供了可能性。 特別地,在稀疏特徵空間中,許多特徵是(幾乎)排他性的,即它們很少同時取非零值。 獨熱編碼的特徵就是一個典型示例。 我們可以安全地壓縮這些獨特特徵。 爲此,我們設計了一種有效的算法,通過將最優壓縮問題簡化爲圖着色問題(通過將特徵作爲頂點,並且如果兩個特徵不相互排斥,則爲每兩個特徵添加邊),然後用貪心算法 恆定近似比。


Question3. 這兩個技術是通過怎樣的分析得出的?

從發展過程來看,我們知道:GBDT的主要成本在於學習決策樹,學習決策樹中最耗時的部分是找出最佳的分割點。

階段1: 找到分割點的最流行的算法之一是預先排序的算法。該算法枚舉了預先排序的特徵值上所有可能的分割點。 這個算法很簡單,可以找到最優的分割點,但是它在訓練速度和內存消耗方面都是不夠的。

階段2: 另一種流行的算法是基於直方圖的算法,比如XGBoost。這類算法不是在已排序的特徵值上找到分割點,而是基於直方圖的算法將連續的特徵值抽象成離散的區域,並使用這些區域在訓練過程中構建特徵直方圖。

階段3: 由於基於直方圖的算法在內存消耗和訓練速度方面都更加高效,因此我們將在其基礎上開展工作。

再具體分析:基於直方圖的算法根據特徵直方圖找出最佳分割點。 它用於構建直方圖的O(#data×#特徵)和用於分割點的O(#bin×#特徵)。由於 #bin 通常比 #data 小得多,因此直方圖構建將主導計算複雜性。如果我們能夠減少#data或 #feature,我們將能夠大幅加速GBDT的訓練。

上面這一段針對計算量的具體分析,反映出兩條針對直方圖構建的優化思路:

①合理減少樣本的數目;
②合理減少特徵的維度;

之前的工作對這兩個方向都有所嘗試:比如通過下采樣減少樣本的數目,以及通過PCA等方法進行特徵降維,但是這些方法都基於“特徵包含重要冗餘”這一假設,因此都不是很適用。

考慮到實際場景中,大規模數據集都是非常稀疏的。採用預排序的GBDT算法可以通過忽略具有零值的特徵來降低訓練成本;但是採用直方圖的GBDT算法卻沒有有效的稀疏優化解決方案,原因在於基於直方圖的GBDT算法無論特徵值是否爲0,都需要爲每一個數據實例檢索特徵倉值。

這啓發我們,基於直方圖的GBDT算法,應當想辦法有效利用數據的稀疏性,對算法加以改進,因此本文從減少樣本數目和降低特徵維度這兩條思路出發,提出了GOSS和EFB。


Question4. GOSS和EFB的具體原理

1.基於梯度的單面採樣(Gradient-based One-Side Sampling, GOSS)

我們知道,在AdaBoost中,樣本權重是數據實例重要性的良好指標。 但是在GBDT中,不存在本地樣本權重,因此針對AdaBoost提出的抽樣方法不能直接應用。
幸運的是,我們注意到GBDT中每個數據實例的梯度爲我們提供了有用的數據採樣信息。也就是說,如果一個實例與一個小梯度相關聯,則此實例的訓練錯誤很小,並且它已經受過良好訓練。
一個簡單的想法是放棄那些具有小梯度的數據實例。但是這樣做會改變數據分佈以及損害學習模型的準確性。爲了避免這個問題,本文提出了一種叫做基於梯度的單面採樣(GOSS)的新方法。
在這裏插入圖片描述
算法思路:
GOSS保留所有具有大梯度的實例,並對具有小梯度的實例執行隨機採樣。
爲了補償對數據分佈的影響,在計算信息增益時,GOSS爲具有小梯度的數據實例引入了一個常數乘數。

算法具體步驟:
step1. GOSS首先根據梯度的絕對值對數據實例進行排序,並選擇最高的a×100%實例;
step2. 然後從其餘數據中隨機抽樣b×100%的實例;
step3. 之後,當計算信息增益時,GOSS以小的梯度以恆定的1-a/b放大采樣數據;
通過這樣做,我們將更多的重點放在訓練有素的實例上,而不用多次改變原始數據分佈。

附:
GOSS的做法優於隨機採樣的結果,當然,隨機採樣也可以視爲GOSS在a=0時的特例;

GOSS的潛在好處在於:採樣將會增加基學習器的差異性,這會潛在地提升算法的性能;

2.互補特徵壓縮(Exclusive Feature Bundling, EFB)

動機:(實際上就是特徵的合併)
在實際場景中,高維數據通常是非常稀疏的。特徵空間的稀疏性爲我們提供了可能性,來設計幾乎無損的方法來減少特徵的數量。通過觀察可知,特別是在稀疏特徵空間中,許多特徵是相互排斥的,即它們幾乎從不同時取非零值。我們可以安全地將專有特徵捆綁到一個特徵(我們稱之爲專用特徵包)。通過精心設計的特徵掃描算法,我們可以從特徵捆綁中構建與單個特徵相同的特徵直方圖。這樣,直方圖構建的複雜度從O(#data×#feature)改爲O(#data×#bundle),而 #bundle << #feature。那麼我們可以在不損害準確性的情況下顯着加快GBDT的培訓速度。

那麼問題來了:

【1】怎麼確定哪些特徵應該捆綁在一起?
【2】如何構建捆綁?

複雜度分析:通過將圖染色問題推廣到我們的問題,可以得出找到最優捆綁策略是NP難的。這意味着在多項式時間內是無法找到精確解的。

問題1

那麼爲了找到一個好的近似算法,我們首先將最優捆綁問題歸結爲圖染色問題。我們將特徵視爲圖中結點,並在兩個非互斥的結點間添加連邊,這樣我們就可以使用貪婪算法,通過求解圖染色問題,進而獲得一個相當好的效果。此外,我們注意到通常有很多特徵,雖然不是100%互斥,但也很少同時使用非零值。如果我們的算法可以允許一小部分衝突,我們可以得到更少數量的特徵捆綁並進一步提高計算效率。通過簡單的計算,隨機污染一小部分特徵值將至多影響訓練的準確性O([(1-γ)n] -2/3),其中 γ 是每個捆綁包中的最大沖突。所以如果我們選擇一個相對較小的 γ ,我們將能夠在精度和效率之間取得很好的平衡。
在這裏插入圖片描述
基於以上討論,我們設計了一個特徵捆綁算法,如算法3所示:
step1. 首先,我們構造一個加權邊的圖,其權重對應於特徵之間的總衝突;
step2. 其次,我們基於圖中特徵節點度數的降序對特徵進行排序;
step3. 最後,我們檢查有序列表中的每個特徵,並將其分配給一個具有小衝突(由γ控制)的現有捆綁包,或者創建一個新的捆綁包。

算法3的時間複雜性是O(#特徵2),訓練前僅處理一次。當特徵數量不是很大時,這種複雜性是可以接受的,但是如果有數百萬個特徵可能仍會受到影響。
爲了進一步提高效率,我們提出了一個更有效的排序策略,不需要構建圖表:按非零值計數排序,這類似於按節點度數排序,因爲更多的非零值通常會導致更高的衝突概率。因爲我們只改變算法3中的排序策略,新算法的細節被省略以避免重複。

問題2

對於第二個問題,我們需要一種合併同一捆綁中的特徵的好方法,以減少相應的訓練複雜度。
關鍵是要確保可以從特徵包中識別出原始特徵的值。

由於基於直方圖的算法存儲離散倉而不是特徵的連續值,我們可以通過讓唯一的特徵位於不同倉中,來構建特徵捆綁。 這可以通過向特徵的原始值添加偏移來完成。
例如,假設我們在一個特徵包中有兩個特徵。最初,特徵A從 [0,10) 中取值,特徵B從 [0,20) 中取值。對特徵B的值進行一個加10的偏移,以使得精化特徵取 [10,30) 中的值。之後,合併特徵A和B並使用範圍爲[0,30]的特徵捆綁包來替換原始特徵A和B是安全的。詳細的算法在算法4中顯示:

EFB算法可以將許多獨有的特徵進行捆綁,以得到數目少得多的密集特徵,這可以有效地避免對零特徵值進行不必要的計算。
在這裏插入圖片描述

額外方法:

實際上,我們也可以通過使用表來記錄每個特徵實例的非零值的數目,通過基於這個表來優化基本的基於直方圖的算法來忽略零特徵值。通過掃描此表中的數據,特徵的直方圖構建成本將從O(#data)降爲O(#non_zero_data)。

但是這種方法需要額外的記憶和計算費用來維護整個樹形成過程中的特徵表。

我們在LightGBM中實現了這種優化作爲基本功能。 請注意,此優化並不會與EFB衝突,因爲我們仍然可以在捆綁稀疏時使用它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章