DIN来自于 阿里 盖坤团队 在 KDD-2018 发的论文《Deep Interest Network for Click-Through Rate Prediction》。该模型在当时已经应用于阿里的电商广告推荐业务,效果不错。
文章目录
- 1、介绍:
- 2、单值特征 & 多值特征:
- 3、动机:
- 4、创新点:
- 5、DIN模型结构:
-
- 5.1、CTR数据集形式
- 5.2、embedding+mlp范式
- 5.3、DIN:
- 6、改进L2正则 & Dice激活函数:
-
- 6.1、自适应的正则技术 - Mini-batch Aware Regularization:
- 6.2、激活函数Dice - Data Adaptive Activation Function:
- 7、新的评估方式 - GAUC:
1、介绍:
- 电商广告推荐:召回+排序。商品广告推荐很注重用户的历史行为数据,因为这个直接与用户的兴趣相关,而用户兴趣又反过来和商品挂钩。
- DIN主要做的就是:引入注意力机制来对用户的兴趣(即历史行为信息:历史购买商品/商品类别序列、历史点击商品/商品类别序列等)建模,来预测对于某个商品广告,用户是否会点击,即解决CTR任务。
2、单值特征 & 多值特征:
- 单值特征 (one-hot):对于离散特征,那就编号过embedding咯。对于连续特征,可以直接拼接到后面的特征,也可离散化后过embedding。
- 多值特征 (multi-hot):如历史购买商品的行为序列,对所有商品的embedding做聚合,如sum, mean-pooling等。【序列的最大长度一般由batch内序列的最大长度决定,不够的用0(不在id集合内的任意数字都可以)补全】
3、动机:
- 以往模型大部分是这样一个范式:embedding+mlp。这类模型其实无法很好地表达用户的广泛兴趣。因为过embedding之后一般就是拼接,各种交叉,过mlp,并没有考虑用户历史行为中哪个历史行为过的商品对这次的预测有积极作用。
- 如现在要推一个逗猫棒,如果用户的历史购买行为是:[猫粮,牛奶,衣服,裤子,猫抓板]。那无疑,历史行为中跟猫相关的商品会给本次的预测起到积极加分作用。
- 但如果,只是对这种多值特征做简单的聚合,那相当于对这些商品同等对待了,但并不是用户所有的历史行为特征都会对某个商品广告点击预测起到作用。
- 那动机不就来了吗,加个注意力机制,让模型自适应地捕捉用户的兴趣变化,考虑用户的历史行为商品与当前商品广告的一个关联性即注意力。
所以,DIN提出了个activation unit结构,它能够利用广告商品和历史行为商品之间的相关性计算出权重(即注意力权重),以此来区分不同的历史行为商品对本次广告商品的点击起到的作用。
4、创新点:
面试时,如果要求介绍DIN,那可以直接按如下回答,包稳。
- 引入来注意力机制,建模用户的历史行为兴趣:activation unit模块。
- 提出了针对推荐领域里特征稀疏问题的正则化技术:mini-batch aware regularization。
- 在PReLU激活函数的基础上做了改进,提出了随着数据分布而动态调整的自适应激活函数Dice,是泛化PReLU。
- 提出了细化到每个用户维度的AUC指标:GAUC
5、DIN模型结构:
5.1、CTR数据集形式
工业界CTR数据集一般长这样:
- 用户画像特征
- 用户行为特征(即序列特征):包含商品id,商铺id,类目id
- 广告商品特征:同样包含,商品id,商铺id,类目id
- 上下文特征
5.2、embedding+mlp范式
先来说说embedding+mlp范式的模型,我们称其为base模型,DIN则是在base基础上引入来注意力做改进。
base模型结构如下,分为三大模块:embedding,pooling&concat,mlp。
5.3、DIN:
DIN结构如下图所示:
- 主要的部分如我用红框框住所示:
关键就是activation unit模块:
- 设历史购买商品特征为k、广告商品特征q,那这个模块会将:[q,k,q-k,q*k] (当然可以各种骚组合法都可试试) 做拼接然后过mlp最后映射出一个值,即注意力权重。
- 这样每个k都会和q计算出一个注意力权重,把这个权重与原来的历史商品embedding相乘求和(即sum pooling)就得到了用户兴趣特征。
- 注意:为了保留用户的兴趣强度,这些注意力权重之和并不是1,准确的说这里不是权重,而是直接算的相关性的那种分数作为了权重,也就是平时的那种scores(softmax之前的那个值)。
最后将:用户画像特征+用户兴趣特征+广告商品特征+上下文特征 做拼接然后过mlp,完成CTR预估任务。
6、改进L2正则 & Dice激活函数:
实践中,训练具有大规模稀疏输入特征的工业深度网络是一个很大的挑战。下面DIN提出的两种trick,它们在实践中被证明是有帮助的。
6.1、自适应的正则技术 - Mini-batch Aware Regularization:
我简称其为MAR,它是在L2正则的基础上做了改进。L2在推荐场景中存在的问题:
- L2正则是对所有参数都起作用的,但batch内样本的某些特征是非常稀疏的,这种情况没必要考虑所有的参数进去,这个复杂度会非常大, 而仅仅约束那些在当前mini-batch样本中出现的特征(不为0的那些特征)embedding就可以了。作者就是出于该动机做了改进。
模型训练过程中,造成复杂度的主要原因是每个特征对应的embedding字典矩阵的更新。如果能把这个的计算量降下去,模型训练就不成问题了,所以这里的正则是对embedding矩阵的正则。
设Ki为某特征的取值数,D为嵌入维度,embedding矩阵大小为Ki*D。
-
也就是对样本的某个特征取值不为0,其对应的embedding参数才加正则约束
具体地:
-
原始L2正则到MAR的变化,针对所有样本的正则公式:
-
针对所有batch的所有样本的公式:
-
最终公式:
作者为了简单,把示性函数这个换成了一个固定值,因为各个样本在每个不同的特征下取值为1的个数会不同, 算起来会有些麻烦,所以作者在这里取了个近似,让αmj=max 也就是在各个样本中出现最多的那个特征出现的次数(感觉不太好描述,想象每一行算一个样本,每一列算一个特征, 竖着看,每一列1最多的那个特征就是对应的xj,而1出现的个数就是这里的amj,这样计算就统一起来了,所以公式约等于了下面这个:
6.2、激活函数Dice - Data Adaptive Activation Function:
-
DIN提出了提出了一个随着数据分布而动态调整的自适应激活函数Dice,它是基于prelu做改进。
-
prelu如下所示,在负值域,prelu 的斜率较小,这也可以避免 dead relu 问题,PReLU 在负值域是线性运算。尽管斜率很小,但不会趋于 0。
-
Dice改进如下,即融入了当前batch里的统计信息(均值和方差)来随着数据分布而动态调整。
这里的E(s)和Var(s)是每个mini-batch里面样本的均值和方差,当然这是训练集部分,测试集的时候采用的是在数据上平滑的均值和方差(In the testing phrase, E[s] and Var[s] is calculated by moving averages E[s] and Var[s] over data.)。 由于把均值和方差考虑进去了, 那么这个函数的调整就可以根据数据的分布进行自适应,这样会更加的灵活且合理。
看起来意思很明显,p(s)变成了sigmoid,同时对输入按当前batch来做归一化后输入sigmoid。
7、新的评估方式 - GAUC:
细化到每个用户维度的AUC指标,通过平均用户的AUC来衡量用户内部顺序的好坏,并被证明与线上广告系统的在线性能更相关。
Reference
[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.