推薦系統之DCN模型

Deep&Cross Network 是繼wide&deep模型推出的,對比主要是將wide層改成cross層,用於特徵的充分自動交叉編碼,而後和deep層特徵拼接作爲最後一層輸入,其基本參數

  • feature_size(類別特徵數): M
  • field_size(類別特徵列): F
  • dense size(連續特徵個數): D
  • embedding size(每個類別特徵表示維度數): K
  • batch size :B

如上圖所知,其原始輸入X0是由連續特徵(Dense feature)和類別特徵(Sparse feature)拼接而成。

因此同樣需要先建立一個[M,K]的embedding矩陣,然後通過tf.lookup函數從emb matrix取出一批次的類別特徵[B,F,K]

X0:[B,F*K+D] ==> [B,d]  注:爲方便用d代替(F*K+D)

1. cross layer

    可以着重研究一下爲什麼是這種交叉方式,他實現了怎樣的交叉

                                                                                                                 圖源自知乎https://zhuanlan.zhihu.com/p/96010464

從上可以推斷,當cross layer疊加至L層時 ,特徵實現了L+1階的所有交叉組合,真的是很強!

複雜度分析:假設有L個cross層,每層的需要訓練的參數是w,b有2*d個參數,因此共有L*2*d個參數。時間和空間複雜度均是隨輸入維度增長而線性增長的。

在計算時,因爲x'w爲標量,因爲可先計算後兩項,再和x0相乘,維度代碼如下

xl_w = tf.tensordot(xl, w, axes=[1,0]) # (B, )
x0_xl_w = tf.multiply(x0, tf.expand_dims(xl_w, -1)) #[B,d]
x = tf.add(x0_xl_w, b) # [B,d]
x = x+xl # [B,d]

2. deep layer

    deep層就是普通DNN模型了,也是幫助特徵進行交叉,實現特徵的非線性變化,維度和思想都比較簡單,就不多贅述了。

3. Combination Layer

     最後將兩層拼接起來,再經過一個fc layer,得到[B,1]的輸出,經過sigmoid函數的洗禮就是最終的預測值了

 # concat_part
concat_input = tf.concat([self.cross_network_out, self.y_deep], axis=1)
self.out = tf.add(tf.matmul(concat_input,self.weights['concat_projection']),self.weights['concat_bias'])

 

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