LightGBM(一)LightGBM原理解析

契機

GBDT算法一個比較大的問題在於其耗時很大,因爲每次建立一棵樹的一個節點,都要遍歷所有的特徵,且對於每個特徵,都要搜索所有可能的分割值,才能找到具有最優分割點的最優特徵,訓練的耗時在工業界是沒有辦法接受的,因而需要從入下兩個方面入手來解決上述問題:

  • 減少訓練樣本,從而減少訓練時遍歷樣本的時間
  • 減少參與計算的特徵,從而減少尋找具有最優分割點的最優特徵的耗時

後文會對上面兩種手段分別講述一種算法來介紹lightGBM是如何在不降低過多精度的前提下加快訓練和預測的速度的。

具體手段

lightGBM中的兩個減少耗時的算法分別爲GOSS(Gradient-based One-Side Sampling)和EFB(Exclusive Feature Bundling),下面會具體講述兩種算法的做法。

1. GOSS

lightGBM無法像adaboost那樣對每個訓練樣本賦予一個權重,但可以觀察到,樣本的梯度越大,其對訓練的影響也就越大,因而它務必要參與到訓練過程中,相反梯度小的樣本對訓練的影響不是很大,因而加入它參加訓練的意義不是很大。受到上述內容的啓發,可以通過對梯度的大小對每個訓練樣本進行排序,從而使得梯度大的樣本參與訓練的概率大,梯度小的參與訓練的概率小,這樣就能夠做到在降低耗時的前提下精度不至於損失太多。算法的原理如下所示:

  1. 選擇梯度top a%的數據A
  2. 從(1-a%)的數據中選擇b%的數據B
  3. 在特徵計算中,對B中的訓練樣本的info gain都乘以[(1-a%)/b%]

上述算法的簡易圖示如下所示:
在這裏插入圖片描述

2. EFB

如果特徵是高維的,通常情況下特徵的取值是較爲稀疏的,因而如果能夠將互斥的特徵(不會同時不爲0)合併爲一個特徵(bundle),那麼就能大大降低特徵數,從而降低訓練的耗時。而如何確定哪些特徵是綁定在一起的,本身就是NP難問題,這裏給出了一個近似的解決方案。

lightGBM的作者將尋找互斥特徵的過程轉化爲圖着色的過程,即構建一個圖<V,E>,圖的每個節點代表的是一個特徵,如果特徵fif_i和特徵fjf_j之間如果不是互斥的,則兩個特徵之間會有一條邊相連。而現在的任務就是用最少的顏色去對所有的節點染色,使得相鄰的節點之間顏色不同。簡易圖如下所示:
在這裏插入圖片描述

而現實情況下,並不是說只要兩個特徵之間有衝突,就無法並存在一個bundle中,而是兩個特徵的衝突在一定的容忍範圍內,就可以作爲互斥特徵,於是有了如下原始算法:
在這裏插入圖片描述
個人覺得這個算法的結構描述有些問題,不知道是因爲個人沒有理解透徹還是說作者本身發表的文章就有問題,我個人更改的算法如下所示:
在這裏插入圖片描述
一開始根據度對圖上的節點進行排序,之後外層遍歷每一個featureifeature_i,內層去遍歷bundles,如果 featureifeature_ibundlejbundle_j之間的衝突數和bundlejbundle_j中本身的累積衝突數的加和小於一定的數值(K)的話,則將featureifeature_i加入到bundlejbundle_j的陣營中,之後bundlejbundle_j本身的累積衝突數需要疊加上featureifeature_i的衝突數,這樣就能夠做到這個bundle累加到一定的地步的時候,就必須要創建一個新的bundle來裝新的特徵。

將bundles構建好之後開始進行merge特徵,因爲同一個bundle內的特徵的取值範圍需要統一,比如A和B是同一個bundle的,A的取值範圍是[0,10), B的取值範圍是[10,20), 則合併後的新的特徵的取值範圍是[0,30)。具體的算法目前沒有看懂,需要看源碼後再來做補充,因而這裏未完待續…

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