推薦系統之deepfm模型

    一般國內涉及到推薦模型的公司,發展歷程爲傳統機器學習LR-->FM到深度學習wide&deep、deepfm、DCN...這些。目前我所在的公司採用的是online fm模型,準備向深度學習進軍,所以最近也是在調研一些工業界用的比較多的模型,以此記錄一下學習歷程,因爲自己本身對tensorflow不是很熟悉,一些看似簡單的模型架構實現起來很困難(說到底就是線性代數學的差,矩陣維度傻傻算不清楚),所以博主準備從模型維度出發全面瓦解模型思想。

    如果你足夠了解fm模型,那麼deepfm也就非常簡單了,他主要分爲兩部分

模型所需的參數

  • field_size(field數):F
  • feature_size(特徵維度):M
  • hidden_factor(隱藏因子數):K
  • batch_size(每批次訓練樣本數):B(None)

構建的原始權重參數

  • feature_embeddings:[M,K]
  • feature_bias:[M,1]

    1.fm layer

    首先要弄清楚field size和feature size的概念和區別,在對於category特徵時,例如特徵sex列,有(man,woman,null)三個特徵值,那麼我們一般要先將特徵one-hot一下爲三個特徵列,若某個用戶性別時男,那麼他的表示就是(1,0,0),女就是(0,1,0),以此遞推null就是(0,0,1),那麼性別這個特徵就是一個field,他的feature size就是3個(男,女,null)。所以說可能存在每個filed內部長度不一樣的問題,但是embedding這層的長度就是一樣的了(F*K)(每個field從embedding矩陣中選出一行拼接成dense embedding)

上模型架構圖如下

這個模型架構其實完全符合fm的本身計算公式,之所以會提到這個是因爲我們最開始實現的是非稀疏數據作爲輸入,然後直接利用fm的化簡公式進行構建,後來考慮到公司都是libsvm數據,故考慮這個fm layer,最開始我看github上deepfm的源碼一度是以爲二者有差別的,後來和同時爭論一番發現我被完美說服,最重要的就是我忽略了上圖中weight-1 connection部分,我以爲權重還是參數需要訓練的,所以希望大家閱讀一些新的模型的論文時,能仔仔細細的摸清模型的架構圖,一般描繪的都是非常詳細的,然後掌握好維度問題,復現就沒啥問題了。

二層交叉一般是通過化簡公式求,即

  # FM layer
            self.embeddings = tf.nn.embedding_lookup(self.weights['feature_embeddings'], self.train_features) # None * F * K

            # ---------- first order term ----------
            self.y_first_order = tf.nn.embedding_lookup(self.weights['feature_bias'], self.train_features)  # None * F * 1
            self.y_first_order = tf.reduce_sum(self.y_first_order,2)  # None * F

            # ---------- second order term ---------------
            # sum_square part
            self.summed_features_emb = tf.reduce_sum(self.embeddings, 1)  # None * K
            self.summed_features_emb_square = tf.square(self.summed_features_emb)  # None * K

            # square_sum part
            self.squared_features_emb = tf.square(self.embeddings)
            self.squared_sum_features_emb = tf.reduce_sum(self.squared_features_emb, 1)  # None * K

            # second order
            self.y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square,
                                                    self.squared_sum_features_emb)  # None * K

如果之時fm,那麼將y_first_order和y_second_layer拼接成[None,K+F],在第一維度求和[B,1]即爲fm的輸出

    2.deep層

deep層非常簡單,就是一個簡單的DNN模型,架構如下

從圖可以看出,dense embedding就是他的input層了,那麼input layer維度是[B,F*K] 

之後全連接層就可以隨便定義了,比較簡單,不細說了

最後一層yDNN輸出維度就是[B,1]

和yFM想加,再過一下sigmoid函數就是我們模型預測的y_hat了

y_hat = sigmoid(yDNN+yFM)

思考?:

1. 如果存在multi-hot問題怎麼辦,也就是說一個field裏面爲0的因子不止有1個?

    可以考慮加池化,可參考https://zhuanlan.zhihu.com/p/48057256

2. 工業界公司如果線上已經是fm模型了,那要實現deepfm還需要重新搭嗎?

    我個人覺得是如果是想從fm轉型至deepfm,那麼可以直接用現有的embedding矩陣,再做個dnn,兩者融合就ok。

 

本文僅代表自己一些看法觀點,如有錯誤或者不足歡迎指正,在此附上個人微信,歡迎共同探討!

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