CTR之行为序列建模用户兴趣:DIEN

前言

在上一篇文章中 CTR之行为序列建模用户兴趣:DIN,开启了用户行为序列建模用户兴趣的篇章。DIN引入了Attention机制,对于不同的候选item,可以根据用户的历史行为序列,动态地学习用户的兴趣表征向量。但是,DIN没有考虑用户历史行为序列之间的相关性,也没考虑序列的先后顺序,难以捕获用户兴趣的变化。

概要

论文:Deep Interest Evolution Network for Click-Through Rate Prediction

链接:https://arxiv.org/pdf/1809.03672.pdf

在CTR模型中,通过用户的行为数据捕获用户的潜在兴趣是非常重要的。另外,考虑到外在环境和内在认知的变化,用户的兴趣是随着时间在动态演变的

而许多CTR预估模型直接把用户行为(item)的表征当做兴趣,而缺少具体的行为下潜在兴趣的特定建模;少部分研究也会考虑到兴趣的变化趋势。

因此,在这篇论文中,阿里提出了一种新的模型 Deep Interest Evolution Network (DIEN)

  1. 设计了一种兴趣提取网络(interest extractor layer)从历史行为序列来捕获用户的时间性兴趣(temporal interests),并且针对GRU的隐状态(hidden state)在兴趣表征上能力不足的问题,加入了一种辅助loss,它使用连续的行为来激励每一步隐状态的学习,提升隐状态表征潜在的兴趣的能力
  2. 另外,还设计了兴趣演变网络(interest evolving layer)使用引入注意力机制的更新门控网络(AUGRU),增强相关的兴趣对目标item的影响,并克服了推理时的兴趣漂移问题

DIEN的整体网络结构如下图:

DIEN网络结构

对比DIN的优势

用户的行为序列信息是非常有价值的,即能够捕获用户的兴趣演变过程在许多推荐场景下是十分有用的,比如电商推荐场景,用户前段时间在挑选手机,那么这段时间的行为序列会集中在手机这个品类的商品,但在他完成手机的购买之后,近期的兴趣可能就会变成篮球。

而DIN没有考虑序列信息,无法学习到这种时间性的兴趣趋势演变,那么DIN就会变成基于所有历史行为进行综合推荐,而不是像DIEN这种“针对下一次购买动机的推荐”。

基础模型

CTR的深度学习基础模型结构基本都是一致的,包括特征表征(feature representation)、模型结构(model structure)、损失函数(loss function),而模型结构由Embedding和MLP组成。

特征表征

通常的在线推荐系统,主要包括四类特征:用户属性(User Profile)、用户行为(User Behavior)、广告Ad(target item)和上下文(Context),每一类都有多个特征域fields:

  • 用户属性的fields一般有性别、年龄等
  • 用户行为的fields则是用户点击过的goods id列表,当然也可以有其他的field,比如用户点击过的的shop_id、cat_id等
  • 广告的fields一般有ad_id,shop_id等
  • 上下文的fields则有时间等

每一个field的特征值可以编码为one-hot向量,如性别=男编码为[1,0],而性别=女则编码为[0,1]。四类特征对应的不同fields的编码向量拼接起来分别用 x p , x b , x a , x c x_p,x_b,x_a,x_c xp,xb,xa,xc 来表示。

在序列CTR模型中,用户行为的每一种field是多个行为组成的列表,而每一个行为对应一个one-hot向量:

x b = [ b 1 ; b 2 ; b T ] ∈ R K × T , b t ∈ { 0 , 1 } K x_b=[b_1;b_2;b_T] \in \mathbb{R}^{K \times T},b_t \in \{0,1\}^K xb=[b1;b2;bT]RK×Tbt{0,1}K

b t b_t bt是第t个行为的one-hot向量,T是用户历史行为的个数,K则是用户可能点击到的商品的总量。

Embedding&MLP

Embedding.

Embedding是一种很广泛使用的将大规模离散特征转化为低维的稠密特征。在embedding layer中,每一个field会有一个对应的embedding矩阵。例如用户点击过的商品的embedding矩阵可以表示为:

E g o o d s = [ m 1 ; m 2 ; m K ] ∈ R n E × K E_{goods}=[m_1;m_2;m_K] \in \mathbb{R}^{n_E \times K} Egoods=[m1;m2;mK]RnE×K m j ∈ R n E m_j \in \mathbb{R}^{n_E} mjRnE代表一个维度为 n E n_E nE的embedding向量。

再具体一点,对于用户行为特征 b t b_t bt,当 b t [ j t ] = 1 b_t[j_t]=1 bt[jt]=1时,它对应的embedding向量便是 m j t m_{j_t} mjt,因此一个用户的行为的有序的embedding向量列表可以表示为:

e b = [ m j 1 ; m j 2 ; . . . ; m j T ] e_b=[m_{j_1};m_{j_2};...;m_{j_T}] eb=[mj1;mj2;...;mjT]

同理, e a e_a ea代表上述四类中的广告这类特征中所有fields的拼接embedding向量。

Multilayer Perceptron(MLP).

首先,这四类特征的embedding向量会分别进行pooling操作(concat、mean pooling或sum pooling等),然后再拼接起来。最后,拼接后的向量再进入MLP,得到最后的预测值。

损失函数

深度学习CTR模型最常用的损失函数是负negative log-likelihood(负对数似然)函数,使用target item的标签来监督整体的预测:

x = [ x p , x b , x a , x b ] ∈ D , D x=[x_p,x_b,x_a,x_b] \in \mathcal{D},\mathcal{D} x=[xp,xb,xa,xb]DD是数量为N的训练样本集合。 y ∈ { 0 , 1 } y \in \{0,1\} y{0,1}表示用户是否点击了target item。 p ( x ) p(x) p(x)是整个网络的输出,表示用户点击target item的预估概率。

DIEN结构

如下图所示,DIEN由以下几部分组成:

  1. 所有类别特征通过Embedding Layer转换为embedding向量;
  2. DIEN通过两个步骤来捕获兴趣演变:interest extractor layer(兴趣提取层)会通过历史行为序列来提取兴趣序列;interest evolving layer(兴趣演变层)来建模与target item相关的兴趣演变过程;
  3. 最后的兴趣表征(final interest)和广告、用户属性、上下文的embedding向量进行拼接;
  4. 拼接的向量输入到MLP,得到最后的预测值。

DIEN网络结构

DIEN-兴趣提取层

在电商系统中,用户的行为是潜在兴趣的载体,用户的兴趣会在产生一个行为之后发生改变。在这个兴趣提取层中,将会从用户行为序列中提取一系列兴趣状态(interest states)。

兴趣提取层

GRU建模

用户的点击行为包含丰富的信息,即使在短期内,行为序列长度也可能是很长的,比如两周内。综合了效率和效果,论文使用GRU来建模不同行为之间的关系,输入是根据发生时间排序的行为。GRU解决了RNN的梯度消失问题,并且比LSTM更快。GRU的数学表达式如下:

  • σ \sigma σ是sigmoid函数, ∘ \circ 是element-wise product, W u , W r , W h ∈ R n H × n I W^u,W^r,W^h \in \mathbb{R}^{n_H \times n_I} Wu,Wr,WhRnH×nI U z , U r , U h ∈ n H × n H U^z,U^r,U^h \in n_H \times n_H Uz,Ur,UhnH×nH
  • n H n_H nH是隐藏层维度, n I n_I nI是输入的维度, i t i_t it是GRU的输入, i t = e b [ t ] i_t=e_b[t] it=eb[t] 是第t个行为的表征, h t h_t ht是第t个隐状态(hidden states)。

辅助损失

然而,捕获行为之间的关系的隐状态 h t h_t ht并不能高效地表征兴趣。因为target item的点击行为的驱动是final interest,即标签 L t a r g e t L_{target} Ltarget,仅仅是对final interest的预测的监督的ground truth,然而历史状态 h t ( t < T ) h_t(t<T) ht(t<T)并不能得到正确的监督。

众所周知,每一步的兴趣状态会直接引导连续的行为。所以,论文提出一种辅助loss

  • 使用下一个行为 b t + 1 b_{t+1} bt+1来监督兴趣状态当前 h t h_t ht的学习
  • 除了使用真实的下一个行为来作为正样例,还进行负采样,从所有item中采样一个未被点击过的item来作为负样例

因此,存在N对行为序列,其对应的embedding如下:

{ e b i , e ^ b i } ∈ D B , i ∈ 1 , 2 , . . . , N \{e_b^i,\hat{e}_b^i\} \in \mathcal{D}_{\mathcal{B}},i \in 1,2,...,N {ebi,e^bi}DB,i1,2,...,N

  • e b i ∈ R T × n E e_b^i \in \mathbb{R}^{T \times n_E} ebiRT×nE 对应用户点击过的序列,而 e ^ b i ∈ R T × n E \hat{e}_b^i \in \mathbb{R}^{T \times n_E} e^biRT×nE 则对应负采样的序列。
  • n E n_E nE是embedding的维度大小,T是历史行为item的数量。
  • e b i [ t ] ∈ G e_b^i[t] \in \mathcal{G} ebi[t]G 代表用户i点击的第t个item的embedding。

辅助loss

辅助loss的表达式如下:

其中,论文提到 σ ( x 1 , x 2 ) = 1 1 + e x p ( − [ x 1 , x 2 ] ) \sigma(x_1,x_2)=\frac{1}{1+exp(-[x_1,x_2])} σ(x1,x2)=1+exp([x1,x2])1 是一个sigmoid激活函数,但看源码实现其实是一个激活函数为sigmoid的MLP。 h t i h_t^i hti 是用户i的第t个GRU隐状态。

加入辅助loss之后,全局的loss则变成了:

L = L t a r g e t + α ∗ L a u x L=L_{target}+\alpha\ *\ L_{aux} L=Ltarget+α  Laux

α \alpha α是一个平衡兴趣表征和CTR预估的超参数。

辅助loss带来的好处有以下几点:

  1. 在兴趣学习方面,提升GRU的隐状态对兴趣的表征能力
  2. 在GRU学习迭代方面,降低反向传播的难度,当对较长的历史行为序列进行建模时
  3. 为embedding层的学习提供更多的语义信息,能够得到一个更好的embedding矩阵

在辅助loss的作用下,每一个隐状态 h i h_i hi应有能够充分表征兴趣状态,在用户进行了行为 i t i_t it 之后。

T个兴趣状态 [ h 1 , h 2 , . . . , h T ] [h_1,h_2,...,h_T] [h1,h2,...,hT] 拼接之后,组成了用户的兴趣序列,会作为下一个网络层-兴趣演变层的输入,来建模兴趣演变趋势。

DIEN-兴趣演变层

兴趣演变

上述提到,在外在环境和内在认知的联合影响下,用户的不同兴趣类型是一直在变化的。拿服装来说,随着流行趋势和用户品类的变化,用户的服装偏好也在演变。这个兴趣的演变过程直接决定了CTR模型的服装候选集。

建模这个演变过程的好处有以下几点:

  • 兴趣演变模块能够用更多的相关历史信息来补充final interest的表征
  • 它更好地随着兴趣变化趋势来进行target item的预估

在演变过程中,兴趣尤其表现了两个特性:

  • 由于兴趣的多样性,兴趣是会漂移的。比如用户可能在前一段时间比较关注书籍,但在下一段时间却更需要衣服。
  • 即使兴趣会彼此影响,但每个兴趣都有着自己的演变过程。比如书籍和服装的演变过程是几乎完全独立,我们只需要关注与target item相关的演变

注意力机制的GRU

兴趣演变模块

通过分析兴趣演变的特征,论文结合注意力机制的局部激活能力和GRU的序列化学习能力,来建模这个兴趣演变。GRU的每一步局部激活可以加强相关兴趣的相互作用,弱化兴趣漂移的困扰,这对建模与target item相关的演变过程是非常有帮助的。

与原始GRU的表达式一样,使用 i t ′ , h t ′ i'_t,h'_t it,ht 表示兴趣演变模块的输入和隐状态,第二个GRU的输入则对应兴趣提取层的兴趣状态: i t ′ = h t i'_t=h_t it=ht,最后一个隐状态 h T ′ h'_T hT 代表final interest state,具体的注意力函数如下式:

e a e_a ea 是上述四类特征中的广告Ad(target item)的不同fields的embedding向量拼接。

W ∈ R n H × n A W \in \mathbb{R}^{n_H \times n_A} WRnH×nA n H n_H nH 是隐状态的维度, n A n_A nA 是广告embedding向量的维度。

注意力得分会影响广告 e a e_a ea 和输入 h t h_t ht 的相关关系,更高的得分则代表着更强的相关性。

下面是论文提出的GRU结合注意力机制的几种方式:

GRU with attentional input (AIGRU).

为了激活相关的兴趣,AIGRU是一种最直接的方法,使用注意力得分来影响输入兴趣状态,如下式:

i t ′ = h t ∗ α t i'_t=h_t\ *\ \alpha_t it=ht  αt

h t h_t ht是兴趣提取层的第t个隐状态,而 i t ′ i'_t it 是第二个GRU的的输入,即上图[兴趣演变模块]中的AUGRU的输入, ∗ * 表示是向量点积。

对于AIGRU,不怎么相关的兴趣会降低注意力得分。理论上,得分可以降低直为0。然而AIGRU并不能很好起效,因为即使接近0的输入也可以改变GRU的隐状态,所以不怎么相关的兴趣会影响到兴趣演变的学习。

Attention based GRU(AGRU).

AGRU在QA问答领域中第一次被提出,通过来自注意力机制的embedding信息优化了GRU的结构之后,AGRU可以在复杂的查询中有效提取关键信息

基于此,论文也使用AGRU这种有效机制,在兴趣演变过程中来捕获相关的兴趣。具体的,AGRU使用注意力得分来替代GRU中的更新门控,直接地改变隐状态

h t ′ , h t − 1 ′ , h ~ t ′ h'_t,h'_{t-1}, \tilde{h}'_t ht,ht1,h~t 都是隐状态。

**AGRU利用注意力得分来直接控制隐状态的更新,减弱在演变过程中不相关的兴趣。**进入的注意力embedding提升了注意力机制的影响,并且克服了AIGRU的缺点。

GRU with attentional update gate (AUGRU).

AGRU使用一个标量形式的注意力得分 α t \alpha_t αt 来代替向量形式的更新门控 u t u_t ut,但这忽略了不同维度是有着不同重要性的。因此提出了注意力的更新门控(AUGRU):

u t ′ u'_t ut 是原来的更新门控, u ~ t ′ \tilde{u}'_t u~t 是注意力的更新门控, h t ′ , h t − 1 ′ , h ~ t ′ h'_t,h'_{t-1}, \tilde{h}'_t ht,ht1,h~t 都是隐状态。

AUGRU保留原来更新门控的维度信息,这可以来学习每个维度的重要性。在此基础上,使用注意力得分来缩放更新门控的所有维度,这可以减少不相关的兴趣对隐状态的影响。AUGRU有效避免了兴趣漂移的困扰,并且让相关的兴趣更顺滑地演变。

实验结果

公开数据集

真实的工业数据集

总结

  1. DIEN相比DIN,引入用户历史行为序列的时间性信息,使用GRU来建模兴趣状态,并且引入辅助loss来提升对兴趣的表征能力;
  2. 接着第二个GRU再利用上一步的兴趣状态序列来建模用户兴趣演变过程,得到最终的兴趣状态,并且加入注意力机制,来减弱不相关的兴趣的影响,避免了兴趣漂移的问题;
  3. 其实整个DIEN结构还是比较好理解的,但是一些对行为序列和用户兴趣的分析还是值得仔细阅读的。

代码实现

git

推荐系统CTR建模系列文章:

CTR之行为序列建模用户兴趣:DIN

CTR特征重要性建模:FiBiNet&FiBiNet++模型

CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

CTR预估之Wide&Deep系列模型:DeepFM/DCN

CTR预估之Wide&Deep系列(下):NFM/xDeepFM

CTR特征建模:ContextNet & MaskNet(Twitter在用的排序模型)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis-Plus实现Service封装

文章目录 5.1 MP封装Service介绍5.1.1 说明5.1.2 实现流程5.1.3 核心API介绍 5.2 MP封装Service快速入门5.2.1 定义服务扩展接口5.2.2 定义服务实现5.2.3 测试测试 5.3 MP封装Service实现CRUD操作 5.1 MP封装Service介绍 5.1.1 说明 MybatisPlus为了开发更加快捷&#xff0c;…

前端去除网页水印

按F12&#xff0c;打开开发者工具面板&#xff0c;然后直接在样式搜索backgroud 然后直接取消backgroud 的复选框即可。

【Linux】-Linux下的软件商店yum工具介绍(linux和windows互传文件仅仅一个拖拽搞定!!!!)

目录 1.Linux 软件包管理器yum 1.1快速认识yum 1.2 yumz下载方式&#xff08;如何使用yum进行下载&#xff0c;注意下载一定要是root用户或者白名单用户&#xff08;可提权&#xff09;&#xff09; 1.2.1下载小工具rzsz 1.2.2 rzsz使用 1.2.2查看软件包 1.3软件的卸载 2.yum生…

UE5 局域网联机,寻找会话失败。

目录 参考资料&#xff1a; 尝试解决办法 1.1在【项目名.Build.cs】脚本中添加该行&#xff0c;添加后关闭编辑器&#xff0c;重新生成解决方案。​编辑 2.检查是否在同一个C类子网 参考资料&#xff1a; 1.Cant find session in LAN - Programming & Scripting / Mul…

【C语言】字符串函数上

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是字符串函数上篇&#xff0c;主要是关于长度不受限制的字符串函数&#xff08;strlen,strcpy,strcat,strcm…

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)

目 录 一、测试目的&#xff1a; 二、测试方案&#xff1a; 2.1、测试思路 2.2、拓扑图 三、测试环境 3.1 服务器配置 3.2 网络摄像机列表 3.3 测试软件 四、测试流程 4.1 H.264并发测试&#xff1a; 4.1.1老版本srsout3.10并发测试 4.1.2 新版本srsout…

【PyTorch][chapter 22][李宏毅深度学习]【无监督学习][ WGAN]【理论二】

前言&#xff1a; 本篇主要参考《Wasserstein GAN and the Kantorovich-Rubinstein Duality》 重点介绍一下 WGAN 的损失函数 是如何通过 Wasserstein Distance 变换过来的。 分为5步&#xff1a; 我们首先建立Wasserstein Distance 极小值形式&#xff0c; 经过对…

王道机试C++第6章 数学问题和22年蓝桥杯省赛选择题Day34

6.1 进制转换 二进制数&#xff08;十转二&#xff09; 习题描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是…

详解Python中open()函数指定文件打开方式的用法

当我们用open()函数去打开文件的时候&#xff0c;有好几种打开的模式。 r->只读 w->只写&#xff0c;文件已存在则清空&#xff0c;不存在则创建。 a->追加&#xff0c;写到文件末尾 b->二进制模式,比如打开图像、音频、word文件。 ->更新(可读可写) 这个带号…

Spring MVC中的REST风格

文章目录 REST风格1 REST简介问题导入1.1 REST介绍1.2 RESTful介绍1.3 注意事项 2 RESTful入门案例问题导入2.1 快速入门2.2 PathVariable介绍2.3 RequestBody、RequestParam、PathVariable区别和应用 3 REST快速开发【重点】3.1 代码中的问题3.2 Rest快速开发 4案例&#xff1…

【node】模块化与包(二)

1、模块化的基本概念 模块化是指解决一个复杂的问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 &#xff08;1&#xff09;模块化的优点 遵循固定规则&#xff0c;把大文件拆分成对立并相互依赖…

springboot3 打包报错32-bit architecture x86 unsupported或者 returned non-zero result

springboot3 打包异常情况处理记录 在测试springboot3 native打包时候遇到的异常&#xff0c;百度和谷歌上方法都无法解决我的问题&#xff0c;最后记录一下我最后的原因和解决方案。 前置要求&#xff1a;自己处理好vs的相关内容后 报错一&#xff1a; [1/7] Initializing…

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

跨境电子商务支付与结算的支撑系统

​1、跨境电子商务支付与结算的核心系统。 核心系统是用户执行跨境电子商务支付的核心模块&#xff0c;包括以下具体流程。 ​ ​①用户从跨境电子商务支付应用启动跨境电子商务支付流程。 ②跨境电子商务支付应用根据应用和用户选择的支付工具&#xff0c;来调用对应的支付产…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

SkyEye:助力飞行器状态控制系统仿真

飞行器与常见的航天器一样&#xff0c;属于安全关键领域的大型复杂设备&#xff0c;对安全性、可靠性有着极高的要求。为保证稳定飞行&#xff0c;需要对目标对象进行实时跟踪&#xff0c;通过发出正确的修正偏差指令来操纵飞行器改变飞行姿态&#xff0c;因此对飞行器状态控制…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

ISIS单区域实验简述

ISIS 中间系统到中间系统&#xff0c;也是链路状态协议&#xff0c;工作在数据链路层&#xff0c;不依赖IP地址&#xff1b;与OSPF一样采用最短路径SPF算法&#xff0c;收敛速度快。 实验基础配置&#xff1a; r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…