前言
代码地址:github
注意torch的代码都是别人复现的,可能和原文有diff,还是建议github看tf的源码
论文地址:arxiv
系列文章
推荐系统——Neural Collaborative Filtering(NMF)
推荐系统——Deep Interest Network for Click-Through Rate Prediction(DIN)
推荐系统——Deep Interest Evolution Network for Click-Through Rate Prediction(DIEN)
推荐系统——Deep Session Interest Network for Click-Through Rate Prediction(DSIN)
推荐系统——Multi-Interest Network with Dynamic Routing for Recommendation at Tmall(MIND)
推荐系统——Behavior Sequence Transformer for E-commerce Recommendation in Alibaba(BST)
持续更新中…
动机
作者提出以往的方法都直接的将用户的行为压缩成固定长度的向量,而没有去考虑候选广告的信息,作者认为这样很难去从以往丰富的行为中学习到有用的知识。
原文解释:
In this way, user features are compressed into a fixed-length representation vector, in regardless of what candidate ads are. The use of fixed-length vector will be a bottleneck, which brings difficulty for Embedding&MLP methods to capture user’s diverse interests effectively from rich historical behaviors
因此作者提出了attention的机制。
网络结构
DIN的结构也不是很复杂,主要结构如下:
图中的User Profile features是用户的属性特征,比如性别、年龄、昵称等等。User Behaviors是用户的行为特征,他是序列化的就是有同类的很多个,比如最简单的用户以往点击过的N个视频。Context Features是一些上下文信息比如时间信息。反正推荐系统基本上把所有的信息都揉在一起了。
本文的主要贡献在于对序列化的用户历史行为信息的建模,主要贡献是图中的AU模块也就是计算attention权重的模块。
计算过程如下:
举个简单的例子:
用户历史点击了两个视屏,我们直接用视屏的封面经过cnn的网络编码作为embedding,因此得到视屏1的编码f1 = 1 * dim和视屏2的编码f2 = 1 * dim,同理输入的广告视屏的编码Ad = 1 * dim。
那么怎么计算attention的权重呢,
首先f1 点乘 Ad还是得到一个 1 * dim结果记为 f1 * Ad.
然后拼接f1和Ad,即 得到一个 1 * 3dim的特征。
最后将这个1 * 3dim的特征送到MLP层输出维度是1得到的就是attention的权重值。
接下来得到了每个历史行为的权重,对历史行为进行加权求和。
最后就拼接图中圈起来的四个特征送到mlp层做预测了。
需要注意一个细节:
一般做attention的权重加权的时候都会把attention的权重经过一个softmax层做归一化,但是本文作者没有做这个归一化而是直接加权(对应图示的sum pooling处,之前是没有softmax的),这个地方我也进行了实验,如果加了softmax效果确实会差一些,而且我看了加上softmax之后attention的权重分布,就很难拉开不同样本的差距了,比如说历史行为16个,那么基本上每个的权重就接近于1/16。
我简单的分析了一下,考虑下特殊情况,假设用户对这16个样本都不感兴趣,那么他们attention的分数应该都趋于0,过了softmax之后分数就都趋于1/16,那么假设用户对这16个样本都同样程度感兴趣,那么他们attention的分数都几乎一样,过了softmax之后分数就都趋于1/16,那么这两种情况下如果加了softmax得到的attention的权重就相同了,这样显然不合理。而如果不加softmax的话,第一种情况sum pooling的结果就趋于0,第二种情况的结果得到的值就会很大,这样可以明显的区分开两种情况,这样显然更合理。所以感觉这里确实不需要加softmax,但是如果加了softmax的话也是可以的,参考以往的方法都会给softmax之前的结果除以一个温度超参,有看到论文一般除的0.2,就是放大五倍,这样有什么用呢?举个例子:
数组:a = [1,2,3]
直接softmax得到结果:
softmax(a) = [0.09, 0.24, 0.67]
除以超参0.5之后的softmax结果:
softmax(a/0.5) = [0.02, 0.12, 0.87]
可以看到按倍数放大原始序列的值可以拉大softmax之后结果的间距,这样可以一定程度减少之前列举的两种特殊情况的影响。但是引入了要调节的参数需要认为调参,所以我实验还是没有加softmax。