今天第二篇(最近更新的都是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。