日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[机器学习] Boosting算法4 --- LightGBM介绍与分布式

發(fā)布時(shí)間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [机器学习] Boosting算法4 --- LightGBM介绍与分布式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[機(jī)器學(xué)習(xí)] Boosting算法1 --- AdaBoost

[機(jī)器學(xué)習(xí)] Boosting算法2 --- GBDT

[機(jī)器學(xué)習(xí)] Boosting算法3 --- XGBoost

[機(jī)器學(xué)習(xí)] Boosting算法4 --- LightGBM

目錄

一 LightGBM特點(diǎn)

二 Histogram算法

三 LightGBM的細(xì)節(jié)技術(shù)

1. Histogram optimization

2 內(nèi)存消耗和計(jì)算上優(yōu)化

3 帶深度限制的Leaf-wise的葉子生長(zhǎng)策略

4、直方圖做差優(yōu)化

5、 增加緩存命中率

6、支持類別特征

7、支持并行學(xué)習(xí)

7.1 特征并行

7.2 數(shù)據(jù)并行

7.3 投票并行

8、網(wǎng)絡(luò)通信的優(yōu)化

四、支持的應(yīng)用和度量

1 應(yīng)用

2 度量

3 其他


一? LightGBM特點(diǎn)

LightGBM(Light Gradient Boosting Machine)是微軟的開源分布式高性能Gradient Boosting框架,使用基于決策樹的學(xué)習(xí)算法。

相比XGBoost有如下優(yōu)點(diǎn):

  • 基于Histogram的決策樹算法, 更快的訓(xùn)練速度和更高的效率:LightGBM使用基于直方圖的算法。例如,它將連續(xù)的特征值分桶(buckets)裝進(jìn)離散的箱子(bins),這是的訓(xùn)練過程中變得更快。

  • 帶深度限制的Leaf-wise的葉子生長(zhǎng)策略,?? LightGBM的分裂節(jié)點(diǎn)的方式與XGBoost不一樣。LGB避免了對(duì)整層節(jié)點(diǎn)分裂法,而采用了對(duì)增益最大的節(jié)點(diǎn)進(jìn)行深入分解的方法。這樣節(jié)省了大量分裂節(jié)點(diǎn)的資源。

  • 更低的內(nèi)存占用:使用離散的箱子(bins)保存并替換連續(xù)值導(dǎo)致更少的內(nèi)存占用。

  • 更高的準(zhǔn)確率(相比于其他任何提升算法):它通過leaf-wise分裂方法產(chǎn)生比level-wise分裂方法更復(fù)雜的樹,這就是實(shí)現(xiàn)更高準(zhǔn)確率的主要因素。然而,它有時(shí)候或?qū)е逻^擬合,但是我們可以通過設(shè)置 max-depth 參數(shù)來防止過擬合的發(fā)生。

  • 大數(shù)據(jù)處理能力:相比于XGBoost,由于它在訓(xùn)練時(shí)間上的縮減,它同樣能夠具有處理大數(shù)據(jù)的能力。

  • 支持并行學(xué)習(xí)

  • Cache命中率優(yōu)化

  • 基于直方圖的稀疏特征優(yōu)化

Histogram算法

直方圖算法的基本思想:先把連續(xù)的浮點(diǎn)特征值離散化成k個(gè)整數(shù),同時(shí)構(gòu)造一個(gè)寬度為k的直方圖。遍歷數(shù)據(jù)時(shí),根據(jù)離散化后的值作為索引在直方圖中累積統(tǒng)計(jì)量,當(dāng)遍歷一次數(shù)據(jù)后,直方圖累積了需要的統(tǒng)計(jì)量,然后根據(jù)直方圖的離散值,遍歷尋找最優(yōu)的分割點(diǎn)。

LightGBM里默認(rèn)的訓(xùn)練決策樹時(shí)使用直方圖算法,XGBoost里現(xiàn)在也提供了這一選項(xiàng),不過默認(rèn)的方法是對(duì)特征預(yù)排序,計(jì)算過程當(dāng)中是按照value的排序,逐個(gè)數(shù)據(jù)樣本來計(jì)算劃分收益,這樣的算法能夠精確的找到最佳劃分值,但是代價(jià)比較大同時(shí)也沒有較好的推廣性。

a. 降低計(jì)算分裂增益的成本

  • 基于預(yù)排序的算法具有時(shí)間復(fù)雜性 O(#𝑑𝑎𝑡𝑎),計(jì)算直方圖具有時(shí)間復(fù)雜度O(#𝑑𝑎𝑡𝑎)----(初始構(gòu)造直方圖是需要一次O(#data)的時(shí)間復(fù)雜度,不過這里只涉及到加和操作),? 但這僅當(dāng)在執(zhí)行總結(jié)操作時(shí)發(fā)生;
  • 構(gòu)建完直方圖后,基于直方圖的算法具有時(shí)間復(fù)雜度O(#𝑏𝑖𝑛𝑠),因?yàn)槟硞€(gè)特征不同值的個(gè)數(shù)遠(yuǎn)小于訓(xùn)練樣本的個(gè)數(shù);
  • b. 直方圖做差進(jìn)一步提高效率

    計(jì)算某一節(jié)點(diǎn)的葉節(jié)點(diǎn)的直方圖可以通過將該節(jié)點(diǎn)的直方圖與另一子節(jié)點(diǎn)的直方圖做差得到,所以每次分裂只需計(jì)算分裂后樣本數(shù)較少的子節(jié)點(diǎn)的直方圖然后通過做差的方式獲得另一個(gè)子節(jié)點(diǎn)的直方圖,進(jìn)一步提高效率。

    c. 節(jié)省內(nèi)存

    • 將連續(xù)數(shù)據(jù)離散化為直方圖的形式,對(duì)于數(shù)據(jù)量較小的情形可以使用小型的數(shù)據(jù)類型來保存訓(xùn)練數(shù)據(jù)
    • 不必像預(yù)排序一樣保留額外的對(duì)特征值進(jìn)行預(yù)排序的信息

    d. 減少了并行訓(xùn)練的通信代價(jià)

    現(xiàn)在來看看直方圖優(yōu)化是如何優(yōu)化的,當(dāng)然這個(gè)優(yōu)化也是在處理節(jié)點(diǎn)分裂的時(shí)候。在處理連續(xù)特征的時(shí)候,如果你想要快速找到最佳的分裂節(jié)點(diǎn)要么像之前說到的那樣對(duì)特征值采用預(yù)排序的方式來快速得到最佳的分裂特征值,在這里直方圖就是先將特征值先做裝箱處理,裝箱處理是特征工程中常見的處理方式之一

    以浮點(diǎn)型數(shù)據(jù)來舉例,一個(gè)區(qū)間的值會(huì)被作為一個(gè)筒,然后以這些筒為精度單位的直方圖來做。這樣一來,數(shù)據(jù)的表達(dá)變得更加簡(jiǎn)化,減少了內(nèi)存的使用,而且直方圖帶來了一定的正則化的效果,能夠使我們做出來的模型避免過擬合且具有更好的推廣性。

    histogram算法簡(jiǎn)單來說,就是先對(duì)特征值進(jìn)行裝箱處理,形成一個(gè)一個(gè)的bins。對(duì)于連續(xù)特征來說,裝箱處理就是特征工程中的離散化:如[0,0.3)—>0,[0.3,0.7)—->1等。

    一個(gè)區(qū)間的范圍內(nèi)作為一個(gè)bin,簡(jiǎn)化為以分桶為粒度的直方圖來做,這樣一來,數(shù)據(jù)的表示更加簡(jiǎn)化,減少了內(nèi)存的適用,而且直方圖帶來了一定的正則化的效果,使得我們訓(xùn)練出的模型不容易o(hù)ver-fitting到training-data上面,從而具備更好的推廣性。

    ?

    e. 特征的最優(yōu)分割點(diǎn)
    通常使用獨(dú)熱編碼來轉(zhuǎn)換分類特征,但這種方法對(duì)于決策樹的學(xué)習(xí)并不是有益的。特別是對(duì)于不同值較多的特征,獨(dú)熱編碼后構(gòu)建的樹往往是不平衡的,并且需要非常大的深度才能獲得較好的準(zhǔn)確率。
    事實(shí)上,最佳解決方案是通過將類別劃分為2個(gè)子集。如果特征具有K個(gè)不同的值,就是在2^(k-1) - 1種情況里找到最優(yōu)的分割點(diǎn)。對(duì)于回歸樹而言,有一種解決方案可以保證在O(k * log(k))的時(shí)間復(fù)雜度內(nèi)找到最優(yōu)分割點(diǎn)。
    找到特征的最優(yōu)分割點(diǎn)的基本思想是根據(jù)訓(xùn)練目標(biāo)的相關(guān)性對(duì)類別進(jìn)行重排序。 更具體的說,根據(jù)累加值(sum_gradient / sum_hessian)重新對(duì)(類別特征的)直方圖進(jìn)行排序,然后在排好序的直方圖中尋找最優(yōu)的分割點(diǎn)。

    三、LightGBM的細(xì)節(jié)技術(shù)

    1. Histogram optimization

    上圖是做過直方圖優(yōu)化之后的求解直方圖的算法細(xì)節(jié)。這是按照bin來索引histogram的,所以不需要按照每個(gè)feature來排序,也不需要一一地對(duì)比不同feature的值,大大地減少了運(yùn)算量。

    在Lightgbm中默認(rèn)的#bins為256(1個(gè)字節(jié)的能表示的長(zhǎng)度,可以設(shè)置)。對(duì)于分類特征來說,則是每一種取值放入一個(gè)bin,且當(dāng)取值的個(gè)數(shù)大于max bin數(shù)時(shí),會(huì)忽略那些很少出現(xiàn)的category值。在節(jié)點(diǎn)分裂的時(shí)候,這時(shí)候就不需要按照預(yù)排序算法那樣,對(duì)于每個(gè)特征都計(jì)算#data遍了,而是只需要計(jì)算#bins遍,這樣就大大加快了訓(xùn)練速度。

    2 內(nèi)存消耗和計(jì)算上優(yōu)化

    相比于另一個(gè)主流的算法 pre-sorted(如 xgboost 中的 exact 算法)histogram 在內(nèi)存消耗和計(jì)算代價(jià)上都有不少優(yōu)勢(shì)。


    a. 內(nèi)存上優(yōu)勢(shì)

    1. 當(dāng)我們用feature的bin來描述數(shù)據(jù)的特征的時(shí)候,帶來的變化,首先是我們不需要像預(yù)排序算法那樣去存儲(chǔ)每一個(gè)feature排序后對(duì)應(yīng)的data的序列,也就是上圖最左邊的灰色方塊。Pre-sorted 算法需要的內(nèi)存約是訓(xùn)練數(shù)據(jù)的兩倍(2 * #data * #features* 4Bytes),因?yàn)閤gboost既要保存原始feature的值,也要保存這個(gè)值的順序索引,這些值需要32位的浮點(diǎn)數(shù)來保存它需要用32位浮點(diǎn)來保存 feature value,并且對(duì)每一列特征,都需要一個(gè)額外的排好序的索引,這也需要32位的存儲(chǔ)空間。

    2. 我們使用bin來表示feature,一般bin的個(gè)數(shù)都是控制在比較小的范圍內(nèi),這樣我們可以使用更少的Byte來存儲(chǔ),如上圖,使用Byte來存,而原先的feature value可能是float,需要用4個(gè)Bytes來存儲(chǔ)。對(duì)于 histogram 算法,則只需要(#data* #features * 1Bytes)的內(nèi)存消耗,僅為 pre-sorted算法的1/8。因?yàn)?histogram 算法僅需要存儲(chǔ) feature bin value (離散化后的數(shù)值),不需要原始的 feature value,也不用排序,而 bin value 用 uint8_t (256 bins) 的類型一般也就足夠了。

    當(dāng)我們用數(shù)據(jù)的bin描述數(shù)據(jù)特征的時(shí)候帶來的變化:首先是不需要像預(yù)排序算法那樣去存儲(chǔ)每一個(gè)排序后數(shù)據(jù)的序列,也就是下圖灰色的表,在LightGBM中,這部分的計(jì)算代價(jià)是0;第二個(gè),一般bin會(huì)控制在一個(gè)比較小的范圍,所以我們可以用更小的內(nèi)存來存儲(chǔ)
    b. 計(jì)算上的優(yōu)勢(shì)

    針對(duì)稀疏特征優(yōu)化? 對(duì)于稀疏的特征只需要O(2 * 非零值的樣本個(gè)數(shù))的時(shí)間復(fù)雜度來構(gòu)造直方圖

    計(jì)算上的優(yōu)勢(shì)則主要體現(xiàn)在“數(shù)據(jù)分割”。決策樹算法有兩個(gè)主要操作組成,一個(gè)是“尋找分割點(diǎn)”,另一個(gè)是“數(shù)據(jù)分割”。從算法時(shí)間復(fù)雜度來看,Histogram 算法和 pre-sorted 算法在“尋找分割點(diǎn)”的代價(jià)是一樣的,都是O(#feature*#data)。而在“數(shù)據(jù)分割”時(shí),pre-sorted 算法需要O(#feature*#data),而 histogram 算法是O(#data)。因?yàn)?pre-sorted 算法的每一列特征的順序都不一樣,分割的時(shí)候需要對(duì)每個(gè)特征單獨(dú)進(jìn)行一次分割。Histogram算法不需要排序,所有特征共享同一個(gè)索引表,分割的時(shí)候僅需對(duì)這個(gè)索引表操作一次就可以。(更新:這一點(diǎn)不完全正確,pre-sorted 與 level-wise 結(jié)合的時(shí)候,其實(shí)可以共用一個(gè)索引表(row_idx_to_tree_node_idx)。然后在尋找分割點(diǎn)的時(shí)候,同時(shí)操作同一層的節(jié)點(diǎn),省去分割的步驟。但這樣做的問題是會(huì)有非常多隨機(jī)訪問,有很大的chche miss,速度依然很慢。

    另一個(gè)計(jì)算上的優(yōu)勢(shì)則是大幅減少了計(jì)算分割點(diǎn)增益的次數(shù)。對(duì)于一個(gè)特征,pre-sorted 需要對(duì)每一個(gè)不同特征值都計(jì)算一次分割增益 時(shí)間為(#data),而 histogram 直方圖算法只需要遍歷桶就行了,只需要計(jì)算 #bin (histogram 的橫軸的數(shù)量) 次。

    最后,在數(shù)據(jù)并行的時(shí)候,用 histgoram 可以大幅降低通信代價(jià)。用 pre-sorted 算法的話,通信代價(jià)是非常大的(幾乎是沒辦法用的)。所以 xgoobst 在并行的時(shí)候也使用 histogram 進(jìn)行通信。

    histogram 算法也有缺點(diǎn):

    • 當(dāng)然,Histogram算法并不是完美的。由于特征被離散化后,找到的并不是很精確的分割點(diǎn),訓(xùn)練誤差沒有 pre-sorted 好, 所以會(huì)對(duì)結(jié)果產(chǎn)生影響。但在不同的數(shù)據(jù)集上的結(jié)果表明,離散化的分割點(diǎn)對(duì)最終的精度影響并不是很大,甚至有時(shí)候會(huì)更好一點(diǎn)。原因是決策樹本來就是弱模型,分割點(diǎn)是不是精確并不是太重要;較粗的分割點(diǎn)也有正則化的效果,可以有效地防止過擬合;即使單棵樹的訓(xùn)練誤差比精確分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下沒有太大的影響。
    • 預(yù)處理能夠忽略零值特征,減少訓(xùn)練代價(jià);而直方圖不能對(duì)稀疏進(jìn)行優(yōu)化,只是計(jì)算累加值(累加梯度和樣本數(shù))。但是,LightGBM 對(duì)稀疏進(jìn)行了優(yōu)化:只用非零特征構(gòu)建直方圖。

    LightGBM 為何使用直方圖這種比較粗的分割節(jié)點(diǎn)方法,還能達(dá)到比較好的效果?

    雖然分割的精度變差了,但是對(duì)最后結(jié)果的影響不是很大,主要由于決策樹是弱模型, 分割點(diǎn)是不是精確并不是太重要 ;較粗的分割點(diǎn)也有正則化的效果,可以有效地防止過擬合;即使單棵樹的訓(xùn)練誤差比精確分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下沒有太大的影響。

    xgboost的近似直方圖算法也類似于lightgbm這里的直方圖算法,為什么xgboost的近似算法比lightgbm還是慢很多呢?
    xgboost在每一層都動(dòng)態(tài)構(gòu)建直方圖, 因?yàn)閤gboost的直方圖算法不是針對(duì)某個(gè)特定的feature,而是所有feature共享一個(gè)直方圖(每個(gè)樣本的權(quán)重是二階導(dǎo)),所以每一層都要重新構(gòu)建直方圖,而lightgbm中對(duì)每個(gè)特征都有一個(gè)直方圖,所以構(gòu)建一次直方圖就夠了。

    3 帶深度限制的Leaf-wise的葉子生長(zhǎng)策略

    LightGBM使用了帶有深度限制的節(jié)點(diǎn)展開方法(Leaf-wise)來提高模型精度,這是比XGBoost中Level-wise更高效的方法。

    它可以降低訓(xùn)練誤差得到更好的精度。但是單純的使用Leaf-wise可能會(huì)生長(zhǎng)出比較深的樹,在小數(shù)據(jù)集上可能會(huì)造成過擬合,因此在Leaf-wise之上多加一個(gè)深度限制. 它拋棄了大多數(shù) GBDT 工具使用的按層生長(zhǎng)(level-wise) 的決策樹生長(zhǎng)策略,而使用了帶有深度限制的按葉子生長(zhǎng) (leaf-wise) 算法。 level-wise 過一次數(shù)據(jù)可以同時(shí)分裂同一層的葉子,容易進(jìn)行多線程優(yōu)化,不容易過擬合。

    Level-wise(xgboost)過一次數(shù)據(jù)可以同時(shí)分裂同一層的葉子,容易進(jìn)行多線程優(yōu)化,也好控制模型復(fù)雜度,不容易過擬合。但實(shí)際上Level-wise是一種低效算法,因?yàn)樗患訁^(qū)分的對(duì)待同一層的葉子,帶來了很多沒必要的開銷,因?yàn)閷?shí)際上很多葉子的分裂增益較低,沒必要進(jìn)行搜索和分裂。

    Leaf-wise是一種更為高效的策略:每次從當(dāng)前所有葉子中,找到分裂增益最大的一個(gè)葉子,然后分裂,如此循環(huán)。因此同Level-wise相比,在分裂次數(shù)相同的情況下,Leaf-wise可以降低更多的誤差,得到更好的精度。

    Leaf-wise的缺點(diǎn):可能會(huì)長(zhǎng)出比較深的決策樹,產(chǎn)生過擬合。因此LightGBM在Leaf-wise之上增加了一個(gè)最大深度限制,在保證高效率的同時(shí)防止過擬合。

    4、直方圖做差優(yōu)化

    LightGBM還使用了直方圖做差的優(yōu)化,達(dá)到了兩倍的加速。

    可以觀察到:一個(gè)葉子節(jié)點(diǎn)的直方圖,可以由它的父親節(jié)點(diǎn)的直方圖減去它的兄弟節(jié)點(diǎn)的直方圖得到。

    通常構(gòu)造直方圖,需要遍歷該葉子上的所有數(shù)據(jù),但直方圖做差僅需遍歷直方圖的 k 個(gè)桶。利用這個(gè)方法,LightGBM 可以在構(gòu)造一個(gè)葉子的直方圖后,可以用非常微小的代價(jià)得到它兄弟葉子的直方圖,在速度上可以提升一倍。

    根據(jù)這一點(diǎn)我們可以構(gòu)造出來數(shù)據(jù)量比較小的葉子節(jié)點(diǎn)上的直方圖,然后用直方圖做差來得到數(shù)據(jù)量比較大的葉子節(jié)點(diǎn)上的直方圖,從而達(dá)到加速的效果。

    5、 增加緩存命中率

    預(yù)排序算法中有兩個(gè)頻繁的操作會(huì)導(dǎo)致cache-miss,也就是緩存消失(對(duì)速度的影響很大,特別是數(shù)據(jù)量很大的時(shí)候,順序訪問比隨機(jī)訪問的速度快4倍以上 ?)。

  • 對(duì)梯度的訪問:在計(jì)算增益的時(shí)候需要利用梯度,對(duì)于不同的特征,訪問梯度的順序是不一樣的,并且是隨機(jī)的
  • 對(duì)于索引表的訪問:預(yù)排序算法使用了行號(hào)和葉子節(jié)點(diǎn)號(hào)的索引表,防止數(shù)據(jù)切分的時(shí)候?qū)λ械奶卣鬟M(jìn)行切分。同訪問梯度一樣,所有的特征都要通過訪問這個(gè)索引表來索引。都是隨機(jī)的訪問,會(huì)給系統(tǒng)性能帶來非常大的下降。
  • LightGBM使用的直方圖算法能很好的解決這類問題。首先。對(duì)梯度的訪問,因?yàn)椴挥脤?duì)特征進(jìn)行排序,同時(shí),所有的特征都用同樣的方式來訪問,所以只需要對(duì)梯度訪問的順序進(jìn)行重新排序,所有的特征都能連續(xù)的訪問梯度。并且直方圖算法不需要把數(shù)據(jù)id到葉子節(jié)點(diǎn)號(hào)上(不需要這個(gè)索引表,沒有這個(gè)緩存消失問題)

    LightGBM使用直方圖算法則是天然的cache friendly,首先,對(duì)梯度的訪問,因?yàn)椴恍枰獙?duì)feature進(jìn)行排序,同時(shí),所有的feature都采用同樣的方式進(jìn)行訪問,所以只需要對(duì)梯度訪問的順序進(jìn)行一個(gè)重新的排序,所有的feature都能連續(xù)地訪問梯度。

    此外,直方圖算法不需要數(shù)據(jù)id到葉子id的一個(gè)索引表,沒有這樣一個(gè)cache-miss的問題。事實(shí)上,在cache-miss這樣一個(gè)方面,對(duì)速度的影響是很大的,尤其在數(shù)據(jù)量很大的時(shí)候,MRSA研究人員進(jìn)行過測(cè)試,在數(shù)據(jù)量很多的時(shí)候,相比于隨機(jī)訪問,順序訪問的速度可以快4倍以上,這其中速度的差異基本上就是由cache-miss而帶來的。

    6、支持類別特征

    傳統(tǒng)的機(jī)器學(xué)習(xí)一般不能支持直接輸入類別特征,需要先轉(zhuǎn)化成多維的0-1特征,這樣無論在空間上還是時(shí)間上效率都不高。LightGBM通過更改決策樹算法的決策規(guī)則,直接原生支持類別特征,不需要轉(zhuǎn)化,并且通過一些實(shí)驗(yàn),MRSA研究人員驗(yàn)證了直接使用離散特征可以比使用0-1離散化后的特征,提高了近8倍的速度。

    四 支持分布式(并行學(xué)習(xí))

    LightGBM提供以下并行學(xué)習(xí)算法的優(yōu)化:特征并行、數(shù)據(jù)并行、投票并行。

    LightGBM原生支持并行學(xué)習(xí),特征并行(Featrue Parallelization)和數(shù)據(jù)并行(Data Parallelization),還有一種是基于投票的數(shù)據(jù)并行(Voting Parallelization)

    • 特征并行的主要思想是在不同機(jī)器、在不同的特征集合上分別尋找最優(yōu)的分割點(diǎn),然后在機(jī)器間同步最優(yōu)的分割點(diǎn)。
    • 數(shù)據(jù)并行則是讓不同的機(jī)器先在本地構(gòu)造直方圖,然后進(jìn)行全局的合并,最后在合并的直方圖上面尋找最優(yōu)分割點(diǎn)。

  • 特征并行算法中,通過在本地保存全部數(shù)據(jù)避免對(duì)數(shù)據(jù)切分結(jié)果的通信。通常適用于小數(shù)據(jù)且feature比較多的場(chǎng)景
  • 數(shù)據(jù)并行中使用分散規(guī)約 (Reduce scatter) 把直方圖合并的任務(wù)分?jǐn)偟讲煌臋C(jī)器,降低通信和計(jì)算,并利用直方圖做差,進(jìn)一步減少了一半的通信量。則適用于數(shù)據(jù)量比較大,但feature比較少的場(chǎng)景
  • 基于投票的數(shù)據(jù)并行(Voting Parallelization)則進(jìn)一步優(yōu)化數(shù)據(jù)并行中的通信代價(jià),使通信代價(jià)變成常數(shù)級(jí)別。在數(shù)據(jù)量很大的時(shí)候,使用投票并行可以得到非常好的加速效果。適用于數(shù)據(jù)量比較大,feature也比較多的場(chǎng)景。
  • 1 特征并行

    特征并行算法目的是在決策樹生成過程中的每次迭代,高效地找到最優(yōu)特征分裂點(diǎn)。特征并行的主要思想是在不同機(jī)器在不同的特征集合上分別尋找最優(yōu)的分割點(diǎn),然后在機(jī)器間同步最優(yōu)的分割點(diǎn)。

    傳統(tǒng)算法中的特征并行,主要是體現(xiàn)在找到最好的分割點(diǎn),其步驟為:

  • 根據(jù)不同的特征子集,將數(shù)據(jù)集進(jìn)行垂直切分。(不同機(jī)器worker有不同的特征子集)
  • 每個(gè)worker尋找局部的最優(yōu)分裂(包括特征,閾值)以及分裂點(diǎn)
  • 不同worker之間進(jìn)行網(wǎng)絡(luò)傳輸,交換最優(yōu)分裂信息,最終得到最優(yōu)的分裂信息。
  • 具有最優(yōu)分裂特征的worker,局部進(jìn)行分裂,并將分裂結(jié)果廣播到其他worker。
  • 其他worker根據(jù)接收到的數(shù)據(jù)進(jìn)行切分?jǐn)?shù)據(jù)。
  • 傳統(tǒng)特征并行的缺點(diǎn):

  • 計(jì)算成本較大,傳統(tǒng)特征并行沒有實(shí)現(xiàn)得到"split"(時(shí)間復(fù)雜度為“O(訓(xùn)練樣本的個(gè)數(shù))")的加速。當(dāng)數(shù)據(jù)量很大的時(shí)候,難以加速;
  • 需要對(duì)劃分的結(jié)果進(jìn)行通信整合,其額外的時(shí)間復(fù)雜度約為 “O(訓(xùn)練樣本的個(gè)數(shù)/8)”(一個(gè)數(shù)據(jù)一個(gè)字節(jié));
  • LightGBM中的并行特征

    由于特征并行在訓(xùn)練樣本的個(gè)數(shù)大的時(shí)候不能很好地加速,LightGBM做了以下優(yōu)化:不是垂直分割數(shù)據(jù),而是每個(gè)線程都擁有完整的全部數(shù)據(jù)。因此,LightGBM不需要為分割數(shù)據(jù)結(jié)果進(jìn)行通信,因?yàn)槊總€(gè)線程都知道如何劃分?jǐn)?shù)據(jù)。并且訓(xùn)練樣本的個(gè)數(shù)不會(huì)變大,因此這種方案是合理的。

    LightGBM中實(shí)現(xiàn)特征并行的過程:

  • 每個(gè)worker在本地?cái)?shù)據(jù)集上找到最佳分割點(diǎn),包括特征,閾值;
  • worker間傳輸最優(yōu)分裂信息,并得到全局最優(yōu)分裂信息。
  • 每個(gè)worker基于全局最優(yōu)分裂信息,在本地進(jìn)行數(shù)據(jù)分裂,生成決策樹。
  • 但是這樣仍然有缺點(diǎn):

  • split過程的復(fù)雜度仍是O(#data),當(dāng)數(shù)據(jù)量大的時(shí)候效率不高
  • 每個(gè)worker保存所有數(shù)據(jù),存儲(chǔ)代價(jià)高
  • 因此,建議在數(shù)據(jù)量很大時(shí)使用數(shù)據(jù)并行。

    ?

    2 數(shù)據(jù)并行

    傳統(tǒng)算法數(shù)據(jù)并行旨在并行化整個(gè)決策學(xué)習(xí)。數(shù)據(jù)并行的過程是:

  • 水平劃分?jǐn)?shù)據(jù)
  • 每個(gè)worker基于數(shù)據(jù)集構(gòu)建局部特征直方圖(Histogram)
  • 歸并所有局部的特征直方圖,得到全局直方圖
  • 在全局直方圖中找到最優(yōu)分裂信息,進(jìn)行數(shù)據(jù)分裂.
  • 在第3步中,有兩種合并的方式:

    • 采用點(diǎn)對(duì)點(diǎn)方式(point-to-point communication algorithm)進(jìn)行通訊,每個(gè)worker通訊量為O(#machine?#feature?#bin)
    • 采用collective communication algorithm(如“All Reduce”)進(jìn)行通訊(相當(dāng)于有一個(gè)中心節(jié)點(diǎn),通訊后在返回結(jié)果),每個(gè)worker的通訊量為O(2?#feature?#bin)

    可以看出通信的代價(jià)是很高的,這也是數(shù)據(jù)并行的缺點(diǎn) 通信成本高。如果使用點(diǎn)對(duì)點(diǎn)通信算法,則一臺(tái)機(jī)器的通信成本約為O(#machine * #feature * #bin)。如果使用聚合通信算法(例如“All Reduce”),通信成本約為O(2 * #feature * #bin)。

    LightGBM中的數(shù)據(jù)并行

    LightGBM中通過下面方法來降低數(shù)據(jù)并行的通信成本:

  • 不同于“整合所有本地直方圖以形成全局直方圖”的方式,LightGBM算法使用Reduce Scatter并行算子歸并來自不同worker的不同特征子集的直方圖,然后在局部歸并的直方圖中找到最優(yōu)局部分裂信息,最終同步找到最優(yōu)的分裂信息
  • LightGBM使用直方圖減法加快訓(xùn)練速度。我們只需要對(duì)其中一個(gè)子節(jié)點(diǎn)進(jìn)行數(shù)據(jù)傳輸,另一個(gè)子節(jié)點(diǎn)可以通過相鄰直方圖上作減法 histogram subtraction得到。
  • 通過上述方法,LightGBM 將數(shù)據(jù)并行中的通訊開銷減少到O(0.5 * #feature * #bin)。

    第一步,使用本地?cái)?shù)據(jù)計(jì)算特征分桶,并將特征值壓縮為 int 桶號(hào);

    第二步,本地計(jì)算所有特征的直方圖,通過 reducescatter 得到每個(gè) work 分配到的那兩個(gè)特征的全局直方圖;

    第三步,每個(gè) work 求出本地最優(yōu)分裂(最優(yōu)分裂節(jié)點(diǎn),分裂的特征,以及特征的分裂閾值);通過全局歸約得到全局最優(yōu)分裂;

    第四步,每個(gè) work 根據(jù)全局最優(yōu)分裂對(duì)本地模型進(jìn)行分裂。計(jì)算葉子節(jié)點(diǎn)的權(quán)重;

    第五步,重新計(jì)算分裂出的葉子節(jié)點(diǎn)的直方圖,重復(fù) 2,3,4 步驟直到收斂;

    ?

    分桶并行化

    計(jì)算特征分桶是求直方圖的先決條件,給定每個(gè)特征要分成的桶數(shù),計(jì)算每桶的特征值上下界。在分布式計(jì)算中,每個(gè) work 計(jì)算自己負(fù)責(zé)的特征的 bin_mapper,之后再通過 allreduce 得到所有特征的 bin_mapper。最后可以根據(jù) bin_mapper,將 float 的特征值映射到 bin 中,就可以用 int 桶編號(hào)來表示

    ?

    直方圖并行化

    本地建立所有特征的直方圖,每個(gè)特征直方圖可以通過遍歷已經(jīng)編碼為 bin_id 的數(shù)據(jù)快速實(shí)現(xiàn),最終得到 6 個(gè)直方圖,包含樣本數(shù),以及樣本的一階二階導(dǎo)數(shù)之和。

    合并全局直方圖,傳統(tǒng)的 xgboost 在這里使用一個(gè) allreduce 操作使每個(gè) work 都同步了 6 個(gè)全局直方圖。但實(shí)際上每個(gè) worker 其實(shí)只需要關(guān)心自己分得的特征的直方圖,這里 lightGBM 對(duì) AllReduce 操作進(jìn)行優(yōu)化,使用 ReduceScatter 算法,最終每個(gè) worker 只得到自己分配到的特征的直方圖,有效的降低了數(shù)據(jù)通信量,提高了訓(xùn)練效率.

    舉例:4 個(gè) worker,R0-R3,總共 8 個(gè)特征,每個(gè) work 已經(jīng)計(jì)算完本地直方圖,下面要進(jìn)行合并直方圖。

    通過遞歸調(diào)用,一半一半的進(jìn)行歸約操作,優(yōu)點(diǎn)是大大減少了通信量,不需要向 AllReduce 每次都需要傳遞所有的信息,這個(gè)通信量是巨大的,缺點(diǎn)是只能用于 2^k worker。

    最佳分裂并行化

    每個(gè) worker 得到分配到的兩個(gè)的特征的全局直方圖之后,即開始在本地遍歷葉子節(jié)點(diǎn)和特征,計(jì)算本地的最大分裂增益及分列方式。采用 allgather+ 本地 reduce 操作得到全局最優(yōu)分裂。

    xgboost 通過 allreduce 方式計(jì)算全局最優(yōu)分裂,而 lgb 采用 allgather+ 本地 reduce 操作得到全局最優(yōu)分裂
    ?

    ?

    整個(gè) AllReduce 有兩個(gè)過程 bottom up 和 bottom down, 完成本地計(jì)算之后,我們需要把多個(gè)本地計(jì)算結(jié)果挑出全局最優(yōu)特征,這個(gè)在 XGB 里面也是基于 all reduce 實(shí)現(xiàn)的。在 LGB 里面使用 all Gather。

    假設(shè)我們有5個(gè)節(jié)點(diǎn),

    第一步: R1 給 R0,這個(gè)時(shí)候 R0 的 V0 是自己的,V1從 R1 拿的(R0有 V0, V1)

    第二步: R2 同步給 R0,這個(gè)時(shí)候 R0 的 V0 是自己的,V2、V3 從 R2 拿的 (R0有 V0, V1, V2, V3)

    第三步: 五個(gè)節(jié)點(diǎn)的內(nèi)容 R0 知道了四個(gè)。最終通過補(bǔ)全的方式,比如 R4 把剩下的幾個(gè)結(jié)果一一補(bǔ)到對(duì)應(yīng)的位置上去,通過這樣的過程,每個(gè)節(jié)點(diǎn)都知道整個(gè)集群里面我對(duì)應(yīng)的結(jié)果是怎么樣。

    第四步:然后在本地做一次 reduce 操作,這樣每個(gè)節(jié)點(diǎn)都知道全局的結(jié)果。

    在存儲(chǔ)和計(jì)算上面,AllGather 和 AllReduce 相比有什么不一樣呢?

    存儲(chǔ)上,左節(jié)點(diǎn)接收一個(gè),右節(jié)點(diǎn)接收一個(gè),累計(jì)的結(jié)果往上傳,看過 AllReduce 代碼后我們會(huì)發(fā)現(xiàn)這個(gè)只需要一份內(nèi)存 +Buff 的空間,比較節(jié)約空間,AllGather 呢?只要有幾個(gè)節(jié)點(diǎn),我就會(huì)存儲(chǔ)幾個(gè)結(jié)果;計(jì)算上,和 AllReduce 對(duì)比,少一次 BottomDown 廣播;綜上 AllGather 會(huì)更加吃內(nèi)存、速度會(huì)更加快,而樹模型本身占的空間并不大,這個(gè)也是 AllGather 在樹模型上適用的原因

    ?

    3 投票并行

    LightGBM采用一種稱為PV-Tree的算法進(jìn)行投票并行(Voting Parallel),其實(shí)這本質(zhì)上也是一種數(shù)據(jù)并行

    PV-Tree和普通的決策樹差不多,只是在尋找最優(yōu)切分點(diǎn)上有所不同。

  • 水平切分?jǐn)?shù)據(jù),不同的worker擁有部分?jǐn)?shù)據(jù)。
  • Local voting: 每個(gè)worker構(gòu)建直方圖,找到top-k個(gè)最優(yōu)的本地劃分特征
  • Global voting: 中心節(jié)點(diǎn)聚合得到最優(yōu)的top-2k個(gè)全局劃分特征(top-2k是看對(duì)各個(gè)worker選擇特征的個(gè)數(shù)進(jìn)行計(jì)數(shù),取最多的2k個(gè))
  • Best Attribute Identification: 中心節(jié)點(diǎn)向worker收集這top-2k個(gè)特征的直方圖,并進(jìn)行合并,然后計(jì)算得到全局的最優(yōu)劃分
  • 中心節(jié)點(diǎn)將全局最優(yōu)劃分廣播給所有的worker,worker進(jìn)行本地劃分。
  • 投票并行進(jìn)一步降低了數(shù)據(jù)并行中的通信成本,使其減少至常數(shù)級(jí)別。它使用兩階段投票來降低特征直方圖的通信成本

    可以看出,PV-tree將原本需要#feature×#bin 變?yōu)榱?k×#bin,通信開銷得到降低。此外,可以證明,當(dāng)每個(gè)worker的數(shù)據(jù)足夠多的時(shí)候,top-2k個(gè)中包含全局最佳切分點(diǎn)的概率非常高。

    4 網(wǎng)絡(luò)通信的優(yōu)化

    在LightGBM的并行學(xué)習(xí)中,它只需要使用一些聚合通信算法,如“All reduce”,“All gather”和“Reduce scatter”。LightGBM實(shí)現(xiàn)了最先進(jìn)的state-of-art算法。這些聚合通信算法可以提供比點(diǎn)對(duì)點(diǎn)通信更好的性能

    [機(jī)器學(xué)習(xí)] LightGBM中常用并行計(jì)算算子原理以及在LightGBM中的具體實(shí)現(xiàn)

    ?

    ?

    五、支持的應(yīng)用和度量

    1 應(yīng)用

    • 回歸,目標(biāo)函數(shù)是L2損失
    • 二進(jìn)制分類,目標(biāo)函數(shù)是logloss(對(duì)數(shù)損失)
    • 多分類
    • 交叉熵,目標(biāo)函數(shù)是logloss,支持非二進(jìn)制標(biāo)簽的訓(xùn)練
    • lambdarank,目標(biāo)函數(shù)為基于NDCG的lambdarank

    2 度量

    • L1 loss:絕對(duì)值損失
    • L2 loss:MSE,平方損失
    • Log loss:對(duì)數(shù)損失
    • 分類錯(cuò)誤率
    • AUC(Area Under Curve):ROC曲線下的面積
    • NDCG(Normalized Discounted Cumulative Gain):歸一化折損累積增益
    • MAP(Mean Average Precision):平均精度均值
    • 多類別對(duì)數(shù)損失
    • 多類別分類錯(cuò)誤率
    • Fair損失
    • Huber損失
    • Possion:泊松回歸
    • Quantile:分位數(shù)回歸
    • MAPE(Mean Absolute Percent Error):平均絕對(duì)百分比誤差
    • kullback_leibler:Kullback-Leibler divergence
    • gamma:negative log-likelihood for Gamma regression
    • tweedie:negative log-likelihood for Tweedie regression
    • 更多閱讀原文

    3 其他

    • 限制樹的最大深度max_depth
    • DART:Dropouts meet Multiple Additive Regression Trees
    • L1 / L2正則化
    • 套袋
    • 隨即選擇列(特征)子集
    • Continued train with input GBDT model
    • Continued train with the input score file
    • Weighted training
    • Validation metric output during training
    • 交叉驗(yàn)證
    • Multi metrics
    • 提前停止(訓(xùn)練和預(yù)測(cè))
    • Prediction for leaf index

    ?

    參考:

    https://fuhailin.github.io/LightGBM/

    總結(jié)

    以上是生活随笔為你收集整理的[机器学习] Boosting算法4 --- LightGBM介绍与分布式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。