推荐系统 之 DIEN

1. DIEN的由来

        其实,之前我们讨论的所有模型都是基于用户的过往历史进行物品的推荐,但是这个想法往往缺少了一个很重要的维度去模拟我们日常挑选商品的行为,那就是时间序列信息。为什么说时间序列信息对推荐来说是有价值的呢?一个典型的电商用户的现象可以说明这一点,我们在日常消费,或者日常逛淘宝的时候,其实发现自己的兴趣迁移是非常快的,例如用户在挑选一双篮球鞋的时候,这位用户上周的行为序列都会集中在篮球鞋整个品类的商品上,但在他完成购买后,本周他的购物兴趣可能变成买一个机械键盘了。但是用以往的模型(就拿最近的DIN吧),是拿所有历史行为去做处理,但是忽略了用户的兴趣(兴趣的趋势)已经发生转移了这个重要概念,所以我们应该把推荐的重心往转移的方向去移动。

        于是就诞生了DIEN模型,在DIN的基础上引入了时间序列模型GRU。

2. 模型的结构

        其实DIEN和DIN是相当的类似,唯一的不同点就是把DIN的注意力激活单元变换成一个兴趣网络了。这个兴趣网络由就是下图的 蓝色,黄色,红色区域了,分别是行为序列层,兴趣抽取层,兴趣进化层。

         行为序列层:主要是把原始的id类行为特征转化为Embedding特征,和DIN的Embedding层的处理手法是一样的。

        兴趣抽取层:主要通过模拟用户兴趣迁移的过程,抽取用户兴趣。

        兴趣进化层:主要是通过在兴趣抽取层的基础上,引入attention机制,模拟与当前目标广告相关的兴趣进化过程。

        最后将 兴趣变化的向量,广告的Embedding向量,用户画像对应的Embedding向量,还有上下文特征的Embedding向量给拼接起来,然后输入MLP里面,根据预测结果与真实label形成监督训练,计算误差,反向传播更新各个模块的参数,最终就得到了模型。

3. 兴趣抽取层( Interest Extractor Layer )

        在开篇的背景说了,我们需要引入一个时间序列模型来更好的做推荐,于是我们首先想到的是RNN,但是RNN由梯度消失问题,于是想到LSTM,但是模型计算太复杂,于是最后改用RNN的变种GRU来做了。他的参数更少,收敛速度更快,所以更加适用于电商系统:

        GRU从单个时间单元来看它每一个门的表达式是如下:

在这里插入图片描述

        z_t 叫更新门:更新门定义了前面记忆保存到当前时间步的量

        r_t 叫重置门:重置门决定了如何将新的输入信息与前面的记忆相结合

        这两个门决定了哪些信息最终能作为当前时刻循环单元的输出。这两个门控机制的特殊之处在于,它们能够保存长期序列中的信息,且不会随时间而清除或因为与预测不相关而移除。

        \tilde{h_t} 是 当前记忆内容,输入x_t 与上一时间步信息 h_{t-1} 先经过一个线性变换,即分别右乘矩阵 W 和 U。计算重置门 r_t与 Uh_{t-1} 的 Hadamard 乘积(矩阵A,B的Hadamard乘积定义为二者对应位置的乘积)。因为前面计算的重置门是一个由 0 到 1 组成的向量,它会衡量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息完全被遗忘掉,该 Hadamard 乘积将确定所要保留与遗忘的以前信息。       

        h_t 是当前时间步的最终记忆 z_t 为更新门的激活结果,它同样以门控的形式控制了信息的流入。z_t与 h_{t-1} 的 Hadamard 乘积表示前一时间步保留到最终记忆的信息,该信息加上当前记忆内容 \tilde{h_t} 就等于最终门控循环单元输出的内容。

        我们也称h_t 为当前时刻的隐状态

        (还好之前有点RNN和LSTM的基础,不然又要花额外时间去补了)

        然而,仅仅捕获了行为之间的依赖关系h_t无法有效地表达用户兴趣。由于目标(一个商品/一个商铺)的点击行为是有最终的兴趣出发的。因此单引入了GRU还不够,他只输出了最终的一个隐状态,历史的隐状态没有得到合理的训练/约束/监督。

        用户每一步的兴趣状态都将导致连续的行为,由于用户兴趣经过了一系列变化,这种情况显然用目标商品去更新前面时间步的中间隐藏状态就不合理了呀。因此作者提出辅助损失的概念,利用真实的下一个时间的用户行为Embedding输入来 约束/训练 当前步输入得到的隐状态 h_{t} 的生成。

        这也就是作者提出的Auxiliary loss(辅助损失函数):

         总结一下:原本GRU是只在最后一个时间步进行输出,然后与真实label做Loss计算, 而改进后的GRU是每个时间步都会有一个输出,都会与一个label进行一个交叉熵计算, 所以这里就会多出了时间步t维度上的加和损失。其次:还有点不同就是label,当前时间步用的label是下一个时间步的输入值。
        通过引入了辅助损失函数,每一个隐状态h_t的输出都有足够的能力去解释用户当前行为的Embedding向量的输入,因为每一步都计算了loss,也就是让当前时刻输出的隐藏状态 h_t 尽量的与下一个时刻用户点击的行为embedding相似,与下一个时刻里面用户没有点击过的行为embedding越远。 这样构成我们会构成T个兴趣状态,从而构成兴趣序列,作为 兴趣进化层 的输入。

        其次,引入了辅助函数,有助于缓解GRU的长距离依赖问题,降低反向传播的难度,这一点在RNN的文章上提到过。

4. 兴趣进化层(Interest Evolving Layer)


        上面我们是得到了用户的兴趣走向,也就是更加精准地得到了用户下一步会喜欢啥,下一步就是要回归到更具体业务上了,就是要将这个兴趣走向和广告给联系起来,也就是上一篇提到的DIN里面的Attention机制了。

        兴趣进化过程 直接决定了候选商品的点击率预测,计算公式如下:

\alpha_t = \frac{exp(h_tWe__a)}{\sum^T_{j=1}exp(h_jWe_a)}

        e_a 是候选广告的对应的Embedding向量,维度是n_a*1

        h_t 是兴趣抽取层中每一个时间t对应输出的隐向量了

        W是参数矩阵,具体的维度就是n_H * n_a

        现在在训练阶段,所以们是知道用户的下一步操作的,也就是知道整个用户兴趣,例如有T个\left [ h_1,h_2,...,h_T \right ]

截止到现在,我们知道总共有三种attention value的计算方法:

从权值分布\alpha 的计算角度

内积: 两个向量直接内积, 因为内积可以衡量两个向量的相似程度嘛\alpha = V^TU
全连接: 过一层全连接神经网络之后再做内积。 增加非线性\alpha = V^Ttanh(W^TU+b)
双线性:\alpha = V^TWU = V^T(l^Th)U=(lv)^T(hU) 双线性的理解

attention的q,k,v的角度 —> 自注意力, 这个就是大名鼎鼎的transformer所有的注意力机制了

我觉得这里后面也会出一篇总结。总结一下,向量之间的距离是怎么整的

        于是我们得到了每一个时刻对应的attention分数了,下一步就是结合attention分数和GRU对兴趣进化进行建模了。一共说了三种,但是最后只用了一种

4.1 GRU with attentional input (AIGRU)

        也就是带注意力输入的 GRU,AIGRU使用attention source 来影响兴趣进化层的输入:

i_t = h_t * a_t

        也就是把当前时间t的隐状态序列乘上注意力分数,然后 i_t 作为下一层GRU的输入

        从直观上看,这个操作很合理。通过注意力分数高低就可以看到当前时间步的输入与候选广告的相关程度。

        但是再看公式 \tilde{h_t} (计算当前记忆内容),会发现,这个记忆内容还是会被输出,而且会影响到后面的 隐向量的输出,这就出现了当前用户对这个广告没有任何关联,但是整体的结果还是会被的影响到的结局。所以非常不合理。于是引出了别的方式

4.2 Attention based GRU(AGRU)

        把这个 a_t 嵌入到GRU里面去直接影响隐藏状态的更新,从而直接影响到兴趣的进化过程。

h_t = (1-a_t) * h_{t-1} +a_t * h_t

        比如某个时间步t的兴趣h_t 与当前候选广告一点关系都没有, 即a_t 为0, 这时候代入公式会发现AGRU的隐藏状态更新直接用前一个时刻的。同理,如果前一个时刻的 h_{t-1} 也和当前候选广告无关,那么就继续用前一个时刻的, 这也就是说, 如果前面某个时间步的隐藏状态与当前候选广告相关了,极端情况是非常相关, 那么这时候更新AGRU的隐藏状态为当前这个非常相关的兴趣, 通过上面这种机制,AGRU能够保证只关注和当前候选广告相关的兴趣演化过程。 

        但是也有缺点,就是隐向量对应的每个维度应该与不同的权重,我们用一个 a_t 去直接乘一个向量,就代表隐向量所有维度的权值是一样。这也是不符合实际情况的,所以也会进行改进。

4.3 GRU with attentional update gate (AUGRU )

        这里就是原本的AGRU直接让 h_{t-1} 和 h_t 都直接被 a_t 给影响到,现在是通过保留更新门的原始维度信息,从而 能够让与当前候选广告相关的兴趣合理演化而不受非相关兴趣的影响, 又克服了AGRU忽略了兴趣在不同维度上的保持重要性的不足,因为这个并没有改变更新门的向量维度,依然是向量,依然每个维度可以决定兴趣相应维度的重要性。

z_t = a_t * z_t

h_t = (1-z_t) \odot h_{t-1} +z_t \odot h_t

AUGRU的出现,可以更有效地避免兴趣漂移带来的影响,并且有助于模拟相对目标项目的兴趣演化过程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值