DeepFM對FM、FNN、PNN、wide&deep模型


1. CTR預估

CTR預估數據特點:
1. 輸入中包含類別型和連續型數據。類別型數據需要one-hot,連續型數據可以先離散化再one-hot,也可以直接保留原值
2. 維度非常高
3. 數據非常稀疏
4. 特徵按照Field分組

CTR預估重點在於學習組合特徵。注意,組合特徵包括二階、三階甚至更高階的,階數越高越複雜,越不容易學習。Google的論文研究得出結論:高階和低階的組合特徵都非常重要,同時學習到這兩種組合特徵的性能要比只考慮其中一種的性能要好。

那麼關鍵問題轉化成:如何高效的提取這些組合特徵。一種辦法就是引入領域知識人工進行特徵工程。這樣做的弊端是高階組合特徵非常難提取,會耗費極大的人力。而且,有些組合特徵是隱藏在數據中的,即使是專家也不一定能提取出來,比如著名的“尿布與啤酒”問題。

在DeepFM提出之前,已有LR,FM,FFM,FNN,PNN(以及三種變體:IPNN,OPNN,PNN*),Wide&Deep模型,這些模型在CTR或者是推薦系統中被廣泛使用。

2. 模型演進歷史
2.1 線性模型

最開始CTR或者是推薦系統領域,一些線性模型取得了不錯的效果。比如:LR,FTRL。線性模型有個致命的缺點:無法提取高階的組合特徵。所以常用的做法是人爲的加入pairwise feature interactions。即使是這樣:對於那些出現很少或者沒有出現的組合特徵以及高階組合特徵依舊無法提取。

LR最大的缺點就是無法組合特徵,依賴於人工的特徵組合,這也直接使得它表達能力受限,基本上只能處理線性可分或近似線性可分的問題。

2.2 FM模型

線性模型差強人意,直接導致了FM模型應運而生(在Kaggle上打比賽提出來的,取得了第一名的成績)。FM通過隱向量latent vector做內積來表示組合特徵,從理論上解決了低階和高階組合特徵提取的問題。但是實際應用中受限於計算複雜度,一般也就只考慮到2階交叉特徵。

後面又進行了改進,提出了FFM,增加了Field的概念。

2.3 FNN

隨着DNN在圖像、語音、NLP等領域取得突破,人們見見意識到DNN在特徵表示上的天然優勢。相繼提出了使用CNN或RNN來做CTR預估的模型。但是,CNN模型的缺點是:偏向於學習相鄰特徵的組合特徵。 RNN模型的缺點是:比較適用於有序列(時序)關係的數據。

FNN的提出,應該算是一次非常不錯的嘗試:先使用預先訓練好的FM,得到隱向量,然後作爲DNN的輸入來訓練模型。缺點在於:受限於FM預訓練的效果。

FNN使用預訓練的FM來初始化DNN,然後只有Deep部分,不能學習低階組合特徵。

FNN缺點:

  • Embedding的參數受FM的影響,不一定準確
  • 預訓練階段增加了計算複雜度,訓練效率低
  • FNN只能學習到高階的組合特徵。模型中沒有對低階特徵建模。

2.4  PNN

隨後提出了PNN,PNN爲了捕獲高階組合特徵,在embedding layer和first hidden layer之間增加了一個product layer。根據product layer使用內積、外積、混合分別衍生出IPNN, OPNN, PNN*三種類型。 PNN竟然可以end-to-end的訓練,不需要預訓練也可以得到不錯的效果。

PNN:爲了捕獲高階特徵。PNN在第一個隱藏層和embedding層之間,增加了一個product layer。

根據product的不同,衍生出三種PNN:IPNN,OPNN,PNN* 分別對應內積、外積、兩者混合。

作者爲了加快計算,採用近似計算的方法來計算內積和外積。內積:忽略一些神經元。外積:把m*k維的vector轉換成k維度的vector。由於外積丟失了較多信息,所以一般沒有內積穩定。

但是內積的計算複雜度依舊非常高,原因是:product layer的輸出是要和第一個隱藏層進行全連接的。

PNN缺點:

  • 內積外積計算複雜度高。採用近似計算的方法外積沒有內積穩定。
  • product layer的輸出需要與第一個隱藏層全連接,導致計算複雜度居高不下
  • 和FNN一樣,只能學習到高階的特徵組合。沒有對於1階和2階特徵進行建模。

關於更詳細介紹請參考: https://zhuanlan.zhihu.com/p/33177517

2.5 wide&deep

Google意識到了這個問題,爲了同時學習低階和高階組合特徵,提出了Wide&Deep模型。它混合了一個線性模型(Wide part)和Deep模型(Deep part)。這兩部分模型需要不同的輸入,而Wide part部分的輸入,依舊依賴人工特徵工程。

Wide&Deep

Wide & Deep設計的初衷是想同時學習低階和高階組合特徵,但是wide部分需要領域知識進行特徵工程。

Wide部分可以用LR來替換,這樣的話就和DeepFM差不多了。

Wide&Deep缺點:

  • 需要特徵工程提取低階組合特徵

但是,以上 這些模型普遍都存在兩個問題:
1. 偏向於提取低階或者高階的組合特徵。不能同時提取這兩種類型的特徵。
2. 需要專業的領域知識來做特徵工程。

2.6 DeepFM

DeepFM在Wide&Deep的基礎上進行改進,成功解決了這兩個問題,並做了一些改進,其優勢/優點如下:

1. 不需要預訓練FM得到隱向量
2. 不需要人工特徵工程
3. 能同時學習低階和高階的組合特徵
4. FM模塊和Deep模塊共享**Feature Embedding**部分,可以更快的訓練,以及更精確的訓練學習

這裏寫圖片描述

模型對比圖

3. DeepFM

DeepFM閃亮登場!

主要做法如下:
1. FM Component + Deep Component。FM提取低階組合特徵,Deep提取高階組合特徵。但是和Wide&Deep不同的是,DeepFM是端到端的訓練,不需要人工特徵工程。
2. 共享feature embedding。FM和Deep共享輸入和feature embedding不但使得訓練更快,而且使得訓練更加準確。相比之下,Wide&Deep中,input vector非常大,裏面包含了大量的人工設計的pairwise組合特徵,增加了他的計算複雜度。

DeepFM架構圖:

這裏寫圖片描述


3.1 FM Component

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

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

FM架構圖:

這裏寫圖片描述

 

3.2 Deep Component

Deep Component架構圖:

這裏寫圖片描述


Deep Component是用來學習高階組合特徵的。網絡裏面黑色的線是全連接層,參數需要神經網絡去學習。

由於CTR或推薦系統的數據one-hot之後特別稀疏,如果直接放入到DNN中,參數非常多,我們沒有這麼多的數據去訓練這樣一個網絡。所以增加了一個Embedding層,用於降低緯度。

這裏繼續補充下Embedding層,兩個特點:
1. 儘管輸入的長度不同,但是映射後長度都是相同的.embedding_size 或 k
2. embedding層的參數其實是全連接的Weights,是通過神經網絡自己學習到的。

Embedding層的架構圖:

這裏寫圖片描述


值得注意的是:FM模塊和Deep模塊是共享feature embedding的(也就是V)。

好處:
1. 模型可以從最原始的特徵中,同時學習低階和高階組合特徵
2. 不再需要人工特徵工程。Wide&Deep中低階組合特徵就是同過特徵工程得到的。

DeepFM

優點:

  • 沒有用FM去預訓練隱向量V,並用V去初始化神經網絡。(相比之下FNN就需要預訓練FM來初始化DNN)
  • FM模塊不是獨立的,是跟整個模型一起訓練學習得到的。(相比之下Wide&Deep中的Wide和Deep部分是沒有共享的)
  • 不需要特徵工程。DeepFM包括FM部分和Deep部分。FM用於學習低階特徵交叉,Deep部分用於學習高階特徵交叉。相比於Wide & Deep的LR是需要人工完成特徵交叉特徵工程,DeepFM可以不經過特徵工程直接進行端到端的訓練。
  • 訓練效率高。(相比PNN沒有那麼多參數)

DeepFM共享feature embedding 這個特性使得在反向傳播的時候,模型學習feature embedding,而後又會在前向傳播的時候影響低階和高階特徵的學習,這使得學習更加的準確。

什麼?太多了亂七八糟記不住?OK,那就記住最核心的:

記憶寶典:從DeepFM的底層-->頂層:不需要預訓練,直接Embedding,隱向量共享,同時學習低階和高階。

  • 沒有預訓練,直接端到端訓練,簡單、高效。
  • 共享Feature Embedding,模型學習的更準確。
  • 同時學習低階和高階組合特徵,不需要人工特徵工程。

3.4 超參數建議
論文中還給出了一些參數的實驗結果,直接給出結論,大家實現的時候可以參考下。

面試題:

1. 爲什麼DeepFM理論上不需要特徵工程了,實際工作中還需要做特徵工程?

DeepFM最核心的想法是讓deep和wide部分共享參數,具體來說,他們用FM作爲wide部分用於學習低階特徵交叉,DNN或者PNN作爲deep部分用於學習高階特徵交叉,但是把FM的部分放到NN的embedding層之後,從而讓它們共享embedding。這樣做的主要好處是:原始的wide&deep 的wide的部分沒有特徵交叉,僅相當於FM的一次項,其輸入仍要靠特徵工程來確定,但deepFM讓兩部分共享embedding,FM的二次項進行特徵交叉,所以就不再需要特徵工程了。

爲什麼理論上不需要特徵工程了,實際工作中還需要做特徵工程。因爲理論上FM,DNN能兼顧低階和高階特徵,但是在具體業務場景中,模型到底能不能學習到相應的特徵交叉,不知道,所以還是需要儘可能多的人工特徵交叉,讓這些交叉特徵作爲模型的輸入,進一步提高模型的表達能力。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章