DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 論文閱讀總結
Abstract
Learning sophisticated feature interactions behind user behaviors is critical in maximizing CTR for recommender systems. Despite great progress, existing methods seem to have a strong bias towards low- or high-order interactions, or require expertise feature engineering. In this paper, we show that it is possible to derive an end-to-end learning model that emphasizes both low- and highorder feature interactions. The proposed model, DeepFM, combines the power of factorization machines for recommendation and deep learning for feature learning in a new neural network architecture. Compared to the latest Wide & Deep model from Google, DeepFM has a shared input to its “wide” and “deep” parts, with no need of feature engineering besides raw features. Comprehensive experiments are conducted to demonstrate the effectiveness and efficiency of DeepFM over the existing models for CTR prediction, on both benchmark data and commercial data.
1. CTR預估
CTR預估資料特點:
- 輸入中包含類別型和連續型資料。類別型資料需要one-hot,連續型資料可以先離散化再one-hot,也可以直接保留原值
- 維度非常高
- 資料非常稀疏
- 特徵按照Field分組
CTR預估重點在於學習組合特徵。注意,組合特徵包括二階、三階甚至更高階的,階數越高越複雜,越不容易學習。Google的論文研究得出結論:高階和低階的組合特徵都非常重要,同時學習到這兩種組合特徵的效能要比只考慮其中一種的效能要好。
那麼關鍵問題轉化成:如何高效的提取這些組合特徵。一種辦法就是引入領域知識人工進行特徵工程。這樣做的弊端是高階組合特徵非常難提取,會耗費極大的人力。而且,有些組合特徵是隱藏在資料中的,即使是專家也不一定能提取出來,比如著名的“尿布與啤酒”問題。
在DeepFM提出之前,已有LR,FM,FFM,FNN,PNN(以及三種變體:IPNN,OPNN,PNN*),Wide&Deep模型,這些模型在CTR或者是推薦系統中被廣泛使用。
2. 模型演進歷史
DeepFM借鑑了Google的wide & deep的做法,其本質是
- 將Wide & Deep 部分的wide部分由 人工特徵工程+LR 轉換為FM模型,避開了人工特徵工程;
- FM模型與deep part共享feature embedding。
2.1 線性模型
最開始CTR或者是推薦系統領域,一些線性模型取得了不錯的效果。比如:LR,FTRL。線性模型
LR最大的缺點就是無法組合特徵,依賴於人工的特徵組合,這也直接使得它表達能力受限,基本上只能處理線性可分或近似線性可分的問題。
2.2 FM模型
線性模型差強人意,直接導致了FM模型應運而生(在Kaggle上打比賽提出來的,取得了第一名的成績)。FM通過隱向量latent vector做內積來表示組合特徵,從理論上解決了低階和高階組合特徵提取的問題。但是實際應用中受限於計算複雜度,一般也就只考慮到2階交叉特徵。
後面又進行了改進,提出了FFM,增加了Field的概念。
2.3 遇上深度學習
隨著DNN在影象、語音、NLP等領域取得突破,人們見見意識到DNN在特徵表示上的天然優勢。相繼提出了使用CNN或RNN來做CTR預估的模型。但是,CNN模型的缺點是:偏向於學習相鄰特徵的組合特徵。 RNN模型的缺點是:比較適用於有序列(時序)關係的資料。
FNN (Factorization-machine supported Neural Network) 的提出,應該算是一次非常不錯的嘗試:先使用預先訓練好的FM,得到隱向量,然後作為DNN的輸入來訓練模型。缺點在於:受限於FM預訓練的效果。
隨後提出了PNN (Product-based Neural Network),PNN為了捕獲高階組合特徵,在embedding layer
和first hidden layer
之間增加了一個product layer
。根據product layer使用內積、外積、混合分別衍生出IPNN, OPNN, PNN*
三種類型。
無論是FNN還是PNN,他們都有一個繞不過去的缺點:**對於低階的組合特徵,學習到的比較少。**而前面我們說過,低階特徵對於CTR也是非常重要的。
Google意識到了這個問題,為了同時學習低階和高階組合特徵,提出了Wide&Deep模型。它混合了一個線性模型(Wide part)和Deep模型(Deep part)。這兩部分模型需要不同的輸入,而Wide part部分的輸入,依舊依賴人工特徵工程。
但是,這些模型普遍都存在兩個問題:
- 偏向於提取低階或者高階的組合特徵。不能同時提取這兩種型別的特徵。
- 需要專業的領域知識來做特徵工程。
DeepFM在Wide&Deep的基礎上進行改進,成功解決了這兩個問題,並做了一些改進,其優勢/優點如下:
- 不需要預訓練FM得到隱向量
- 不需要人工特徵工程
- 能同時學習低階和高階的組合特徵
- FM模組和Deep模組共享Feature Embedding部分,可以更快的訓練,以及更精確的訓練學習
3. DeepFM
DeepFM閃亮登場!
主要做法如下:
- FM Component + Deep Component。FM提取低階組合特徵,Deep提取高階組合特徵。但是和Wide&Deep不同的是,DeepFM是端到端的訓練,不需要人工特徵工程。
- 共享feature embedding。FM和Deep共享輸入和
feature embedding
不但使得訓練更快,而且使得訓練更加準確。相比之下,Wide&Deep中,input vector非常大,裡面包含了大量的人工設計的pairwise組合特徵,增加了他的計算複雜度。
DeepFM架構圖:
Figure 1: Wide & deep architecture of DeepFM. The wide and deep component share the same input raw feature vector, which enables DeepFM to learn low- and high-order feature interactions simultaneously from the input raw features.
3.1 FM Component
FM部分的輸出由兩部分組成:一個Addition Unit,多個內積單元。
這裡的d是輸入one-hot之後的維度,我們一般稱之為feature_size
。對應的是one-hot之前的特徵維度,我們稱之為field_size
。
FM架構圖:
Figure 3: The architecture of DNN
Addition Unit 反映的是1階的特徵。內積單元反映的是2階的組合特徵對於預測結果的影響。
注意:
雖然公式上Y_fm是所有部分都求和,是一個標量。但是從FM模組的架構圖上我們可以看到,輸入到輸出單元的部分並不是一個標量,應該是一個向量。
實際實現中採用的是FM化簡之後的內積公式,最終的維度是:field_size + embedding_size
(對應FM Layer中的神經元個數: Field數量 + 嵌入維度 = F + k,其中 F 為one-hot之前特徵維度,k 為embedding的特徵維度)
這裡分別展開解釋下維度的兩部分是怎麼來的,對於理解模型還是很重要的:
-
field_size
對應的是<W,X>
。這裡的X是one-hot之後的,one-hot之後,我們認為X的每一列都是一個單獨的維度的特徵。這裡我們表達的是X的1階特徵,說白了就是單獨考慮X的每個特徵,他們對最終預測的影響是多少。是多少那?是W!W對應的就是這些維度特徵的權重。假設one-hot之後特徵數量是
feature_size
,那麼W的維度就是(feature_size, 1)
。這裡
<W,X>
是把X和W每一個位置對應相乘相加。由於X是one-hot之後的,所以相當於是進行了一次Embedding!X在W上進行一次嵌入,或者說是一次選擇,選擇的是W的行,按什麼選擇那,按照X中不為0的那些特徵對應的index,選擇W中 row=index 的行。這裡解釋下Embedding: W是一個矩陣,每一行對應X的一個維度的特徵(這裡是one-hot之後的維度,一定要注意)。W的列數為1,表示嵌入之後的維度是1。W的每一行對應一個特徵,相當於是我們拿輸入X_i作為一個index, X_i的任意一個Field i中只有1個為1,其餘的都是0。哪個位置的特徵值為1,那麼就選中W中對應的行,作為嵌入後這個Field i對應的新的特徵表示。對於每一個Field都執行這樣的操作,就選出來了X_i Embedding之後的表示。注意到,每個Field都肯定會選出且僅選出W中的某一行(想想為什麼?),因為W的列數是固定的,每一個Field都選出W.cols作為對應的新特徵。把每個Field選出來的這些W的行,拼接起來就得到了X Embedding後的新的表示:維度是
num(Field) * num(W.cols)
。雖然每個Field的長度可能不同,但是都是在W中選擇一行,所以選出來的長度是相同的。這也是Embedding的一個特性:雖然輸入的Field長度不同,但是Embedding之後的長度是相同的。什麼?Embedding這麼複雜,怎麼實現的?**非常簡單!直接把X和W做內積即可。**是的,你沒看錯,就是這麼簡單(tensoflow中封裝了下,改成了
tf.nn.embedding_lookup(embeddings, index)
,原理就是不做乘法,直接選出對應的行)。自己寫個例子試試:X.shape=(1, feature_size), W.shape = (feture_size, embedding_size)
就知道為什麼選出1對應W的行和做內積結果是一樣的
是怎麼回事了。所以:**FM模組圖中,黑線部分是一個全連線!W就是裡面的權重。**把輸入X和W相乘就得到了輸出。至於
Addition Unit
,我們就不糾結了,這裡並沒有做什麼加法,就把他當成是反應1階特徵對輸出的影響就行了。 -
embedding_size
embedding_size
對應的是
FM論文中給出了化簡後的公式: