简介
场景:根据用户历史行为序列给用户推荐物品
例如:根据用户最近买了鞋子,裙子,现在要预估一件女性大衣的CTR
或者音乐场景中,用户最近在听rap,给他推荐一些中国新说唱的歌曲的CTR
- 普通做法,对用户历史行为的item embedding做average pooling
- 但是实际中,用户行为中有些跟当前推荐物品有关,有些跟当前物品无关,比如女性偶尔给男朋友买了球鞋,偶尔听到一首热门歌曲,其实跟用户当前想要的物品关联度不高,而女性又一次买了高跟鞋,可能这次买口红的关联行酒更大
这就是attention机制的意义。
Attention机制
注意力机制顾名思义,就是模型在预测的时候,对用户不同行为的注意力是不一样的,“相关”的行为历史看重一些,“不相关”的历史甚至可以忽略。那么这样的思想反应到模型中也是直观的
Vu是用户兴趣表达,Vi是历史物品embedding,Va是当前物品embedding
wi是每个历史物品和当前物品的相关性权重,可以由Vi,Va的相关性函数表示。g(Vi, Va)由Activation Unit表示
传统的Attention机制中,给定两个item embedding,比如u和v,通常是直接做点积uv或者uWv,其中W是一个|u|x|v|的权重矩阵,但这篇paper中阿里显然做了更进一步的改进,着重看上图右上角的activation unit,首先是把u和v以及u v的element wise差值向量合并起来作为输入,然后喂给全连接层,最后得出权重,这样的方法显然损失的信息更少
源码分析
输入数据处理:
lookup history embedding
lookup song embedding 和 song category embdding
hidden_units = 128
user_emb_w = tf.get_variable("user_emb_w", [user_count, hidden_units])
item_emb_w = tf.get_variable("item_emb_w", [item_count, hidden_units // 2])
item_b = tf.get_variable("item_b", [item_count],
initializer=tf.constant_initializer(0.0))
cate_emb_w = tf.get_variable("cate_emb_w", [cate_count, hidden_units // 2])
cate_list = tf.co