(讀論文)推薦系統之ctr預估-DeepFM模型解析

jia發表於2019-07-25

今天第二篇(最近更新的都是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 預估 資料特點:

  1. 輸入中包含類別型和連續型資料。類別型資料需要 one-hot, 連續型資料可以先離散化再 one-hot,也可以直接保留原值。

  2. 維度非常高。

  3. 資料非常稀疏。

  4. 特徵按照 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 部分的輸入,依舊 依賴人工特徵工程。

但是,這些模型普遍都存在兩個問題:

  1. 偏向於提取低階或者高階的組合特徵。不能同時提取這兩種型別的特徵。

  2. 需要專業的領域知識來做特徵工程。

於是DeepFM 應運而生,成功解決了這兩個問題,並做了一些改進,其 優點 如下:

  1. 不需要預訓練 FM 得到隱向量。

  2. 不需要人工特徵工程。

  3. 能同時學習低階和高階的組合特徵。

  4. FM 模組和 Deep 模組共享 Feature Embedding 部分,可以更快的訓練,以及更精確的訓練學習。

下面就一直來走進模型的細節。

2、模型細節

DeepFM主要做法如下:

  1. FM Component + Deep Component。FM 提取低階組合特徵,Deep 提取高階組合特徵。但是和 Wide&Deep 不同的是,DeepFM 是端到端的訓練,不需要人工特徵工程。

  2. 共享 feature embedding。FM 和 Deep 共享輸入和feature embedding不但使得訓練更快,而且使得訓練更加準確。相比之下,Wide&Deep 中,input vector 非常大,裡面包含了大量的人工設計的 pairwise 組合特徵,增加了它的計算複雜度。

模型整體結構圖如下所示:
(讀論文)推薦系統之ctr預估-DeepFM模型解析

由上面網路結構圖可以看到,DeepFM 包括 FM和 DNN兩部分,所以模型最終的輸出也由這兩部分組成:

(讀論文)推薦系統之ctr預估-DeepFM模型解析

下面,把結構圖進行拆分,分別來看這兩部分。

2.1、The FM Component

FM 部分的輸出由兩部分組成:一個 Addition Unit,多個 內積單元。

(讀論文)推薦系統之ctr預估-DeepFM模型解析

這裡的 d 是輸入 one-hot 之後的維度,我們一般稱之為feature_size。對應的是 one-hot 之前的特徵維度,我們稱之為field_size。

(讀論文)推薦系統之ctr預估-DeepFM模型解析

架構圖如上圖所示:Addition Unit 反映的是 1 階的特徵。內積單元 反映的是 2 階的組合特徵對於預測結果的影響。

這裡需要注意三點:

  1. 這裡的wij,也就是<vi,vj>,可以理解為DeepFM結構中計算embedding vector的權矩陣(並非是網上很多文章認為的vi是embedding vector)。

  2. 由於輸入特徵one-hot編碼,所以embedding vector也就是輸入層到Dense Embeddings層的權重。

  3. Dense Embeddings層的神經元個數是由embedding vector和field_size共同確定,直觀來說就是:神經元的個數為embedding vector*field_size。

FM Component 總結:

  1. FM 模組實現了對於 1 階和 2 階組合特徵的建模。

  2. 無須預訓練。

  3. 沒有人工特徵工程。

  4. embedding 矩陣的大小是:特徵數量 * 嵌入維度。然後用一個 index 表示選擇了哪個特徵。

需要訓練的有兩部分:

  1. input_vector 和 Addition Unit 相連的全連線層,也就是 1 階的 Embedding 矩陣。

  2. Sparse Feature 到 Dense Embedding 的 Embedding 矩陣,中間也是全連線的,要訓練的是中間的權重矩陣,這個權重矩陣也就是隱向量 Vi。

2.2、The Deep Component

Deep Component 架構圖:

(讀論文)推薦系統之ctr預估-DeepFM模型解析

這裡DNN的作用是構造高階組合特徵,網路裡面黑色的線是全連線層,引數需要神經網路去學習。且有一個特點:DNN的輸入也是embedding vector。所謂的權值共享指的就是這裡。

關於DNN網路中的輸入a處理方式採用前向傳播,如下所示:

(讀論文)推薦系統之ctr預估-DeepFM模型解析

這裡假設α(0)=(e1,e2,...em)表示 embedding層的輸出,那麼α(0)作為下一層 DNN隱藏層的輸入,其前饋過程如下:

(讀論文)推薦系統之ctr預估-DeepFM模型解析

優點:

  1. 模型可以從最原始的特徵中,同時學習低階和高階組合特徵

  2. 不再需要人工特徵工程。Wide&Deep 中低階組合特徵就是同過特徵工程得到的。

3 、總結(具體的對比實驗和實現細節等請參閱原論文)

DeepFM優點:

  1. 沒有用 FM 去預訓練隱向量 Vi,並用 Vi去初始化神經網路。(相比之下 FNN 就需要預訓練 FM 來初始化 DNN)。

  2. FM 模組不是獨立的,是跟整個模型一起訓練學習得到的。(相比之下 Wide&Deep 中的 Wide 和 Deep 部分是沒有共享的)

  3. 不需要特徵工程。(相比之下 Wide&Deep 中的 Wide 部分需要特徵工程)

  4. 訓練效率高。(相比 PNN 沒有那麼多引數)

其中最核心的:

  1. 沒有預訓練(no pre-training)

  2. 共享 Feature Embedding,沒有特徵工程(no feature engineering)

  3. 同時學習低階和高階組合特徵(capture both low-high-order interaction features)

實現DeepFM的一個Demo,感興趣的童鞋可以關注我的github

相關文章