計算廣告領域中數據特點:
1 正負樣本不平衡
2 大量id類特征,高維,多領域(一個類別型特征就是一個field,比如上面的Weekday、Gender、City這是三個field),稀疏
在電商領域,CTR預估模型的原始特征數據通常包括多個類別,比如[Weekday=Tuesday,
Gender=Male, City=London, CategoryId=16],這些原始特征通常以獨熱編碼(one-hot encoding)的方式轉化為高維稀疏二值向量,多個域(類別)對應的編碼向量鏈接在一起構成最終的特征向量。
高維、稀疏、多Field是輸入給CTR預估模型的特征數據的典型特點。以下介紹的模型都假設特征數據滿足上述規律,那些只適用於小規模數據量的模型就不介紹了。
常用模型如下:
1 LR 2 LR+GBDT 3 FM或者FFM 4 混合邏輯回歸MLR
5 WDL 6 FNN (Factorization-machine supported Neural Network)
7. PNN(Product-based Neural Networks) 8.DeepFM 9.DIN
本文將從多種視角來觀察這些模型,如輸入數據的特點、從神經網絡的視角,網絡結構的組成方式,串並聯結構,特征組合的方式等等。
首先從三種基本模型展開
LR ->(LR, MLR, GBDT+LR)
FM -> (FM, FFM)
DNN與FM的結合 (embedding +MLP)
1 串聯(改進FM元素乘法) FM改進后加DNN FNN(FM預訓練得到嵌入向量) PNN NFM AFM
2 並聯(改進DNN,引入resnet) WDL、DeepFM、 DeepCrossNetWork
交叉方式: bit-wise和vector-wise
plain-DNN(MLP)的高階特征交互建模是元素級的(bit-wise),也就是說同一個域對應的embedding向量中的元素也會相互影響。
FM類方法是以向量級(vector-wise)的方式來構建高階交叉關系。 經驗上,vector-wise的方式構建的特征交叉關系比bit-wise的方式更容易學習。
1 LR家族
1 LR:
LR模型是廣義線性模型,從其函數形式來看,LR模型可以看做是一個沒有隱層的神經網絡模型(感知機模型)
LR模型一直是CTR預估問題的benchmark模型,由於其簡單、易於並行化實現、可解釋性強等優點而被廣泛使用。然而由於線性模型本身的局限,不能處理特征和目標之間的非線性關系,因此模型效果嚴重依賴於算法工程師的特征工程經驗。為了讓線性模型能夠學習到原始特征與擬合目標之間的非線性關系,通常需要對原始特征做一些非線性轉換。常用的轉換方法包括:連續特征離散化、特征之間的交叉等。
LR的優化算法FTRL:
2 GBDT + LR
GBDT模型能夠學習高階非線性特征組合,對應樹的一條路徑(用葉子節點來表示)。通常把一些連續值特征、值空間不大的categorical特征都丟給GBDT模型;空間很大的ID特征(比如商品ID)留在LR模型中訓練,既能做高階特征組合又能利用線性模型易於處理大規模稀疏數據的優勢。
3 混合邏輯回歸(MLR)
MLR算法是alibaba在2012年提出並使用的廣告點擊率預估模型,2017年發表出來。MLR模型是對線性LR模型的推廣,它利用分片線性方式對數據進行擬合。基本思路是采用分而治之的策略:如果分類空間本身是非線性的,則按照合適的方式把空間分為多個區域,每個區域里面可以用線性的方式進行擬合,最后MLR的輸出就變為了多個子區域預測值的加權平均。如下圖(C)所示,就是使用4個分片的MLR模型學到的結果。
上式即為MLR的目標函數,其中 為分片數(當
時,MLR退化為LR模型);
是聚類參數,決定分片空間的划分,即某個樣本屬於某個特定分片的概率;
是分類參數,決定分片空間內的預測;
和
都是待學習的參數。最終模型的預測值為所有分片對應的子模型的預測值的期望。
MLR模型在大規模稀疏數據上探索和實現了非線性擬合能力,在分片數足夠多時,有較強的非線性能力;同時模型復雜度可控,有較好泛化能力;同時保留了LR模型的自動特征選擇能力。
MLR模型的思路非常簡單,難點和挑戰在於MLR模型的目標函數是非凸非光滑的,使得傳統的梯度下降算法並不適用。相關的細節內容查詢論文:Gai et al, “Learning Piece-wise Linear Models from Large Scale Data for Ad Click Prediction” 。
另一方面,MLR模型可以看作帶有一個隱層的神經網絡。如下圖, 是大規模的稀疏輸入數據,MLR模型第一步是做了一個Embedding操作,分為兩個部分,一種叫聚類Embedding(綠色),另一種是分類Embedding(紅色)。兩個投影都投到低維的空間,維度為
,是MLR模型中的分片數。完成投影之后,通過很簡單的內積(Inner Product)操作便可以進行預測,得到輸出
。
2 FM家族
通過神經網絡的視角來理解CTR模型:
前面介紹過廣告領域的數據都是由one-hot表示的,如果直接連接DNN,會導致輸入參數過度,所以通常需要做embedding,避免全連接,分而治之,讓Dense Vector進行組合,那么高階特征的組合就出來了,但是低階和高階特征組合隱含地體現在隱藏層中,如果我們希望把低階特征組合單獨建模,然后融合高階特征組合。即將DNN與FM進行一個合理的融合:二者的融合總的來說有兩種形式,一是串行結構,二是並行結構
embedding+MLP:深度學習CTR預估的通用框架
1 embedding表示 2 對embedding向量進行拼接、交叉等等特征組合 3 DNN結構
1 對不同領域的one-hot特征進行嵌入(embedding),使其降維成低維度稠密特征。
2 然后將這些特征向量拼接(concatenate)成一個隱含層。
3 之后再不斷堆疊全連接層,也就是多層感知機(Multilayer Perceptron, MLP,有時也叫作前饋神經網絡)。
4 最終輸出預測的點擊率。
如何連接FM與DNN有兩種方式: 1 串聯 2 並聯
串聯模型主要有:FNN、Product-based Neural NetWork 、Neual factorization machines 、 Attenation-Based Factorization machines
並聯模型主要有: WDL,DeepFM、DeeoCrossNetWork
此外還需要注意一個問題:如何處理多個領域的嵌入特征?
1 拼接 FNN
2 交叉 NFM
3 不同類型的向量乘法: PNN
FM ->(FNN, NFM)
2.1基本結構
FM:嵌入后再進行內積
FM的實際應用:考慮領域信息
FM與GBDT的區別:
1 使用數據不同, FM使用於處理高維稀疏數據,而GBDT在高位稀疏數據上容易產生過擬合。
2 GBDT可以做高階特征組合,而FM只能做二階特征組合。
1 GBDT的優勢在於處理連續值特征,比如用戶歷史點擊率,用戶歷史瀏覽次數等連續值特征。而且由於樹的分裂算法,它具有一定的組合特征的能力,
模型的表達能力要比LR強。GBDT對特征的數值線性變化不敏感,它會按照目標函數,自動選擇最優的分裂特征和該特征的最優分裂點,而且根據特征的分裂次數,
還可以得到一個特征的重要性排序。所以,使用GBDT減少人工特征工程的工作量和進行特征篩選。
2 GBDT善於處理連續值特征,但是推薦系統的絕大多數場景中,出現的都是大規模離散化特征,如果我們需要使用GBDT的話,則需要將很多特征統計成連續值特征(或者embedding),
這里可能需要耗費比較多的時間。同時,因為GBDT模型特點,它具有很強的記憶行為,不利於挖掘長尾特征,而且GBDT雖然具備一定的組合特征的能力,但是組合的能力十分有限,遠不能與dnn相比。
3 樹分裂的時候,選擇連續值特征,等於選擇了一個特征,選擇離散化特征,卻等於選擇了一個特征的某一維,這樣子往往會造成離散化特征形同虛設。
基礎結構 FM與FFM:
從神經網絡的視角來看,MF相當於為user和iem引入了嵌入向量,而FM為所有的離散特征引入了嵌入向量,降低了參數的數量,而FFM結合廣告領域數據的多field特點,將不同field的特征交叉與同一filed的特征交叉進行區分,為每一維特征引入了多個隱向量。
2.2 串聯模型(FM與DNN串聯):
FNN:
FM + MLP 相當於用FM模型得到了每一維特征的嵌入向量,做了一次特征工程,得到特征送入分類器,不是端到端的思路,有貪心訓練的思路。
NFM:通過逐元素乘法延遲FM的實現過程
10.AFM: 對簡化版NFM進行加權求和
11.PNN:通過改進向量乘法運算延遲FM的實現過程
2.3 並聯模型(FM與DNN並聯)
DeepFM: FM與MLP的並聯結合
DCN:高階FM的降維實現
Cross Network的輸出就相當於 不斷乘以一個數,當然這個數是和
高度相關的。
- CrossNet的輸出被限定在一種特殊的形式上
- 特征交叉還是以bit-wise的方式構建的
Wide&Deep: DeepFM與DCN的基礎框架
xDeepFM:
為了實現自動學習顯式的高階特征交互,同時使得交互發生在向量級上,xDeepFM首先提出了一種新的名為壓縮交互網絡(Compressed Interaction Network,簡稱CIN)的模型。
CIN的輸入是所有field的embedding向量構成的矩陣 ,該矩陣的第
行對應第
個field的embedding向量,假設共有
個field,每個field的embedding向量的維度為
。CIN網絡也是一個多層的網絡,它的第
層的輸出也是一個矩陣,記為
,該矩陣的行數為
,表示第
層共有
個特征(embedding)向量,其中
。
CIN中第 層的輸出
由第
層的輸出
和輸入
經過一個比較復雜的運算得到,具體地,矩陣
中的第
行的計算公式如下:
其中, 表示哈達瑪積,即兩個矩陣或向量對應元素相乘得到相同大小的矩陣或向量,示例如:
。
上述計算公式可能不是很好理解,論文作者給出了另一種更加方便理解的視角。在計算 時,定義一個中間變量
,
是一個數據立方體,由D個數據矩陣堆疊而成,其中每個數據矩陣是由
的一個列向量與
的一個列向量的外積運算(Outer product)而得,如圖3所示。
的生成過程實際上是由
與
沿着各自embedding向量的方向計算外積的過程。
可以被看作是一個寬度為
、高度為
、通道數為
的圖像,在這個虛擬的圖像上施加一些卷積操作即得到
。
是其中一個卷積核,總共有
個不同的卷積核,因而借用CNN網絡中的概念,
可以看作是由
個feature map堆疊而成,如圖4所示。
正是通過卷積操作,CIN把第 層由
個向量壓縮到了
個向量,起到了防止維數災難的效果。
CIN的宏觀框架如下圖所示,它的特點是,最終學習出的特征交互的階數是由網絡的層數決定的,每一層隱層都通過一個池化操作連接到輸出層,從而保證了輸出單元可以見到不同階數的特征交互模式。同時不難看出,CIN的結構與循環神經網絡RNN是很類似的,即每一層的狀態是由前一層隱層的值與一個額外的輸入數據計算所得。不同的是,CIN中不同層的參數是不一樣的,而在RNN中是相同的;RNN中每次額外的輸入數據是不一樣的,而CIN中額外的輸入數據是固定的,始終是 。
有了基礎結構CIN之后,借鑒Wide&Deep和DeepFM等模型的設計,將CIN與線性回歸單元、全連接神經網絡單元組合在一起,得到最終的模型並命名為極深因子分解機xDeepFM,其結構如下圖所示。同時包含多種不同的結構成分可以提升模型的表達能力。
集成的CIN和DNN兩個模塊能夠幫助模型同時以顯式和隱式的方式學習高階的特征交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。值得一提的是,為了提高模型的通用性,xDeepFM中不同的模塊共享相同的輸入數據。而在具體的應用場景下,不同的模塊也可以接入各自不同的輸入數據,例如,線性模塊中依舊可以接入很多根據先驗知識提取的交叉特征來提高記憶能力,而在CIN或者DNN中,為了減少模型的計算復雜度,可以只導入一部分稀疏的特征子集。
3 總結:
從LR出發有四個方向,結合GBDT,結合聚類,結合在線學習,引入FM進行特征交叉,而FM引入了二階組合關系,同時又可以引入DNN,引入高階特征交叉,可以從串聯與並聯的視角來
來觀察,串聯方式: FNN、NFM、AFM、PNN; 並聯方式: WDL deepFM DeepCross,XdeepFM。
特征交叉方式又可以分為兩種,
bitewise與vectorWise,bite代表embedding向量中的某一個元素,所以同一領域內的元素也可以進行交叉,但是可解釋性不強,例如FNN、PNN、和DeepFM,其缺點是模型學習出來的是隱式的交互特征,其形式是未可知的,
不可控的,同時它們的特征交互是發生在元素級(bit-wise),而不是特征向量之間(vector-wise),這一點違背了因子分解機的初衷。Google在2017年引入了DCN模型,其表現形式是一種很特殊的向量擴張,但是特征交互依舊發生在元素級別上。所以可以從兩方面理解特征交互,顯示與隱式特征交互,元素級別的交互與向量級別的交互。
同vectorwise相比,vector wise是向量級的交叉,有沒有可能引入更高階的vector-wise的交叉特征,同時又能控制模型的復雜度,避免產生過多的無效交叉特征呢?應對維數挑戰艱難呢?必然要引入一定的壓縮機制,就是要把高階的組合特征向量的維數降到一個合理的范圍,同時在這個過程中盡量多的保留有效的交叉特征,去除無效的交叉特征。DCN引入cross層,對輸入的X0向量做乘數變化,同時也是bitwise的交叉方式。極深因子分解機xDeepFM模型是自動構建交叉特征且能夠端到端學習的集大成者,引入CIN網絡,將二階交叉,三階交叉特征、一直到k+1階交叉特征,都送入到最終輸入中去。集成的CIN和DNN兩個模塊能夠幫助模型同時以顯式和隱式的方式學習高階的特征交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。
神經網絡最開始都是經過Embedding把原始高緯度稀疏的輸入轉換為低維度稠密的向量,PNN也不例外。對於FM來說,這就是隱向量,FNN也是利用FM來進行Embedding Vector的初始化的。
處理流程: 通過設計網絡結構進行組合特征的挖掘。
基本網絡框架: Embedding Layer、Product Layer、Full-connect Layer。
從神經網絡的視角看FM
1 embedding + MLP embedding + concatenate + MLP
embedding+MLP的缺點是只學習高階特征組合,對於低階或者手動的特征組合不夠兼容,而且參數較多,學習較困難。
而dnn類的模型擁有很強的模型表達能力,而且其結構也是“看上去”天然具有特征交叉的能力。利用基於dnn的模型做ctr問題主要有兩個優勢:
1. 模型表達能力強,能夠學習出高階非線性特征。
2. 容易擴充其他類別的特征,比如在特征擁有圖片,文字類特征的時候。
2 FM : embedding + interaction 可以看成一個三層的神經網絡。后面的二次項,可以看成神經網絡embedding后,然后每兩個向量做內積。
3 考慮領域信息的FM: embedding + interaction
串並聯網絡結構
4 FNN:FM與MLP的串聯結合 embedding(FM預訓練) + concatenate + MLP
5 DeepFM: FM與MLP的並聯結合 embedding + interaction/concatenate + MLP
特征交叉方式 改進元素乘法 和 網絡串聯結構,改進元素乘法從中也可以看出網絡是串聯結構。
6 NFM:通過逐元素乘法延遲FM的實現過程 embedding + interation(逐元素乘法) +MLP
7 AFM: 對簡化版NFM進行加權求和 embedding + interaction + attenation
8 PNN:通過改進向量乘法運算延遲FM的實現過程 embedding + interation(內積) + concatenate + MLP
PNN的結構為embeddding+product layer + fcs。
而PNN使用product的方式做特征交叉的想法是認為在ctr場景中,特征的交叉更加提現在一種“且”的關系下,而add的操作,是一種“或”的關系,
所以product的形式更加合適,會有更好的效果。
特征交叉方式與 網絡並聯結構
9 DCN:高階FM的降維實現 embedding + stack + deep/cross
11 Deep Cross: DCN由其殘差網絡思想進化 embedding + stack + resnet
12Wide&Deep: DeepFM與DCN的基礎框架 embedding + concatenate + MLP
12 DIN 深度興趣網絡
12 ESSM 多任務
embedding + MLP
attenation 求和
FM ResNet 特征組合
4 模型對比:
從神經網絡的角度來看
角度一: 網絡架構 embedding layer + shallow/stack layer + FC layer
1. 是否保留淺層模型 (存在不保留shallow part的model,比如FNN,PNN。
PNN與FM相比,舍棄了低階特征,也就是線性的部分,這在一定程度上使得模型不太容易記住一些數據中的規律。WDL(Wide & Deep Learning)模型混合了寬度模型與深度模型,其寬度部分保留了低價特征,偏重記 憶;深度部分引入了bit-wise的特征交叉能力
2. 如何體現特征交叉性,即stack layer的做法是什么。concatenate?Bi-interaction?直接向量加法?。。。等等
cross network的設計思想是利用乘法計算代表特征交叉。而在論文的后面篇章中,它證明了cross network可以擬合任意多項式的表達形式,
所以可以涵蓋非常高階的特征交叉。個人覺得它的亮點在於設計了 x_{0}x_l}^{T} 這種表達特征交叉的計算方式,使得特征交叉通過一個rank-one的數字來表示了,
大大減少了參數量。但值得注意的是DCN只包含了deep part的結構,沒有shallow part的結構(lr or fm)。
3. embedding + fc(全連接層)是基本標配。
角度二:網絡串並聯結構
1 並聯 串聯 (FM與DNN關系)
2 並聯: DeepFM wide and deep DCN
3 串聯: PNN NFM AFM
角度三: 各種DNN+FM模型如何簡化成FM
1 NFM 當MLP的全連接層都是恆等變換且最后一層參數全為1時,NFM就退化成了FM。
2 AFM 權重都相等時,AFM退化成無全連接層的NFM
3 PNN 當MLP的全連接層都是恆等變換且最后一層參數全為1時,內積形式的PNN就退化成了FM。/PNN把NFM的逐元素乘法換成了外積。
4 DCN 只有兩層且第一層與最后一層權重參數相等時的Cross網絡與簡化版FM等價。
角度四: 特征組和的方式
1 樹系列
2 FM系列
3 DNN
不同類型向量乘法
如何做特征工程一直是一個具體問題具體分析的事情,CTR預估模型主要其實是在特征組合上做文章,LR處理一階,FM處理二階特征組合,DNN與GBDT處理高階的特征組合,而DNN與FM的區別在於:DNN做
特征組合時是針對bitwise的,而FM是vector-wise的。通過原始特征隱向量內積構建vector-wise的二階交叉特征,FM,deepFM,inner-PNN。簡單來說,在CTR領域中,特征一般分為兩種類別型特征和數值型特征,對於高維稀疏數據,特征組合是一把利器,往往先對類別型特征做一次embedding,那么
此時的輸入就會有兩種,一種是(batch_size, filed_size, embedding_size)直接輸入,作為FM特征交叉的輸入,另外一種是將其拉平變成(batch_size, units),作為DNN的輸入,其實還可以將FM的輸出作為DNN的輸入,這也就是NFM的來源,將FM替換成FFM,也就成了NFFM.
此外為何要做特征組合,拿Wide and Deep來說,wide部分側重記憶,保證泛化能力,deep部分引入了bit-wise的特征交叉,更加具體地描述特征之間的關系。簡單來說,粗粒度的特征保證模型的泛化能力,細粒度的特征增強
模型的刻畫能力,細粒度的特征對活躍用戶比較友好,可以更精確地刻畫他的喜好,提供更個性化的商品排序,而粗粒度的特征是為了服務不活躍用戶,甚至是新用戶,用大數據總結的一般規律來提供商品排序,粗細結合,
整體局部。這也就為我們處理冷啟動問題,提供了思路,不同粒度的去考慮問題。
角度五:
FNN的embedding向量需要FM預訓練得到,DeepFM中Deep部分與FM部分共用嵌入向量,WDL中Wide部分側重記憶,deep部分側重泛化能力,輸入特征類型不同,wide部分需要特征交叉。
復現框架: 可以順着理一下思路,來處理各類CTR預估模型,
數據結構:
feature_dim_dict: 記錄類別型特征與數值型特征的屬性(名字,維度)
sparse_input_dict: 記錄類別型特征征的屬性(名字,維度)
dense_input_dict: 記錄數值型特征與數值型特征的屬性(名字,維度)
inputs_list : 記錄輸入特征tensor表, 不做embedding
deep_emb_list 記錄輸入特征嵌入后tensor表,提供給FM層,包括類別型特征與連續型特征,對於數值型特征的嵌入處理,可以增加一個Dense層,將1維變成embedd_size維,也就是嵌入維度都為embedding_size.
linear_emb_list 記錄輸入特征嵌入后tensor表,提供給LR層,包括類別型特征與連續型特征,也就是嵌入維度都為1
fm_input: 對deep_emb_list的拼接,shape(,field_size, embedding_size )
deep_input : 對fm_input的flatten , shape(,units)
inputs_list 作為model的input
AFM:
fm_input ( list of (batch_size, 1, embedding_size )) -> fm_logit (tensor of (batch_size, 1) ) -> (fm_logit, linear_logit) -> final_logit -> output
DCN:
deep_emb_list (list of (batch_size,1 , embedding_size))-> deep_input(batch, units) -> cross_out(batch_size, units) / deep_out -> stack_out(concatenate) -> final_logit (Dense) -> output(PredictionLayer)
deepFM:
linear_emb_list , dense_input_dict -> linear_logit
fm_input(batch_size, field_size, embedding_size ) -> fm_out (FM, ( batch_size, 1 ) )
fm_input -> deep_input(batch_size, units ) -> deep_out -> deep_logit
out_put = MLP(linear_logit , fm_out, deep_logit)
FNN::
deep_emb_list -> deep_input -> deep_out(MLP) -> deep_logit (Dense) -> final_logit -> output
NFM:
deep_emb_list -> fm_input (batch_size, field_size, embedding_size) -> bi_out( BiInteractionPooling(), (batch_size, 1, embedding_size)) -> deep_out(MLP) -> deep_logit(Dense) -> output(Prediction)
NFFM:
sparse_embedding, dense_embedding, linear_embedding -> embed_list (FFM) -> ffm_out( Flatten() ) -> final_logit -> final_logit
linear_embedding -> linear_logit
final_logit + linear_logit
PNN:
deep_emb_list (batch_size, 1, embedding_size) -> inner_product ( ( batch_size, N*(N-1)/2 , 1) 或者 ( batch_size, N*(N-1)/2 , embedding_size) )
deep_emb_list (batch_size, 1, embedding_size) -> outer_product ( ( batch_size, N*(N-1)/2 )
deep_emb_list -> linear_signal (concatenate)
concatenate( inner_product outter_product, linear_signal) -> deep_out -> deep_out (MLP) -> deep_logit(Dense) -> output
xDeepFM:
fm_input (batch_size, field_size, enbedding_size )-> exFM_out (batch_size, featuremap_num)
fm_input ->deep_input -> deep_out -> deep_logit
linear_logit
concatenate(exFM_out, deep_logit, linear_logit) -> output(PredictionLayer)