當前位置:
首頁 > 最新 > 基於Tensorflow實現DeepFM

基於Tensorflow實現DeepFM

前言

DeepFM,Ctr預估中的大殺器,哈工大與華為諾亞方舟實驗室榮耀出品,演算法工程師面試高頻考題,有效的結合了神經網路與因子分解機在特徵學習中的優點:同時提取到低階組合特徵與高階組合特徵,這樣的稱號我可以寫幾十條出來,這也說明了DeepFM確實是一個非常值得手動擼一邊的演算法。

當然,早就有一票人寫了一車封裝好的deepFM的模型,大家隨便搜搜肯定也能搜到,既然這樣,我就不再搞這些東西了,今天主要和大家過一遍,deepFM的代碼是咋寫的,手把手入門一下,說一些我覺得比較重要的地方,方便大家按需修改。(只列舉了一部分,更多的解釋參見GitHub代碼中的注釋)

本文的數據和部分代碼構造參考了nzc大神的deepfm的Pytorch版本的寫法,改成tensorflow的形式,需要看原版的自取。

網路結構

DeepFM包含兩部分:神經網路部分與因子分解機部分,分別負責低階特徵的提取和高階特徵的提取,兩部分權重共享。

DeepFM的預測結果可以寫為:


FM公式為:

我很久之前一篇文章細節講過,這邊就不多扯了,更多詳見FM理論解析及應用。


這邊其實和我上篇文章說的MLPS差距不大,也就是簡單的全鏈接,差就差在input的構造,這邊採取了embedding的思想,將每個feature轉化成了embedded vector作為input,同時此處的input也是上面計算FM中的V,更多的大家看代碼就完全了解了。


代碼部分

我一共寫了兩個script,build_data.py和deepfm.py,也很好理解。build_data.py用來預處理數據,deepfm.py用來跑模型。

feature_index是把所有特徵進行了標序,feature1,feature2......featurem,分別對應0,1,2,3,...m,但是,請注意分類變數需要拆分!就是說如果有性別:男|女|未知,三個選項。需要構造feature男,feature女,feature未知三個變數,而連續變數就不需要這樣。

feature_value就是特徵的值,連續變數按真實值填寫,分類變數全部填寫1。

更加形象的如下:

deepfm.py

可以對照下面的公式看,更有感覺。


都是一些正常的操作,稍微要注意一下的是交互項的計算:

直接實現了下面的計算邏輯:

我個人重寫了一下我認為需要正則的地方,和一些loss的計算方式:

大家也可以直接按照我注釋掉的部分簡單操作,看個人的理解了。


很多網上的代碼跑著跑著就NAN了,建議加一下梯度的正則,反正也沒多複雜。


build_data.py中我為了省事,只做了標準化,沒有進行其他數據預處理的步驟,這個是錯誤的,大家在實際使用中請按照我在公眾號裡面給大家進行的數據預處理步驟進行,這個非常重要!

learing_rate是我隨便設置的,在實際大家跑模型的時候,請務必按照1.0,1e-3,1e-6,三個節點進行二分調優。

如果你直接搬上面代碼,妥妥過擬合,請在真實使用過程中,務必根據數據量調整batch的大小,epoch的大小,建議在每次傳遞完成後加上進行dropout。

如果數據量連10萬量級都不到,我還是建議用機器學習的方法,xgboost+lr,mixed logistics regression等等都是不錯的方法。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 商業數據挖掘 的精彩文章:

超簡單的異常值識別常用方法

TAG:商業數據挖掘 |