DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks

DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks

論文鏈接:https://dl.acm.org/citation.cfm?id=3330858
代碼鏈接:https://github.com/motefly/DeepGBM

背景

Guolin Ke是lightgbm的核心作者之一,我幸運的作爲Hui Xue的實習生去參加了NIPS2018的表數據的AutoML比賽,這個比賽中的三個數據集也被這篇論文選爲benchmark的測試數據集,他們對錶數據的理解非常深刻,這篇論文是他們在KDD2019的投稿,這篇論文本身寫的很好,通俗易懂,我讀完後再從自己的角度用大白話講一下,方便大家對這篇文章的理解。

表數據的輸入類型從業務角度可以有多種,比如時間列,離散列,連續值列,多值列,字典列(key-value對兒),但是從模型的角度看只有兩種,離散列和連續值列,目前我見過的表數據的AutoML也都是把業務類型的有實際意義的列變換成離散列和連續值列這兩種情況,比如時間列我們可以做一些時間特徵(提取年月日時分秒,是否是週末),多值列可以用tfidf提取特徵,字典列可以展開當做稀疏的特徵。

在表數據上競賽圈目前大家最常用的模型就是gbdt(lightgbm, xgboost),FM/FFM(xlearn)

概述

經典模型各有優劣,主要是兩個角度,離散值還是連續值,在線場景還是離線場景。

挑戰

  1. gbdt在連續值,離線場景下表現非常好,但是在離散值多且在線場景下表現很差,原因是離散值很多如果做one-hot的話太稀疏樹很難生長,如果不做one-hot直接扔進模型的話會很容易過擬合當前的數據集,trading-off是用一些不如one-hot稀疏的encoding方法,但是多少會丟一些信息。在線場景很難更新當前樹的結構,需要重新利用新的統計信息重新構建樹,所以在線場景效率很低,不改變結構更新樹的方法也有,比如改變葉子節點的值但是這種方法效果都不太好。

  2. LR和NN,FM這類模型在離散值上處理的很好,且可以在線更新,但是連續值較多的情況下效果遠差於gbdt。

DeepGBM希望可以結合模型各自的優點,所以點主要在於如何結合上:

離散值給CatNN,連續值給GBDT2NN。

CatNN是把離散值one-hot以後學一個embedding,用一些對離散值效果好的模型預測然後ensemble,比如FM和NN。
GBDT2NN是先訓練一個gbdt,然後把gbdt轉成NN(期望相同輸入有相同輸出,用不同的方法擬合同一個東西),這篇論文還有一個點在於如果更好的把gbdt轉成NN。

拿CatNN和GBDT2NN的結果做一個ensemble得到最後的結果。

離線場景:

  1. 拆分數據爲離散數據,連續數據
  2. 利用離散數據訓練CatNN,利用連續數據訓練GBDT
  3. 把GBDT轉成NN並訓練。
  4. ensemble CatNN和GBDT2NN

在線場景下更新的時候只更新CatNN。

total

GBDT2NN

下面重點講一下他是如何訓練GBDT2NN的:
先講如果是一棵樹的話怎麼做,再講如何擴展到有多棵樹。

Single Tree Distillation

我們的目的是用一個NN來擬合出這顆樹,對相同的輸入有相同的輸出。

  1. Tree-Selected Features
    相比NN來說,用樹的一個好處是樹不會用所有的特徵,他只用一部分,我們訓練的這個NN只使用樹使用過的特徵當做輸入,這樣會大大加速NN訓練的過程,相當於是用樹做了特徵選擇,我們做時間和效果的trading-off的時候也可以通過控制列選用比例來加速,因爲樹的特徵選擇是可以給出特徵的重要性排序的。

  2. Tree Structure
    NN的擬合能力很強,我們用NN來擬合一個樹的結構,對於一個輸入樣本,樹可以返回這個樣本的葉子節點的編號,是一個one-hot的向量,NN要去擬合的就是這個過程,對於一個樣本,期望返回和樹一樣的葉子節點的編號(一個one-hot的向量)。

Single Tree

  1. Tree Outputs
    因爲我們在第二步擬合結構的時候輸出就是一個one-hot的葉子節點的編號,所以這個輸出我們直接用樹原來的葉子節點的值就好。

Multiple Tree Distillation

當我們有多棵樹的時候,最簡單的辦法是每一顆樹像之前那樣訓練一個NN,但是這樣複雜度太高了,我們通過Leaf embedding和Tree Grouping對這個過程進行加速。

Leaf Embedding Distillation

加一層fully-connected層做embedding,把稀疏的one-hot向量變成一個密集向量,然後再訓練得到一個Leaf Output。

Leaf Embedding

Tree Grouping

Leaf Embedding減少了每一顆樹的維度,我們通過Tree Grouping來減少NN的數目。

Tree Grouping是從gbdt的所有樹種分組,每一組訓練一個NN,deepgbm用的方法是隨機選樹進行分組,每個組樹的顆數一樣,每個組內的one-hot向量concat起來,然後就和之前一樣一個組訓練一個NN就好了。

實驗

experiment

圖中對比了當前SOTA的模型在這幾個數據集下面的情況,結果我還沒有復現,打算先讀一下作者的源碼,復現了論文的結果,然後在自己的框架裏面搭一套試試怎麼樣,會在接下來嘗試一下,看論文的實驗結果還是不錯的,但是中間有一些細節需要再琢磨一下,比如參數的設置,特徵工程等等,因爲在實際使用的時候特徵工程可能遠不止這些,已經ensemble這個過程怎麼調比較合適等等。
看完這篇paper我覺得收穫主要在於在什麼情況下用什麼模型,這個結構是什麼樣的,以及看看9102年大家是如何理解這個問題的,如果只是爲了簡單,穩定,效果還不錯,那就用一個單lightgbm效果就還可以了。

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