論文標題:《DeepGBM: A Deep Learning Framework Distilled by GBDT for Online Prediction Tasks》
論文地址:https://www.microsoft.com/en-us/research/publication/deepgbm-a-deep-learning-framework-distilled-by-gbdt-for-online-prediction-tasks/
背景
目前兩種主流的算法在在線學習推薦系統(tǒng)中被廣泛的應(yīng)用,包括以GBDT為主的tree-model,以及NN模型(wide and deep、deepfm等)。但是目前這兩種學習方法都有各自無法解決的困難。
首先GBDT在處理密集的連續(xù)型數(shù)值特征中表現(xiàn)出非常好的學習性能和效果,但是GBDT不能進行在線學習也不能很好的處理大量的稀疏特征,因為GBDT通常需要訓練全量的數(shù)據(jù)而不能進行局部的更新,而且大量的稀疏特征會帶來過擬合和空間爆炸的風險。,
其次NN能進行在線學習做到按batch進行更新,也能通過embeding的手段很好的處理大量的稀疏特征,但是在處理連續(xù)性特征的能力上卻遠遠不如GBDT。
盡管已經(jīng)有很多研究將這兩種方法整合,嘗試去融合兩者的優(yōu)點,但是卻仍然達不到。
相關(guān)工作
就像我們之前提到的,我們現(xiàn)在將GBDT和NN廣泛的應(yīng)用于在線推薦系統(tǒng)中。下面我們首先回顧一下現(xiàn)在很多將GBDT和NN結(jié)合起來去解決他們各自缺點,融合他們優(yōu)點的一些相關(guān)工作。并且基于之前的經(jīng)驗去構(gòu)建一個有效的在線學習的模型。
我們之前提到過,GBDT用于在線學習主要是會存在兩個問題,一個是tree model的不可拆分性,導致tree model不能局部更新,而是需要經(jīng)過大量的離線數(shù)據(jù)的訓練。第二個是GBDT不能非常有效的處理稀疏型的類別特征。基于這兩個缺點,我們先回顧一下大家為了解決這個問題所做的一些工作。
1.有一部分研究嘗試用流式的數(shù)據(jù)來訓練tree model,但是這種方式只能用在單個tree model和并行的tree model適應(yīng),對于gbdt這種boosting的模型就不太適用了。而且這種模型拋棄掉了歷史的數(shù)據(jù)、只用更新的數(shù)據(jù)會有偏。
2.對于gbdt不能處理稀疏的類別特征,因為不平衡的稀疏特征的分布的信息增益非常小。很多的研究嘗試將稀疏的類別特征編碼成連續(xù)性特征,但是這些編碼方式會損失掉很多信息。還有一些方法會直接枚舉左右的二進制分區(qū),但是由于我們的特征稀疏,只有少量的數(shù)據(jù)是有值的,這樣會導致過擬合。
3.還有很多方式將GBDT和NN結(jié)合,如Deepforest和mGBDT等,但是他們都不能解決這兩個關(guān)鍵的問題。
對于NN的改造,現(xiàn)在很多的NN的方式都集中于解決大量的稀疏特征,而對于連續(xù)性的特征并沒有很好的解決,F(xiàn)CNN為了解決這種辦法才去全鏈接的方式來解決稠密連續(xù)特征。但是FCNN的性能不能滿足要求。因為全連接會帶來復雜的網(wǎng)絡(luò)結(jié)構(gòu)使得超參數(shù)的學習變得非常的復雜而且容易陷入局部最優(yōu)解。另外的方式是直接把稠密的數(shù)值特征離散化,但是離散化帶來的非線性特征使得模型變得復雜而且容易過擬合。
對于NN+gbdt組合的改造,主要有三類:
1.Tree-like NN
2.Convert Trees to NN
3.Combining NN and GBDT:直接將GBDT和NN組合,facebook直接將GBDT的葉子結(jié)點組合作為NN的類別特征喂給NN。Microsoft使用GBDT去訓練NN的殘差,但是這些都沒有解決模型的線上問題
deepGBM結(jié)構(gòu)
本文提出的deepGBM主要包含兩部分:CatNN和GBDT2NN,結(jié)構(gòu)示意圖如下:

GBDT2NN for Dense Numerical Features
目前很多的研究方法只將GBDT的輸出作為輸入放入NN中去學習,這樣會損失tree model的結(jié)構(gòu)和很多的信息。本文我們用NN去模擬GBDT的結(jié)構(gòu)。盡可能多的獲取GBDT的結(jié)構(gòu)信息。
1.特征選擇。對于單顆樹的蒸餾,我們可以將GBDT使用的特征的index輸入到NN中,而不是將所有的特征都輸入到NN中去。我們知道NN的模型是對所有的特征進行學習,沒有特征選擇的過程,而根據(jù)GBDT的原理,tree model的產(chǎn)生并不依賴于所有的特征,而是只選擇部分的特征來做樹的分裂和抉擇。所以NN直接將用GBDT用到的特征來構(gòu)建GBDT的結(jié)構(gòu)。我們約定It 作為樹t選擇的特征。所以我們選擇用x[It]作為NN模型的輸入。
2.樹結(jié)構(gòu)。 根據(jù)樹模型的特征會將不同label的樣本分到不同的結(jié)點中,而同一結(jié)點的label是一樣的。所以我們使用以下公式來近似我們的這種樹結(jié)構(gòu):

其中n是樣本的數(shù)量,N()表示NN的網(wǎng)絡(luò)結(jié)構(gòu),0表示網(wǎng)絡(luò)的參數(shù), Lt,i是當前結(jié)點輸出的葉子結(jié)點的onehot的表示形式。L是損失函數(shù),如logloss等。
3.樹模型的輸出。通過上述的學習,我們只需要知道我們的樹結(jié)構(gòu)(葉子結(jié)點index)到模型輸出的映射關(guān)系就可以了。這種index到value的相關(guān)性的表示為pt = lt * qt,qt表示當前樹的values。所以最終模型的輸出可以表示為:

以上是我們對單顆樹的蒸餾,然后GBDT作為一種boosting的算法,經(jīng)常是有很多的樹組成的,那么對于多棵樹的蒸餾又是怎樣的呢?
對于多棵樹的蒸餾我們主要提出了兩種方法。首先為了減少樹結(jié)構(gòu)的維度,我們可以將葉子結(jié)點由原先的onehot方式變?yōu)橛成涞揭粋€低維的embedding空間中。

其中wt和w0都是trainable的參數(shù),pt,i是leaf index對應(yīng)的value值。Ht,i是我們輸出的embedding值。L是和樹訓練時一樣的loss函數(shù)。
所以現(xiàn)在模型的學習目標變?yōu)?/p>

其次我們將一定數(shù)量的tree進行組合,讓他們共享embedding的參數(shù),這樣能減少模型訓練的復雜度。組合的方式有很多種,你可以選擇模型結(jié)構(gòu)高度相似的trees進行組合,或隨機組合。本文選擇隨機組合,將m顆樹分為k組,那么每個組合包含m/k樹。所以現(xiàn)在的embedding損失變?yōu)椋?br>

而模型的訓練目標變?yōu)椋?br>

模型最后的輸出為:
