DMIN (Deep Multi-Interest Network) 模型介紹與源碼分析

目錄

  • 零.前言 (與正文無關, 請忽略)
    • 廣而告之
  • 一. 文章信息
  • 二. 核心觀點
  • 三. 核心觀點解讀
  • 四. 源碼分析
    • Behavior Refiner Layer
    • Multi-Interest Extractor Layer
  • 五. 總結

零.前言 (與正文無關, 請忽略)

對自己之前分析過的文章做一個簡單的總結:

  • 機器學習基礎: LR / LibFM
  • 特征交叉: DCN / PNN / DeepMCP / xDeepFM / FiBiNet / AFM
  • 用戶行為建模: DSIN / DMR / DMIN / DIN
  • 多任務建模: MMOE
  • Graph 建模: GraphSage / GAT

廣而告之

可以在微信中搜索 “珍妮的算法之路” 或者 “world4458” 關註我的微信公眾號;另外可以看看知乎專欄 PoorMemory-機器學習, 以後文章也會發在知乎專欄中. CSDN 上的閱讀體驗會更好一些, 地址是: https://blog.csdn.net/eric_1993/category_9900024.html

一. 文章信息

  • 論文標題: Deep Multi-Interest Network for Click-through Rate Prediction
  • 論文地址: https://www.researchgate.net/publication/345125472_Deep_Multi-Interest_Network_for_Click-through_Rate_Prediction
  • 代碼地址: https://github.com/mengxiaozhibo/DMIN
  • 發表時間: 2020
  • 論文作者: Xiao Zhibo, Luwei Yang
  • 作者單位: Alibaba

二. 核心觀點

文章認為用戶在同一時間會存在多種興趣, 但潛在的主要興趣最終會通過用戶行為表現出來. 為瞭建模用戶潛在的主要興趣, 文章提出 DMIN 網絡, 其中 Behavior Refiner Layer 采用 multi-head self-attention 獲取更好的用戶歷史行為表達, 而 Multi-Interest Extractor Layer 也采用 Multi-Head Self-Attention 來建模用戶多種潛在的主要興趣, 計算權重系數時引入瞭 Position Encoding, 各個子空間(或者說各個 Head)對應的 embedding 即表示用戶的 multi interest.

三. 核心觀點解讀

DMIN 網絡結構設計如下圖:

四. 源碼分析

DMIN 模型定義在 https://github.com/mengxiaozhibo/DMIN/blob/master/code/model.py 文件中, 類名為 Model_DNN_Multi_Head.

Behavior Refiner Layer

采用 Multi-Head Self-Attention 完成對用戶興趣的初步提取:

maxlen = 20
other_embedding_size = 2
## 生成 Position Embedding
self.position_his = tf.range(maxlen)
self.position_embeddings_var = tf.get_variable("position_embeddings_var", [maxlen, other_embedding_size])
self.position_his_eb = tf.nn.embedding_lookup(self.position_embeddings_var, self.position_his) # T,E
self.position_his_eb = tf.tile(self.position_his_eb, [tf.shape(self.item_his_eb)[0], 1]) # B*T,E
self.position_his_eb = tf.reshape(self.position_his_eb, [tf.shape(self.item_his_eb)[0], -1, self.position_his_eb.get_shape().as_list()[1]]) # B,T,E
with tf.name_scope("multi_head_attention"):
multihead_attention_outputs = self_multi_head_attn(self.item_his_eb, num_units=EMBEDDING_DIM*2, num_heads=4,dropout_rate=0,is_training=True)
print('multihead_attention_outputs.get_shape()',multihead_attention_outputs.get_shape())
multihead_attention_outputs1 = tf.compat.v1.layers.dense(multihead_attention_outputs,EMBEDDING_DIM*4,activation=tf.nn.relu)
multihead_attention_outputs1 = tf.compat.v1.layers.dense(multihead_attention_outputs1,EMBEDDING_DIM*2)
multihead_attention_outputs = multihead_attention_outputs1 + multihead_attention_outputs

赞(0)