今天第二篇(最近更新的都是Deep模型,傳統的線性模型會后面找個時間更新的哈)。本篇介紹華為的DeepFM模型 (2017年),此模型在 Wide&Deep 的基礎上進行改進,成功解決了一些問題,具體的話下面一起來看下吧。
原文:Deepfm: a factorization-machine based neural network for ctr prediction
地址:http://www.ijcai.org/proceedings/2017/0239.pdf
1、問題由來
1.1、背景
CTR 預估 數據特點:
-
輸入中包含類別型和連續型數據。類別型數據需要 one-hot, 連續型數據可以先離散化再 one-hot,也可以直接保留原值。
-
維度非常高。
-
數據非常稀疏。
-
特征按照 Field 分組。
CTR 預估 重點 在於 學習組合特征。注意,組合特征包括二階、三階甚至更高階的,階數越高越復雜,越不容易學習。Google 的論文研究得出結論:高階和低階的組合特征都非常重要,同時學習到這兩種組合特征的性能要比只考慮其中一種的性能要好。
那么關鍵問題轉化成:如何高效的提取這些組合特征。一種辦法就是引入領域知識人工進行特征工程。這樣做的弊端是高階組合特征非常難提取,會耗費極大的人力。而且,有些組合特征是隱藏在數據中的,即使是專家也不一定能提取出來,比如著名的“尿布與啤酒”問題。
在 DeepFM 提出之前,已有 LR(線性或廣義線性模型后面更新),FM,FFM(基於因子分解機的特征域),FNN,PNN(以及三種變體:IPNN,OPNN,PNN*),Wide&Deep 模型,這些模型在 CTR 或者是推薦系統中被廣泛使用。
1.2、現有模型的問題
線性模型:最開始 CTR 或者是推薦系統領域,一些線性模型取得了不錯的效果(線性模型LR簡單、快速並且模型具有可解釋,有着很好的擬合能力),但是LR模型是線性模型,表達能力有限,泛化能力較弱,需要做好特征工程,尤其需要交叉特征,才能取得一個良好的效果,然而在工業場景中,特征的數量會很多,可能達到成千上萬,甚至數十萬,這時特征工程就很難做,還不一定能取得更好的效果。
FM模型:線性模型差強人意,直接導致了 FM 模型應運而生(在 Kaggle 上打比賽提出來的,取得了第一名的成績)。FM 通過隱向量 latent vector 做內積來表示組合特征,從理論上解決了低階和高階組合特征提取的問題。但是實際應用中受限於計算復雜度,一般也就只考慮到 2 階交叉特征。后面又進行了改進,提出了 FFM,增加了 Field 的概念。
遇上深度學習:隨着 DNN 在圖像、語音、NLP 等領域取得突破,人們漸漸意識到 DNN 在特征表示上的天然優勢。相繼提出了使用 CNN 或 RNN 來做 CTR 預估的模型。但是,CNN 模型的缺點是:偏向於學習相鄰特征的組合特征。 RNN 模型的缺點是:比較適用於有序列 (時序) 關系的數據。
FNN 的提出,應該算是一次非常不錯的嘗試:先使用預先訓練好的 FM,得到隱向量,然后作為 DNN 的輸入來訓練模型。缺點在於:受限於 FM 預訓練的效果。
隨后提出了 PNN,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 應運而生,成功解決了這兩個問題,並做了一些改進,其 優點 如下:
-
不需要預訓練 FM 得到隱向量。
-
不需要人工特征工程。
-
能同時學習低階和高階的組合特征。
-
FM 模塊和 Deep 模塊共享 Feature Embedding 部分,可以更快的訓練,以及更精確的訓練學習。
下面就一直來走進模型的細節。
2、模型細節
DeepFM主要做法如下:
-
FM Component + Deep Component。FM 提取低階組合特征,Deep 提取高階組合特征。但是和 Wide&Deep 不同的是,DeepFM 是端到端的訓練,不需要人工特征工程。
-
共享 feature embedding。FM 和 Deep 共享輸入和feature embedding不但使得訓練更快,而且使得訓練更加准確。相比之下,Wide&Deep 中,input vector 非常大,里面包含了大量的人工設計的 pairwise 組合特征,增加了它的計算復雜度。
模型整體結構圖如下所示:
由上面網絡結構圖可以看到,DeepFM 包括 FM和 DNN兩部分,所以模型最終的輸出也由這兩部分組成:
下面,把結構圖進行拆分,分別來看這兩部分。
2.1、The FM Component
FM 部分的輸出由兩部分組成:一個 Addition Unit,多個 內積單元。
這里的 d 是輸入 one-hot 之后的維度,我們一般稱之為feature_size。對應的是 one-hot 之前的特征維度,我們稱之為field_size。
架構圖如上圖所示:Addition Unit 反映的是 1 階的特征。內積單元 反映的是 2 階的組合特征對於預測結果的影響。
這里需要注意三點:
-
這里的wij,也就是<vi,vj>,可以理解為DeepFM結構中計算embedding vector的權矩陣(並非是網上很多文章認為的vi是embedding vector)。
-
由於輸入特征one-hot編碼,所以embedding vector也就是輸入層到Dense Embeddings層的權重。
-
Dense Embeddings層的神經元個數是由embedding vector和field_size共同確定,直觀來說就是:神經元的個數為embedding vector*field_size。
FM Component 總結:
-
FM 模塊實現了對於 1 階和 2 階組合特征的建模。
-
無須預訓練。
-
沒有人工特征工程。
-
embedding 矩陣的大小是:特征數量 * 嵌入維度。然后用一個 index 表示選擇了哪個特征。
需要訓練的有兩部分:
-
input_vector 和 Addition Unit 相連的全連接層,也就是 1 階的 Embedding 矩陣。
-
Sparse Feature 到 Dense Embedding 的 Embedding 矩陣,中間也是全連接的,要訓練的是中間的權重矩陣,這個權重矩陣也就是隱向量 Vi。
2.2、The Deep Component
Deep Component 架構圖:
這里DNN的作用是構造高階組合特征,網絡里面黑色的線是全連接層,參數需要神經網絡去學習。且有一個特點:DNN的輸入也是embedding vector。所謂的權值共享指的就是這里。
關於DNN網絡中的輸入a處理方式采用前向傳播,如下所示:
這里假設α(0)=(e1,e2,...em)表示 embedding層的輸出,那么α(0)作為下一層 DNN隱藏層的輸入,其前饋過程如下:
優點:
-
模型可以從最原始的特征中,同時學習低階和高階組合特征
-
不再需要人工特征工程。Wide&Deep 中低階組合特征就是同過特征工程得到的。
3 、總結(具體的對比實驗和實現細節等請參閱原論文)
DeepFM優點:
-
沒有用 FM 去預訓練隱向量 Vi,並用 Vi去初始化神經網絡。(相比之下 FNN 就需要預訓練 FM 來初始化 DNN)。
-
FM 模塊不是獨立的,是跟整個模型一起訓練學習得到的。(相比之下 Wide&Deep 中的 Wide 和 Deep 部分是沒有共享的)
-
不需要特征工程。(相比之下 Wide&Deep 中的 Wide 部分需要特征工程)
-
訓練效率高。(相比 PNN 沒有那么多參數)
其中最核心的:
-
沒有預訓練(no pre-training)
-
共享 Feature Embedding,沒有特征工程(no feature engineering)
-
同時學習低階和高階組合特征(capture both low-high-order interaction features)
實現DeepFM的一個Demo,感興趣的童鞋可以關注我的github。