2016年google推出了wide&deep模型之後,基本上就成爲了各大推薦系統的標配。該模型既能學習到低階的記憶性,又能學習到高階部分的泛化性,所以整體效果來說是比較好的。
但是它有個麻煩的地方,那就是wide部分需要較多的特徵工程工作。這一點對於人員緊張的小廠來說還是不太方便。而FM具有自動學習交叉特徵的能力,同時其使用的隱變量也可以跟Deep部分一起共享。所以也就有了DeepFM這個模型,用FM來代替wide部分。
FM
詳細介紹見FM簡介
對比FM和Wide&Deep的Wide部分:
優點:
- 無需特徵工程,這一點對於搭建端到端模型來說比較重要。
- 不要求交叉特徵共同在樣本出現過,使得在稀疏場景下也能學習到交叉特徵
缺點:
- 可解釋性不如wide
- 計算高階交叉時需要對全員做交叉,wide則可以通過特徵工程選擇部分交叉特徵
DeepFM
儘管FM做了特徵交叉,但是整體而言還是屬於比較低階的特徵,模型學習到的主要還是特徵共現性,即記憶特徵。要想提高模型的泛化能力,還是需要加入Deep部分。
DeepFM論文中做了跟很多其他模型的對比,個人覺得比較有意義的就是和FM、wide&deep這兩者的對比(其他模型感覺是拿來湊數的)。整篇文章凸顯兩個優勢:
- 端到端模型訓練,無需特徵工程和預訓練
- 同時捕捉到高階和低階特徵
FM Part
DeepFM的低階部分由FM組成。論文的FM部分看起來像是個一層的神經網絡,實際上還是用的FM傳統的計算trick公式得到的.(注意這層網絡的名字叫FM Layer)
Deep Part
DeepFM的高階部分由MLP組成。假如我們有n個特徵(FM中的Field概念),隱變量爲k維,則deep部分的輸入即是把這n個k維的隱變量拼一起。, 其中
Combine
分別得到和後,最終模型的輸出爲: . 搭建模型的時候需要注意,k維的隱變量是FM和Deep一起共享的。
模型實現:search-deeplearning/models/DeepFMEstimator
參考了ChenglongChen/tensorflow-DeepFM的實現,其中FM和MLP部分輸出的各自是一個tensor,通過concate一起在喂入最後一層網絡。
即:
參考資料: