这篇文章是阿里巴巴的gaikun团队于2018年发表于KDD的文章[1],目前已经在各大公司的点击率预估(CTR)场景都得到广泛的应用。这篇文章就从模型和代码实现方面简单介绍一下这篇文章提出的DIN模型。
1.背景
随着深度学习的发展,许多研究者将DNN网络应用到CTR的任务上来。大部分目前使用的深度学习模型都可以认为是Embedding&MLP结构,即大规模的、稀疏的输入数据首先被压缩成低维的embedding,变成固定长度的输入向量,被输入到全连接网络中去。这些模型大大减少了特征工程的工作量,因此广为流行。
但这些方法仍然有缺点,最大的缺点就是固定维数的向量不能充分地表达用户兴趣的Diversity(一般是用用户过去的购买行为或者点击行为来表示用户的兴趣),为了增加模型的学习能力,要扩大embedding的维度,而在样本有限的情况下,通常会造成过拟合的问题。
除此之外,给定一个商品,决定用户是否点击进去查看的往往是用户的部分兴趣而非所有兴趣,通常来说是最近的一些行为相关性更大一些。所以这篇文章提出的DIN模型对于不同的商品,将对应适应性的用户兴趣特征来输入,以解决固定特征维度不能充分表达用户行为的问题。其主要的中心思想,就是结合attention机制对用户的历史行为进行了加权处理,对于不同的商品,权重不一致。[2]
2.模型
2.1 MLP
首先看一下传统的DNN在点击率预估上的一般方法:
传统DNN模型一般是按照Embedding Layer&Pooling Layer->Concat->MLP的框架来构建模型的,在Embedding Layer -> Pooling Layer得到用户兴趣表示的时候,没有考虑用户与推荐商品之间的关系,即不同的推荐商品之间的权重是一致的。这正是上文DIN要解决的问题。
同时,由上图可以看出,一般CTR问题的输入包含四种类型的特征:
2.2 DIN
为了解决上述提出的问题,DIN利用attention机制,在得到用户兴趣表示时赋予不同的历史行为不同的权重,即通过Embedding Layer -> Pooling Layer+attention实现局部激活。从而在训练过程中根据当前的候选商品,来反向的激活用户历史的兴趣爱好,赋予不同历史行为不同的权重。也就是说对于不同的候选商品输入,得到的兴趣特征是不同的。网络结构如下图:
上图的左边就是DIN的模型架构图,输入还是同样的四种类型特征,而在User Profile Feature和Context Feature这两种类型的处理和上述的MLP方法保持不变。对于User Behaviors和Candidate Ad这两种特征,文章提出的是一种类似NLP中常用的Attention结构(Activation Unit)。如上述右图所示:
每个兴趣商品(Goods)要和候选商品(Candidate Ad)要进行Out Product等操作,并将外积和自身的embedding表示进行concat,输入到FC得到一个权值,对应的就是当前兴趣商品的权值。在算出所有商品的权值之后,再对所有的商品的embedding进行加权求和,结果就是用户对于当前候选商品的兴趣表示。对应的公式如下:
其中:
是候选商品的Embedding表示
是用户的兴趣商品的Embedding表示
函数a(*, *)表示上述的Activation Unit, 得到的权重是
简单看一下这里Activation Unit对应的代码,应该是官方,来源于https://github.com/zhougr1993/DeepInterestNetwork/blob/master/din/model.py[3]:
def attention(queries, keys, keys_length):输入:
queries是候选商品的embedding表示;
keys是用户浏览过的兴趣商品embeddings表示;
keys_length 表示兴趣商品的数量,因为输入的keys对应的shape相同,所以根据不同的用户,需要额外输入兴趣商品的数量。
过程:
先对queries reshape成(B, 1, H)
拼接[queries, keys, queries-keys, queries*keys],将候选商品和兴趣商品信息融合得到din_all
对于din_all进行多次MLP计算得到权值,然后reshape为(B, 1, T)
再根据输入的keys_length mask掉超过兴趣商品数量的维度
最后用softmax归一化权值,并且对兴趣商品的embeddings进行加权求和并返回结果
这个地方用的attention方法和我之前介绍过的 self attention 南枫:【NLP】换一种方式进行机器翻译-Transformer(模型和代码解析) [4]有很多相似之处,这里简单看一下不同点:
self attention中queries和keys的shape一般是相同的,且都是序列形式。而这里的queries的输入是单纯的向量。
信息融合的方式: self attention使用的是queries和keys进行矩阵乘法来得到权值,而DIN使用的是拼接[queries, keys, queries-keys, queries*keys],再进行MLP。这里加入更多的side information,符合推荐系统常用的交叉特征。