1. 概述
用户兴趣是推荐系统中非常重要的trigger,在召回阶段,通过召回与用户兴趣相匹配的item,在排序阶段,用户兴趣作为很重要的一个特征维度,与用户兴趣越相似的item将会被排到越靠前的位置。因此,在推荐系统中,对于用户兴趣的建模显得尤为重要。在目前为止,通常采用的方法是对用户的历史行为挖掘,实现对用户兴趣的建模。
在实际生活中,一个人的兴趣通常是多方面的,不是单一的,传统的建模方式是将用户的行为序列转成固定长度的embedding形式,这样的方式却限制了对用户兴趣的建模能力。其主要原因是用户的兴趣是多样的,统一的固定长度的embedding难以刻画用户兴趣的多样性。深度兴趣网络DIN[1]通过使用Attention机制捕获目标item与用户行为序列中的item之间的相关性,从而实现对特定的目标item的兴趣建模,并将其应用到排序阶段。
2. 算法原理
2.1. 基本模型
DIN模型也是建立在基本模型MLP基础上,对于基础模型Base Model如下图所示:
对于CTR预估,特征主要包括用户画像特征(User Profile Features),用户行为特征(User Behavior Features),目标item的特征(Candidate Ad)以及上下文特征(Context Features)。上述的特征中,对于离散的类别特征,通常转换成one-hot或者multi-hot形式,具体如下图所示:
通过对用户历史行为的特征进行pooling操作,实现对用户兴趣的建模,并与其他的特征,如用户的画像特征,待排序item特征,上下文特征一起实现CTR预估,最终,模型的损失函数为:
2.2. 深度兴趣网络DIN
在实际场景中,用户的兴趣往往是多样的,或者说是多个维度的,在上述基本的网络模型中,通过对用户行为序列建模,得到用户兴趣的固定长度的向量表示,这样的固定长度的向量难以表达用户的不同兴趣。在深度兴趣网络(Deep Interest Network,DIN)[1]中,借鉴Attention的原理,通过计算候选item与用户行为序列中item之间的相关关系,来动态的计算用户在当前的item下的即时兴趣向量。
2.2.1. DIN的模型结构
DIN的模型结构如下图所示:
DIN的模型结构与基本模型结构基本一致,不同的是在计算用户兴趣向量时,使用了如下的计算方式:
2.2.2. DIN的实现差异
在[3]的官方实现中,在计算Activation Weight的过程中,有几点与原文中不一致:
- 特征
从上面的图中,我们看到是将User的特征,Ad的特征,以及Out Product(两者的外积)的特征concat在一起,在代码中是将:queries
,facts
,queries - facts
,queries * facts
这四项concat在一起:
in_all = tf.concat([queries, facts, queries - facts, queries * facts], axis=-1)
其中queries表示的是Ad向量,facts表示的是User的行为向量,queries * facts表示的是外积。
- 是否归一化
原文中指出不需要归一化,但是在代码中却是可以使用了归一化的操作,如下所示:
# Activation
if softmax_stag: # 是否使用归一化
scores = tf.nn.softmax(scores) # [B, 1, T]
# Weighted sum
if mode == 'SUM': # 加权求和
output = tf.matmul(scores, facts) # [B, 1, H]
完整的实现可以参见参考文献[3]。
3. 总结
鉴于单一的固定向量不能表达用户兴趣的多样性,在深度兴趣网络DIN中使用了注意力机制捕获目标item与用户的行为序列中的item之间的相关性,得到在特定目标item的场景下的用户兴趣表示,从而提升对用户及时兴趣的捕捉能力。
参考文献
[1]. Zhou G, Zhu X, Song C, et al. Deep interest network for click-through rate prediction[C]//Proceedings of the 24th ACM SIGKDD international conference on knowledge discovery & data mining. 2018: 1059-1068.
[2]. 推荐系统CTR模型:Deep Interest Network(DIN)源码分析
[3]. DIN官方实现
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: js原型prototype(实例构造函数的属性) __proto__(实例对象的属性) constructor(实例构造函数prototyper的属性)
function Person(name,age){ this.name=name this.age=age } Person.prototype.sayHi=function(){//原型是公共方法解决构造函数new对象公共属性和方法的内存浪费 consol…