1 行为序列建模总体架构
2 DIN引言
用户行为序列包含了用户大量的个性化信息,比如在电商场景中,通过用户已购买商品的类目、品牌、价格,就能大体预估其对类目、品牌和价格的倾向,从而对后续精准预估发挥重要作用。因此用户行为序列建模,一直以来是推荐算法中的重点,为各大工业场景业务提升发挥了重要作用。
DIN是用户行为序列建模中非常重要的一个模型,它对用户行为序列,与当前待推荐物品,基于注意力机制进行建模,有效解决了二者的特征交叉问题。使得对于不同的待推荐物品,用户行为序列均有不同表征,从而提升模型整体表达能力。
同时,作为工业界的一篇经典文章,DIN也介绍了很多模型训练和评估的技术细节。它提出了基于小批量数据的正则化方法MBA(全称 Mini-batch Aware Regularization)、全新的激活函数Dice、以及基于用户的模型离线评估方法GAUC。这些都非常值得借鉴,后文会详细讲解。
3 DIN业务背景
DIN应用于阿里巴巴电商中的广告场景,其用户和广告均为亿级,规模十分庞大。在CPC(每点击付费)等广告系统中,CTR预估与业务收益直接相关。DIN业务场景的广告,即为实际的商品。用户在阿里巴巴电商网站中,有丰富的点击和购买等行为。将用户点击或购买过的商品的id等特征,按先后顺序组成一个序列,即为用户行为序列。在当前基于深度学习的推荐模型中,全连接层的输入向量长度必须是固定的。但显然用户行为序列是变长的,故需要对其进行建模,然后再和其他特征一起输入到全连接层中。
一种比较简单的方法是采用累加池化(Sum-Pooling)或平均池化(Average-Pooling)。将行为序列中所有商品的Embedding向量,按element-wise的方式进行池化,即相同位置处元素累加或累加后取平均。YouTube[1]于2016年公布的其工业场景应用的推荐模型,就是采用的这种方法。采用Sum-Pooling建模用户行为序列的模型架构如图5-2所示。
图5-2中,输入特征有用户静态特征、用户行为序列、物品特征、上下文特征四大类。它们会经过Embedding层,转变成低维稠密的特征向量。用户行为序列中的多个向量,会先进行Sum-Pooling,压缩为一个定长向量。然后再和其他输入特征的Embedding向量拼接(Concat)起来,一起输入给上层的MLP全连接网络。最后通过Softmax或Sigmoid等函数输出。其行为序列建模计算过程如公式5-1所示。
其中Vu为建模后的用户行为向量,Vi为用户第i次行为对应的物品Embedding向量。这种行为序列建模方式缺点有:
- 用户行为与候选物品之间缺少特征交叉。二者在池化后才能进行交叉,但池化操作压缩了行为序列,使之有一定信息失真,导致交叉并不充分。如果能在池化前就进行特征交叉则会更好。
- 推荐不同候选物品时,用户行为序列建模结果不变。这会导致行为序列表达能力不足,从而影响模型整体性能。
- 每个行为同等对待,重要性没有区分。假如用户行为序列中有短袖、上衣、鼠标和耳机等商品,现在要给用户推荐一款服饰,则显然短袖和上衣的参考价值更高。如果要推荐数码产品,则显然鼠标和耳机更为重要。如图5-3所示,当候选商品为羽绒服时,用户之前点击过的几件羽绒服,与目标的相关性最高。冬季手套和睡衣次之,而茶杯、包包、吸尘器、鞋子、短裤则几乎完全不相关。
针对这一问题,阿里巴巴广告团队于2017年提出了DIN模型,全称“ Deep Interest Network for Click-Through Rate Prediction”[2]。其整体上仍然采用经典的“Embedding + MLP”范式,核心在于对用户行为序列,采用基于注意力机制的池化方法。从而解决了行为序列与候选商品的充分交叉、行为序列针对不同候选物品的自适应建模、各历史行为的重要性进行有效区分等问题。
4 DIN模型结构和核心模块Activation Unit
DIN模型结构如图5-4所示,整体上与图5-2比较类似,核心在于用户行为序列建模的优化。
其主要过程如下:
- 取出用户行为序列中的各商品的特征,比如商品ID、店铺ID、类目ID等,将其Embedding向量拼接(Concat)起来。候选广告的相关特征Embedding也拼接起来。
- 将各拼接后的历史行为商品Embedding,与候选广告的Embedding,进行激活交叉,得到一个标量,即为注意力权重。这一步解决了特征交叉不充分的问题。
- 利用第二步得到的注意力权重,对历史行为商品向量进行加权求和,最终池化为一个与商品向量等长的向量。这一步解决了各历史行为重要性无法区分,和行为序列的表征,针对不同候选物品不能自适应变化等问题。
DIN本质上仍然是对行为序列进行池化,不过它采用的是注意力池化(Attention-Pooling),这就是DIN的核心。理解了Attention-Pooling,基本就掌握了DIN的一大部分了。Attention-Pooling的操作过程如公式5-2所示。
一种简单的激活就是采用内积操作,计算两向量间的余弦相似度。但DIN采用了全连接网络来实现,信息采集更为充分。其结构如图5-5所示。
其主要过程如下:
- 将用户特征向量,也就是用户有过历史行为的商品的特征向量,与候选广告特征向量相减,得到一个新向量。两向量相减可以表征特征差异性。此处还可以做向量相加、相乘(对应元素相乘)等其他操作。
- 将第一步得到的向量,与用户特征向量、候选广告特征向量,拼接(Concat)起来。
- 经过两层全连接网络,输出最终结果。结果为一个标量,代表用户特征与广告特征的相关性。
DIN的用户行为序列建模稍显复杂,但只要抓住Attention-Pooling这一核心即可。Attention-Pooling可以简单理解为加权求和池化。在实际业务中,有如下细节需要注意:
- 用户行为序列中商品的各特征,比如商品ID、店铺ID、类目ID等,可以与候选商品侧,共享Embedding向量。从而降低模型参数量,并加速模型收敛。
- 行为序列中商品的各特征,与候选商品交叉时,始终只对相同特征域进行交叉。比如店铺ID与店铺ID交叉,类目ID与类目ID交叉。这样可以最大限度降低信息交叉噪音。
- 可以将业务中比较重要的其他商品特征,也加入到行为序列中,比如商品价格、品牌ID等。这有利于进一步增加序列建模的泛化能力和表征能力。
- 可以将用户行为,按照发生先后顺序,由近及远进行编码。然后将这一特征加入到行为序列中,从而表征每个行为发生的先后关系,类似于Transformer中的position。更进一步的,可以将每个行为距离当前的时间间隔,也作为一个输入特征,从而表征行为随时间的衰减程度。
- 激活单元的全连接输出没有做归一化,比如Softmax操作。其原因是想保留用户不同兴趣的强度。比如用户历史行为中,90%为服装类目,10%为数码产品。当推荐T-shirt和手机给用户时,T-shirt可以与大部分历史行为产生关联,其行为序列建模后的向量,应该比手机的大。如果做了归一化,则无法保证这一点。
5 DIN训练方法、详细代码
参见下一篇文章
精通推荐算法24:行为序列建模之DIN -- 注意力池化(下)-CSDN博客
6 作者新书推荐
历经两年多,花费不少心血,终于撰写完成了这部新书。本文在5.2节中重点阐述了。
源代码:扫描图书封底二维码,进入读者群,群公告中有代码下载方式
微信群:图书封底有读者微信群,作者也在群里,任何技术、offer选择和职业规划的问题,都可以咨询。
详细介绍和全书目录,详见
《精通推荐算法》,限时半价,半日达https://u.jd.com/m85agj3