推荐系统之DIN模型(注意力机制对业务的理解)

前言

前面讲过了AFM,AFM是对注意力机制的一个浅显的尝试,并没有基于业务上进行设计的一个模型。在工业领域例如在线广告上点击率(Click-through rate,CTR)预测是一个很重要的任务。在每次点击费用(cost-per-click,CPC)的广告系统中,广告按有效价格,即每千个有效成本(effective cost per mille,eCPM)排名,该价格是出价与CTR的乘积,而点击率则需要通过系统预估。因此,CTR预估模型的效果直接影响最终收益,并在广告系统中发挥关键作用。DIN是2018年阿里提出来的一个模型,相比较AFM,它更加有一些业务气息在里面。这个模型的应用长江是阿里的电商广告推荐业务,咋用户进行电商产品浏览的时候,往往会产生大量的历史浏览记录,而DIN就是充分利用这些历史浏览记录加上注意力机制来模型用户的兴趣爱好。通俗来说就是再给用户推荐商品的时候可以借鉴他之前购买或者浏览过的商品,进而进行推荐。

之前讲解过的所有推荐模型都可以看作Embedding&MLP模型,这些模型对于推荐来说都是有着差不多的套路,不同的地方就在于Embedding和特征交叉的部分。总的来说就是将大量稀疏特征转化为稠密的Embedding向量,然后拼接,再进行不同的交叉。但是这样就存在一个问题,那就是不同的用户有着不同的历史行为特征,而这些历史行为会对预测带来不同的作用。蛮力将这些特征进行拼接交叉就会导致无法很好的表达用户广泛的兴趣。这也是DIN需要解决的问题。

1、DIN背景分析

对于电商广告的推荐大体主要是需要及时的捕捉用户的兴趣爱好,但是用户的兴趣爱好多种多样并随时变化,这就需要根据用户历史行为来进行学习预测。但是并不是用户所有历史的行为都能够代表用户的兴趣爱好,比如广告中的商品是键盘, 如果用户历史点击的商品中有化妆品, 包包,衣服, 洗面奶等商品, 那么大概率上该用户可能是对键盘不感兴趣的, 而如果用户历史行为中的商品有鼠标, 电脑,iPad,手机等, 那么大概率该用户对键盘是感兴趣的, 而如果用户历史商品中有鼠标, 化妆品, T-shirt和洗面奶, 鼠标这个商品embedding对预测“键盘”广告的点击率的重要程度应该大于后面的那三个。所以基于之前那种将Embedding稠密向量进行暴力拼接的模型在这里并不是很好的实用。

我们需要自适应的去捕捉对用户兴趣预测起一个积极作用的历史行为,这样才能有更加有效的对用户进行商品的一个推荐。谈起自适应性,那肯定是能用得上注意力机制,作者把注意力引入到了模型,设计了一个"local activation unit"结构,利用候选商品和历史问题商品之间的相关性计算出权重,这个就代表了对于当前商品广告的预测,用户历史行为的各个商品的重要程度大小, 而加入了注意力权重的深度学习网络,就是这次的主角DIN。

大部分推荐场景都会应用到召回和排序这两个阶段,而商品推荐和其他的一些推荐的区别就是很注重用户的历史行为,因为这个是和用户的兴趣直接相关的,这也是DIN的背景以及动力。

在这里插入图片描述

 2、数据处理和基线

像之前的模型处理数据集都是每一个类别下面都是包含一个Feature的,但是在真实业务中往往包含多个Feature,如下图所示:

在这里插入图片描述

 对于特征编码,作者这里举了个例子:[weekday=Friday, gender=Female, visited_cate_ids={Bag,Book}, ad_cate_id=Book], 这种情况我们知道一般是通过one-hot的形式对其编码, 转成系数的二值特征的形式。但是这里我们会发现一个visted_cate_ids, 也就是用户的历史商品列表, 对于某个用户来讲,这个值是个多值型的特征, 而且还要知道这个特征的长度不一样长,也就是用户购买的历史商品个数不一样多,这个显然。这个特征的话,我们一般是用到multi-hot编码,也就是可能不止1个1了,有哪个商品,对应位置就是1, 所以经过编码后的数据长下面这个样子:

在这里插入图片描述

这个就是喂入模型的数据格式了,这里还要注意一点 就是上面的特征里面没有任何的交互组合,也就是没有做特征交叉。这个交互信息交给后面的神经网络去。 

扫描二维码关注公众号,回复: 14742865 查看本文章

看完数据处理,再来看一下基线模型,原理也很简单,就是前面的Embedding&MLP的东西,DIN就是在这个基线的基础上添加了注意力网络来自适应的学习当前广告和用户历史行为相关性。基线模型结构主要包括三个模块:Embedding、Pooling&Concat layer、MLP。结构如下:

在这里插入图片描述

Embedding layer:这个层的作用是把高维稀疏的输入转成低维稠密向量, 每个离散特征下面都会对应着一个embedding词典, 维度是D × K , 这里的D 表示的是隐向量的维度, 而K 表示的是当前离散特征的唯一取值个数nunique(), 在这里举个例子:

假设某个用户的weekday特征就是周五,化成one-hot编码的时候,就是[0,0,0,0,1,0,0]表示,这里如果再假设隐向量维度是D, 那么这个特征对应的embedding词典是一个D × 7 的一个矩阵(每一列代表一个embedding,7列正好7个embedding向量,对应周一到周日),那么该用户这个one-hot向量经过embedding层之后会得到一个D × 1 的向量,也就是周五对应的那个embedding,怎么算的,其实就是embedding矩阵∗[0,0,0,0,1,0,0] ^T。看这句话比较抽象的话可以写一个矩阵和向量进行模拟。

对于商品来说,可能会有多个商品,这时候的 multi-hot编码就含有很多1,这时候就会在商品的Embedding向量里面讲值为一的列向量取出来,这时候会得到一个商品Embedding向量列表:

在这里插入图片描述

通过这个层,上面的输入特征都可以拿到相应的稠密embedding向量了。 

pooling layer and Concat layer: pooling层的作用是将用户的历史行为embedding这个最终变成一个定长的向量,因为每个用户历史购买的商品数是不一样的, 也就是每个用户multi-hot中1个个数不一致,这样经过embedding层,得到的用户历史行为embedding的个数不一样多,也就是上面的embedding列表t_i不一样长, 那么这样的话,每个用户的历史行为特征拼起来就不一样长了。 而后面如果加全连接网络的话,我们知道,他需要定长的特征输入。 所以往往用一个pooling layer先把用户历史行为embedding变成固定长度(统一长度),所以有了这个公式:

 这里的k 表示对应历史特种组里面用户购买过的商品数量,也就是历史embedding的数量,看上面图里面的user behaviors系列,就是那个过程了。 Concat layer层的作用就是拼接了,就是把这所有的特征embedding向量,如果再有连续特征的话也算上,从特征维度拼接整合,作为MLP的输入。在这里就是将用户历史行为数据进行无差别拼接了,后面DIN的改进也是基于这部分进行的修改。

Loss: 由于这里是点击率预测任务, 二分类的问题,所以这里的损失函数用的负的log对数似然:

通过上面的图也能看出来, 用户的历史行为特征和当前的候选广告特征在全都拼起来给神经网络之前,是一点交互的过程都没有, 而拼起来之后给神经网络,虽然是有了交互了,但是原来的一些信息,比如,每个历史商品的信息会丢失了一部分,因为这个与当前候选广告商品交互的是池化后的历史特征embedding, 这个embedding是综合了所有的历史商品信息, 这个通过我们前面的分析,对于预测当前广告点击率,并不是所有历史商品都有用,综合所有的商品信息反而会增加一些噪声性的信息,可以联想上面举得那个键盘鼠标的例子,如果加上了各种洗面奶,衣服啥的反而会起到反作用。其次就是这样综合起来,已经没法再看出到底用户历史行为中的哪个商品与当前商品比较相关,也就是丢失了历史行为中各个商品对当前预测的重要性程度。最后一点就是如果所有用户浏览过的历史行为商品,最后都通过embedding和pooling转换成了固定长度的embedding,这样会限制模型学习用户的多样化兴趣。

DIN通过给定一个候选广告,然后去注意与该广告相关的局部兴趣的表示来模拟此过程。 DIN不会通过使用同一向量来表达所有用户的不同兴趣,而是通过考虑历史行为的相关性来自适应地计算用户兴趣的表示向量(对于给的的广告)。 该表示向量随不同广告而变化。下面看一下DIN模型。

3、DIN模型

讲到这里DIN的出现就很合理了,其实就是在Pooling层加了一个local activation unit。这一层用在了用户的历史行为特征上面,可以根据用户历史行为商品对当前广告的相关性给用户历史行为商品的Embedding向量进行加权。先看一下模型架构:

在这里插入图片描述

在这里改进的地方就是在商品的Embedding向量和当前商品的Embedding向量进行了一个交互,这个交互方式是local activation unit。其实就是一个前馈神经网络,输入两个向量,然后输出这两个向量的相关性。这个相关性相当于每个历史商品的权重,把这个权重与原来的历史行为embedding相乘求和就得到了用户的兴趣表示\boldsymbol{v}_{U}(A)。公式如下所示:

 这里的\{\boldsymbol{v}_{A}, \boldsymbol{e}_{1}, \boldsymbol{e}_{2}, \ldots, \boldsymbol{e}_{H}\}是用户U 的历史行为特征embedding,v_{A}表示的是候选广告A AA的embedding向量,a(e_j, v_A)=w_j表示当前商品的权重或者历史行为商品与当前广告A 的相关性程度。a ( ⋅ ) 表示的上面那个前馈神经网络,也就是那个所谓的注意力机制,当然,看图里的话,输入除了历史行为向量和候选广告向量外,还加了一个它俩的积操作(对应位置元素乘),作者说这里是有利于模型相关性建模的显性知识,有的还加上差的,就类似于PNN里面的(concat(A, B, A-B, A*B)。

这里有一点需要特别注意,就是这里的权重加和不是1, 准确的说这里不是权重, 而是直接算的相关性的那种分数作为了权重,也就是平时的那种scores(softmax之前的那个值),这个是为了保留用户的兴趣强度。

讲到这里这就是DIN的全部东西了,接下来讲一下这个模型的两个训练技巧,也是基于真实业务的技巧。

4、训练技巧

1、Mini-batch Aware Regularization

这是一种正则化方法,是基于L2正则化进行优化的,棘突来说在L2正则化的时候,会对所有的参数都进行计算,但是在推荐算法中,有很多的数据都是为0的情况。举个例子来说,针对商品id,这个Embedding矩阵是很大的,在进行计算的时候,没有必要将Embedding矩阵中的所有参数都进行计算,因为样本特征是非常稀疏的。仅仅约束那些在当前mini-batch样本中出现的特征(不为0的那些特征)embedding就可以了。所以这个就是作者的改进思路,这个方法就叫做mini-batch aware 正则。

作者首先说模型训练过程中,造成复杂度的主要原因是每个特征对应的embedding字典矩阵的更新,就是那个D × K 的大矩阵, 如果我们能把这个的计算量降下去, 模型训练就不成问题了,所以这里的正则也主要是放到了这个东西上去。而按照作者提出的这个改进思路, 在全部样本上的正则化公式如下:

 上面公式中,约束性分子是一个示性函数, 如果样本的某个特征取值不是0,其对应的embedding参数才加约束, 而分母是表示当前特征不是0(出现过)的样本个数。这里的K 是特征个数。  如果换成mini-batch的话,是下面这样子:

 上面理解了,这个的话很容易理解, 加了一个mini-batch, 也就是mini-batch中只对出现过的特征embedding参数加约束。上面公式的( x , y ) 属于整个训练集,这里的属于某个mini-batch,所以前面才有了一个mini-batch之间的遍历加和项, 不再过多解释,而这里作者为了简单, 把示性函数这个换成了一个固定值,毕竟各个样本在每个不同的特征下取值为1的个数会不同, 算起来会有些麻烦,所以作者在这里取了个近似,让\alpha_{m j}=\max _{(x, y) \in \mathcal{B}_{m}} I\left(x_{j} \neq 0\right) \mathrm{} 。公式如下:

 2、Data Adaptive Activation Function

这里提出了一个随着数据分布而动态调整的自适应激活函数, 是泛化的PRelu,这个是在神经网络中非常常用的一个激活函数, 作者把它用在了注意力的那个网络里面, 这个激活函数的公式如下:

 这里p ( s ) 的函数图像如下(左):

 作者这里之处了这个激活函数的不足就是PReLU采用一个值为0的硬矫正点,当每个层的输入遵循不同的分布时,这可能不适合。所以作者这里设计了一个新的自适应激活函数叫做Dice,它的p ( s ) 是右边这个图, 公式如下:

这里的E ( s ) 和V a r ( s ) 是每个mini-batch里面样本的均值和方差,当然这是训练集部分,测试集的时候采用的是在数据上平滑的均值和方差,这里类似于Adam和BN的平均均值的感觉。 由于把均值和方差考虑进去了, 那么这个函数的调整就可以根据数据的分布进行自适应,这样会更加的灵活且合理,有点类似于sigmoid的感觉了。

5、其他细节

这里再整理一些其他细节, 这部分主要是来自于作者的实验了, 首先是数据集上。这里作者采用了是三个数据集,阿里巴巴的一个真实场景数据,两个公共数据集,一个是亚马逊的产品数据集,一个是movielens数据集, 当然具体描述可以参考原论文,后面我们也用Pytorch实现DIN模型,并用亚马逊的数据集走一下,到那里再解释这个数据集。 这里只是想说movieslen数据集, 竟然还能玩点击率预测任务,之前我也用过这个,但是看见的是电影的评分,并且也没有考虑用户的历史行为评分, 而这里作者为了转成二分类,把评分大于3的算作点击,小于3的算作不点击,然后转成了0和1的分类任务,并考虑进了用户的历史点击行为,后面如果有时间,也搞搞这个数据集试一下。

第二个细节就是评估上,这里认识到了一个衡量模型改进程度的一个东西叫RelaImpr, 公式计算如下:

 这个东西是基于base model看模型的提高程度的。 还认识到了一个加权的AUC(GAUC), 公式如下:

总结:

 DIN模型是基于真实的业务场景搞的, 解决的痛点是深度学习模型无法表达用户多样化的兴趣。 它可以通过考虑【给定的候选广告】和【用户的历史行为】的相趣的表示关性,来计算用户兴向量。具体来说就是通过引入局部激活单元,通过搜索历史行为的相关部分来关注相关的用户兴趣,并采用加权和来获得有关候选广告的用户兴趣的表示。与候选广告相关性较高的行为会获得较高的激活权重,并支配着用户兴趣。该表示向量在不同广告上有所不同,大大提高了模型的表达能力。当然这个模型的应用需要数据集有着丰富的用户历史行为数据才可以进行。

在这里插入图片描述

 参考:AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)

猜你喜欢

转载自blog.csdn.net/qq_38375203/article/details/125599867
今日推荐