推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)

推荐系统系列博客:

  1. 推荐系统(一)推荐系统整体概览
  2. 推荐系统(二)GBDT+LR模型
  3. 推荐系统(三)Factorization Machines(FM)
  4. 推荐系统(四)Field-aware Factorization Machines(FFM)
  5. 推荐系统(五)wide&deep
  6. 推荐系统(六)Deep & Cross Network(DCN)
  7. 推荐系统(七)xDeepFM模型
  8. 推荐系统(八)FNN模型(FM+MLP=FNN)
  9. 推荐系统(九)PNN模型(Product-based Neural Networks)
  10. 推荐系统(十)DeepFM模型
  11. 推荐系统(十一)阿里深度兴趣网络(一):DIN模型(Deep Interest Network)

阿里关于深度兴趣网络的探索共有3篇论文发表,按照发表年份的先后分别是:DIN、DIEN和DSIN。上一篇博客介绍了开篇之作DIN,本篇博客来介绍DIEN。DIEN相比较DIN多了个E(Evolution),即兴趣的进化转移。
本篇博客将会从以下几个方面介绍DIEN:

  1. 动机
  2. 整体网络结构
  3. Interest Extractor层及辅助loss
  4. Interest Evolving层
  5. GRU的改进AUGRU
  6. 在线工程

一、动机

论文中描述的动机认为:目前的CTR预估模型都直接把用户行为当做用户兴趣,简单的做个embedding后就进入到MLP中,并没有挖掘潜藏在这些行为之后用户的兴趣。原文如下:

most interest models including DIN regard the behavior as the interest directly, while latent interest is hard to be fully reflected by explicit behavior. Previous methods neglect to dig the true user interest behind behavior. Moreover, user interest keeps evolving, capturing the dynamic of inter- est is important for interest representation.

以下一段话,纯属个人瞎猜,各位看官姑且看看就好:
个人在这里盲猜最本质的动机还是总觉得用户行为是个序列,提到序列嘛,第一想法肯定是RNN啊,但是吧,用户行为序列还和文本序列不太一样,文本序列有明确的语法制约,比如【我是好人】就是一句有明确含义的话,打乱下顺序【人我是好】就明显不具有含义了。但是用户行为序列,比如点击行为序列【牛仔裤–>哈伦裤–>阔腿裤】和【哈伦裤–>牛仔裤–>阔腿裤】顺序改变下,其实是没什么影响的,也就是说用户行为序列对于『顺序』实际上不是很敏感的,这里再去硬套RNN似乎有些牵强附会。但是吧,你得装啊(王蒙语录,哈哈哈哈),所以,DIEN说我是对用户行为背后兴趣进化过程建模,那么RNN总该可以用了吧(当然也不是普通的RNN,而是阿里改良后的),毕竟兴趣进化过程(注意是进化过程)这种东西你可以说和时序无关,也可以说和时序有关。

言归正传,阿里在KDD版本DIN的论文中也提到了一段话,与我上面的想法不谋而合,DIN论文原话:

We have tried LSTM to model user historical behavior data in the sequential manner. But it shows no improvement. Different from text which is under the constraint of grammar in NLP task, the sequence of user historical behaviors may contain multiple concurrent interests. Rapid jumping and sudden ending over these interests causes the sequence data of user behaviors to seem to be noisy. A possible direction is to design special structures to model such data in a sequence way. We leave it for future research.

从这里可以看出,实际上阿里早在DIN版本中就尝试过了用RNN来对用户行为序列建模,但并没有什么效果,原因也正如我上面所说的。阿里在这里说了一句『 A possible direction is to design special structures to model such data in a sequence way』这也为DIEN的诞生埋下了伏笔,也就是DIEN中AUGRU的设计,所以还是不得不佩服阿里妈妈盖坤团队不停思考不停实践的精神,点赞。

下面,我们就来一一拆解这篇论文。

二、整体网络结构

图1. DINE整体网络结构

从图1中能够看出,DIEN的整体结构过程为:1)特征(User Profile feature, User Behavior feature, Ad feature and Context feature四大类),2)经过Embedding层得到低维稠密的embedding向量,3)然后进入到Interest Extractor层,这里就是个普通的GRU,为了更好的训练,引入了辅助Loss。4)然后进入到Interest Evolving层,5)最终与ad feature,Context feature和User Profile feature的向量做concat,进入到多层全连接层(MLP),然后BP训练。

因为引入了辅助loss,因此整个DIEN模型的loss为:
L=Ltarget+α∗Laux(1)L = L_{target} + \alpha * L_{aux} \tag{1} L=Ltarget+αLaux(1)
其中LtargetL_{target}Ltarget为全连接层后的交叉熵loss,公式为:
Ltarget=−1N∑(x,y)∈D(ylog⁡p(x)+(1−y)log⁡(1−p(x)))(2)L_{target} = -\frac{1}{N}\sum_{(x,y)\in D}(y\log p(x) + (1-y)\log (1-p(x))) \tag{2} Ltarget=N1(x,y)D(ylogp(x)+(1y)log(1p(x)))(2)
LauxL_{aux}Laux为辅助loss,为了更好的训练Interest Extractor层,其公式为:
Laux=−1N∑i=1N∑t(log⁡σ(hti,ebi[t+1])+log⁡(1−σ(hti,e^bi[t+1])))(3)L_{aux} = -\frac{1}{N}\sum_{i=1}^N\sum_{t}(\log \sigma(h_t^i, e^i_b[t+1]) + \log (1-\sigma(h_t^i, \hat{e}^i_b[t+1]))) \tag{3} Laux=N1i=1Nt(logσ(hti,ebi[t+1])+log(1σ(hti,e^bi[t+1])))(3)
关于这个公式会在第四部分进行详细解释,这里大家就知道有这个公式的存在就可以了。

三、Interest Extractor层及辅助loss

interest extractor是为了从用户行为序列中抽取用户兴趣。首先,阿里这里使用了用户过去两周即14天的点击商品与商品类目序列(按照目前淘宝的体量,个人估计这个序列应该会在100以上)。前面也说过到,既然是序列,肯定是RNN,从效果与效率的角度考虑首选肯定是GRU,这里再来温习下GRU吧,毕竟如果不是一直搞NLP的同学,可能只会GRU有个大体的印象了,关于GRU的具体细节,参见我之前的博客:GRU,在这里,我只列出公式(为了与本博客贴合,符合表达与DIEN里一致):
ut=σ(Wuit+Uuht−1+bu)rt=σ(Writ+Urht−1+br)ht^=tanh(Whit+rt∘Uhht−1+bb)ht=(1−ut)∘ht−1+ut∘ht^(4)\begin{aligned} u_t &= \sigma(W^ui_t + U^uh_{t-1} + b^u) \\ r_t &= \sigma(W^ri_t + U^rh_{t-1} + b^r) \\ \hat{h_t} &= tanh(W^hi_t + r_t \circ U^h h_{t-1} + b^b) \\ h_t &= (1-u_t) \circ h_{t-1} + u_t \circ \hat{h_t} \end{aligned} \tag{4} utrtht^ht=σ(Wuit+Uuht1+bu)=σ(Writ+Urht1+br)=tanh(Whit+rtUhht1+bb)=(1ut)ht1+utht^(4)
其中utu_tut为更新门,rtr_trt为重置门,∘\circ为点乘,即对应元素相乘。

如果就这么直接硬套GRU,那么就又回到前面开头说的。直接用GRU显然存在两个问题:

  1. 隐藏状态 hth_tht 仅仅只是抓住了用户行为序列的依赖关系并不能有效的反映出用户兴趣,前面也说了用户行为序列的『顺序』其实没啥用(大家可以实验试一试,除了增加了点复杂度,估计和直接pooling没啥区别)。
  2. 用户点击的广告商品肯定是反应了用户的兴趣,如果仅靠最后全连接层后的loss,只能学到用户最终综合的兴趣(因为最终综合的兴趣导致用户发生了这一次点击行为),而中间状态hth_tht无法得到有效的监督信号指导。

DIEN在这里给出了解决办法,即增加了一个辅助loss,用于指导中间状态hth_tht的学习,直接来看看图:

图2. DINE辅助loss

首先明确下正负样本:

  • 正样本:用户点击商品序列,记作 ebie^i_bebiebi[t]e^i_b[t]ebi[t]表示用户iii点击序列中第ttt个item的embedding向量。为什么选择用户点击商品作为正样本,因为很明显用户点击了一定表达了用户某种兴趣。
  • 负样本:从用户未点击过的商品里采样得到(整个item集合减去用户点击过的item),记作 ebi^\hat{e^i_b}ebi^,表示用户iiittt个item对应的负样本。

从图2中能够很清晰看出是正负样本分别与中间状态hth_tht做了内积,因此辅助loss为:
Laux=−1N(∑i=1N∑tlog⁡σ(hti,ebi[t+1])+log⁡(1−σ(hti,e^bi[t+1])))(5)L_{aux} = -\frac{1}{N}(\sum_{i=1}^N\sum_t\log\sigma(h_t^i, e^i_b[t+1]) + \log(1-\sigma(h_t^i, \hat{e}^i_b[t+1]))) \tag{5} Laux=N1(i=1Ntlogσ(hti,ebi[t+1])+log(1σ(hti,e^bi[t+1])))(5)
其中(hti,ebi[t+1])(h_t^i, e^i_b[t+1])(hti,ebi[t+1])表示做内积,σ\sigmaσ为sigmoid函数。

从这个loss设计我们能够看出是为了迫使中间隐藏状态hth_tht拟合用户的点击行为,进而更好的捕捉用户兴趣。从公式(5)能够看出,当htih_t^ihtiebi[t+1]e^i_b[t+1]ebi[t+1]越相似,其内积越大,那么σ(hti,ebi[t+1])\sigma(h_t^i, e^i_b[t+1])σ(hti,ebi[t+1])则接近于1,log⁡σ(hti,ebi[t+1])\log\sigma(h_t^i, e^i_b[t+1])logσ(hti,ebi[t+1])则趋向于0;而 log(1−σ(hti,e^bi[t+1]))log(1-\sigma(h_t^i, \hat{e}^i_b[t+1]))log(1σ(hti,e^bi[t+1]))也趋向于0,因此LauxL_{aux}Laux趋向于0。符合我们的min⁡(loss)\min(loss)min(loss)目标。相反,如果htih_t^ihtiebi[t+1]e^i_b[t+1]ebi[t+1]不相似,log⁡σ(hti,ebi[t+1])\log\sigma(h_t^i, e^i_b[t+1])logσ(hti,ebi[t+1])趋向于负无穷,log(1−σ(hti,e^bi[t+1]))log(1-\sigma(h_t^i, \hat{e}^i_b[t+1]))log(1σ(hti,e^bi[t+1]))也趋向于负无穷,此时loss趋向于正无穷。

所以,DIEN最终的损失函数就变成了:
L=Ltarget+α∗Laux(4)L = L_{target} + \alpha * L_{aux} \tag{4} L=Ltarget+αLaux(4)
α\alphaα 为超参数,用于平衡LtargetL_{target}LtargetLauxL_{aux}Laux

四、 Interest Evolving层

用户点击行为是用户各种兴趣的体现,因为用户不可能是单一兴趣的,可能一段时间对书籍感兴趣,一段时间对衣服感兴趣,所以用户兴趣的进化是相互独立的。因为我们最终的目标是预估目标广告的CTR,所以我们只需要重点关注和目标广告相关的兴趣就可以了,那么就又回到了DIN中做的事情,通过引入attention来学习每个兴趣与最终广告之间的权重(相关性)。其示意图如下图所示:

图3. DINE Interest Evolving层

从上图能够看出,经过Interest Extractor层得到的中间隐藏状态hth_tht与目标广告(target ad)之间通过attention计算得到一个权重分数,然后该权重分数与hth_tht一同进入AUGRU。

关于这个attention score怎么计算,论文中给出了计算公式:
at=exp(htWea)∑j=1Texp(hjWea)(5)a_t = \frac{exp(h_tWe_a)}{\sum_{j=1}^Texp(h_jWe_a)} \tag{5} at=j=1Texp(hjWea)exp(htWea)(5)
其中hth_tht即为Interest Extractor层抽取出来的中间隐藏状态,eae_aea为目标广告各个特征的contact,比如广告的[good_id, cate_id],然后使用了个softmax做了权重归一化。

我们在实现的时候,也很简单,基本上和DIN一样,目标广告与用户点击序列做个减法和内积,然后一同concat后输入到一个全连接网络里,代码如下:

       """hist_seq_concat: 用户点击序列target_seq_concat: 目标广告id与目标广告cate的向量拼接"""concat = paddle.concat([hist_seq_concat, target_seq_concat,# element-wise subpaddle.subtract(hist_seq_concat, target_seq_concat),# inner productpaddle.multiply(hist_seq_concat, target_seq_concat)],axis=2)# 全连接网络for attlayer in self.attention_layer:concat = attlayer(concat)# 因为要根据batch内用户最大点击序列补齐,mask矩阵,用于hist_item_se和hist_cat_seq# 中补0的部分失效,对于补齐的网格部分,初始化为-INF,从而在sigmoid后,使之失效为0;# 目前做法是有数  据的为0,补齐的用-INFatten_fc3 = paddle.add(concat, mask)# [32, 1, 2]  32-->batchsize, 2-> user click sequence numatten_fc3 = paddle.transpose(atten_fc3, perm=[0, 2, 1])# 做一个放缩# [32, 1, 2]atten_fc3 = paddle.scale(atten_fc3, scale=(self.item_emb_size + self.cat_emb_size)**-0.5)# 权重归一化# Tensor(shape=[32, 1, 2])weight = paddle.nn.functional.softmax(atten_fc3)

五、GRU的改进AUGRU

我们有attention score后,如何这个分数加到GRU中呢?DIEN论文中比较了三种改进版的GRU,分别为:

  • AIGRU(GRU with attentional input)
  • AGRU(Attention based GRU)
  • AUGRU(GRU with attentional update gate)

5.1 AIGRU(GRU with attentional input)

AIGRU比较直白,直接把attention分数与输入hth_tht相乘,即:
it′=αt∗ht(6)i^{'}_t = \alpha_t * h_t \tag{6} it=αtht(6)
关于AIGRU的缺点:

In AIGRU, the scale of less related interest can be reduced by the attention score. Ideally, the input value of less re- lated interest can be reduced to zero. However, AIGRU works not very well. Because even zero input can also change the hidden state of GRU, so the less relative inter- ests also affect the learning of interest evolving.

5.2 AGRU(Attention based GRU)

AGRU是被NLP中QA领域中提出的,其直接用attention分数来替换了更新们(update gate),即:
ht′=(1−αt)∗ht−1′+αt∗h^t′(7)h^{'}_t = (1-\alpha_t)*h^{'}_{t-1} + \alpha_t*\hat{h}_t^{'} \tag{7} ht=(1αt)ht1+αth^t(7)
AGRU的优缺点如下:

AGRU weakens the effect from less related interest during interest evolving. The embedding of attention into GRU improves the influence of attention mechanism, and helps AGRU overcome the defects of AIGRU.

5.3 AUGRU(GRU with attentional update gate)

因为AGRU用了一个标量(attention分数)替代了update gate,而update gate是个向量,所以存在一定的信息损失。因此,最好的方式就是即保留update gate,又能把attention分数用上,DIEN提出了AUGRU,其公式如下:
u^t′=αt∗ut′ht′=(1−u^t)∘ht−1′+u^t′∘h^t′(8)\hat{u}_t^{'} = \alpha_t * u^{'}_t \\ h^{'}_t = (1-\hat{u}_t) \circ h^{'}_{t-1} + \hat{u}_t^{'} \circ \hat{h}^{'}_t \tag{8} u^t=αtutht=(1u^t)ht1+u^th^t(8)
关于AUGRU的实现也非常简单,大家实现的是只需要继承下基本的GRU,然后稍作修改即可,我这里用paddle写了下AUGRU:

import paddle
import paddle.nn as nn
import paddle.nn.functional as F
from paddle.nn import initializer as I
import mathclass AUGRUCell(nn.GRUCell):def __init__(self,input_size,hidden_size,attention_score,weight_ih_attr=None,weight_hh_attr=None,bias_ih_attr=None,bias_hh_attr=None,name=None):super(AUGRUCell, self).__init__()if hidden_size <= 0:raise ValueError("hidden_size of {} must be greater than 0, but now equals to {}".format(self.__class__.__name__, hidden_size))std = 1.0 / math.sqrt(hidden_size)self.weight_ih = self.create_parameter((3 * hidden_size, input_size),weight_ih_attr,default_initializer=I.Uniform(-std, std))self.weight_hh = self.create_parameter((3 * hidden_size, hidden_size),weight_hh_attr,default_initializer=I.Uniform(-std, std))self.bias_ih = self.create_parameter((3 * hidden_size, ),bias_ih_attr,is_bias=True,default_initializer=I.Uniform(-std, std))self.bias_hh = self.create_parameter((3 * hidden_size, ),bias_hh_attr,is_bias=True,default_initializer=I.Uniform(-std, std))self.hidden_size = hidden_sizeself.input_size = input_sizeself._gate_activation = F.sigmoidself._activation = paddle.tanhself.attention_score = attention_scoredef forward(self, inputs, states=None):if states is None:states = self.get_initial_states(inputs, self.state_shape)pre_hidden = statesx_gates = paddle.matmul(inputs, self.weight_ih, transpose_y=True)if self.bias_ih is not None:x_gates = x_gates + self.bias_ihh_gates = paddle.matmul(pre_hidden, self.weight_hh, transpose_y=True)if self.bias_hh is not None:h_gates = h_gates + self.bias_hhx_r, x_z, x_c = paddle.split(x_gates, num_or_sections=3, axis=1)h_r, h_z, h_c = paddle.split(h_gates, num_or_sections=3, axis=1)# reset gater = self._gate_activation(x_r + h_r)# update gatez = self._gate_activation(x_z + h_z) * self.attention_scorec = self._activation(x_c + r * h_c)  # apply reset gate after mmh = (pre_hidden - c) * z + creturn h, h@propertydef state_dtype(self):pass

六、在线工程

纵观整个DIEN模型,其复杂度相比较DIN上升了太多太多,所以线上做infer的时候,势必会增加系统的平响,阿里这里做了非常多的优化,才使得DIEN在线上的平响达到可用状态。所以,如果你的工程团队能力不够强,谨慎使用DIEN。

又到了那句经典的话:决定广告/推荐系统收益的往往是团队的工程能力。

参考文献

  1. Zhou, Guorui, et al. “Deep interest evolution network for click-through rate prediction.” Proceedings of the AAAI conference on artificial intelligence. Vol. 33. No. 01. 2019.

推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)相关推荐

  1. 阿里的CTR预测(二):Deep Interest Evolution Network

    这篇文章发布于2018年9月,是之前的DIN的改进版.我们在阿里的CTR预测(一):Deep Interest Network中提到过,他们尝试使用LSTM来学习序列化数据的特征,但是对DIN的结果没 ...

  2. CTR深度学习模型之 DIEN(Deep Interest Evolution Network) 的理解与示例

    本文介绍阿里提出的兴趣进化网络(Deep Interest Evolution Network,以下简称DIEN. 前一篇文章介绍的 DIN 模型如下图所示: DIN 直接把用户的某个行为作为用户的兴 ...

  3. [论文阅读]阿里DIN深度兴趣网络之总体解读

    [论文阅读]阿里DIN深度兴趣网络之总体解读 文章目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词 ...

  4. 阿里DIN模型(深度兴趣网络)详解及理解

    这里写目录标题 目标: 模型产生原因: 核心思想: 模型介绍: Base model 改进模型 模型算法设计 论文的算法改进 参考资料 目标: 掌握2017年阿里提出的深度兴趣网络(Deep Inte ...

  5. 机器学习笔记之深度信念网络(二)模型构建思想(RBM叠加结构)

    机器学习笔记之深度信念网络--模型构建思想 引言 回顾:深度信念网络的结构表示 解析RBM隐变量的先验概率 通过模型学习隐变量的先验概率 小插曲:杰森不等式(2023/1/11) 杰森不等式的数学证明 ...

  6. 【王喆-推荐系统】模型篇-(task8)深度兴趣网络 DIN

    学习总结 DIN基于注意力机制,利用激活单元计算出用户对于不同历史商品的注意力权重,针对当前广告商品,作出更有针对性的预测.该激活单元将历史行为商品的 Embedding和候选广告商品的 Embedd ...

  7. 深度学习 - 46.DIN 深度兴趣网络

    目录 一.引言 二.摘要 ABSTRACT 三.介绍 INTRODUCTION 1.CTR 在广告系统的作用 2.传统 MLP 存在的问题 3.DIN 的改进 四.近期工作 RELATEDWORK 1 ...

  8. 100分钟吃掉DIN深度兴趣网络

    阿里巴巴在CTR预估领域有3篇比较有名的文章. 2017年的深度兴趣网络, DIN(DeepInterestNetwork). 2018年的深度兴趣演化网络, DIEN(DeepInterestEvo ...

  9. 【序列建模】DIN深度兴趣网络

    [序列建模]DIN深度兴趣网络 通过用户的历史行为序列刻画用户兴趣的广泛性,是推荐系统比较大的一个难点,用户历史行为序列建模的研究经历了从Pooling.RNN到attention.capsule再到 ...

最新文章

  1. 各小组对于自己产品的预期“软件下载/用户人数”
  2. 为什么说Python是伟大的入门语言
  3. 07/11/13 资料整理
  4. cannot connect to vCenter Single Sign-on server...
  5. 优化 bulk insert
  6. python基础知识面试题-python的一些基本概念知识和面试题
  7. Redis安装部署配置说明
  8. 网络语言不c,哪些网络用语不文明?
  9. 亲,如果你笑了,记住给我留言!
  10. html背景动起来,CSS+HTML 循环滚动背景效果
  11. Git与SVN版本控制系统
  12. crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫
  13. String对象不可改变的特性
  14. [计算机网络]RJ45直通线和交叉线的连接方式和设备类型解析
  15. 1144 消失的正数
  16. open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存
  17. 医学图像中解剖学坐标系(病人坐标系)和图像坐标系
  18. 2016文件储存服务器,测试Windows Server 2016存储池教程
  19. 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)
  20. 【论文阅读】Automatic Detection of Various Malicious Traffic Using Side Channel Features on TCP Packets

热门文章

  1. OpenCV学完基础知识不知道做什么?!我不相信这是真的
  2. 揭秘中国十大暴利行业(组图)
  3. 使用gitbash创建一个翻译词典
  4. 忙忙碌碌,究竟为了什么
  5. MATLAB图形变换——绘制三角形
  6. 搭建一个大数据分析处理平台,主要划分为哪几步?
  7. 混合IT的新世界 存储工程师的江湖地位不保?
  8. ORB-SLAM3 单目惯导ros-system-track
  9. (4.2.29) Android开发学习之基于ZBar实现微信扫一扫
  10. javascript中Doom操作方法总结