Non-invasive Self-attention for Side Information Fusion in Sequential Recommendation(AAAI2021)

一本有仙气的笔记

1. 前言

序列推荐系统的目标是从用户的历史行为中对用户的兴趣进行建模,从而进行时间相关的个性化推荐。

早期的模型,比如CNN和RNN等深度学习方法在推荐任务中都取得了显著的提升。近年来,BERT框架由于其在处理序列数据时的self-attention机制,已经成为了一种最好的方法。然而,原BERT框架的一个局限性是它只考虑自然语言符号的一个输入源。

  • 在BERT框架下如何利用各种类型的信息仍然是一个悬而未决的问题。

尽管如此,利用其他方面的信息,如商品的类别或tag标签,进行更全面的描述和更好的推荐,在直觉上还是很有吸引力的。在我们的初步实验中,我们发现一些简单的方法,直接将不同类型的附加信息融合到商品embedding中,通常只带来很少甚至负面的影响。

因此,本文在BERT框架下提出了一种有效利用边信息的无创自我注意机制(NOVA,NOninVasive self-Attention mechanism)。NOVA利用side信息来产生更好的注意力分布,而不是直接改变商品嵌入,这可能会导致信息泛滥。

我们在公共数据集和商业数据集上都验证了NOVA-BERT模型,并且我们的方法在计算开销可以忽略的情况下可以稳定地优于最新的模型。

序列化推荐的目标之一基于用户的历史行为,预测用户下一个感兴趣的商品。和用户级别或者基于相似度的静态方法相比,序列化推荐系统还会对用户变化的兴趣进行建模,因此对于现实的应用会更为受欢迎。

在大量的实验中,我们发现基于transformer的模型被认为是处理序列化数据最好的选择。而其中,最为出名的就是Bert模型,通过利用bert模型,Bert4Rec取得了当时的SOTA效果。尽管Bert框架在许多任务上都取得了SOTA的效果,但是还存在一个较大的问题。

  • 对于利用不同类型的side信息,还没有进行过系统的研究;

除了Item的ID信息,我们还存在非常多的side信息,例如评分和商品描述。然而,BERT框架最初设计为只接受一种类型的输入(即wordid),限制了side信息的使用。通过试点实验,我们发现现有的方法通常利用side信息(图1),但很少有效果。

但是理论上来说,side信息通过提供更多的数据是可以带来帮助的,但是,如何使用好这些额外的信息来设计模型是非常有挑战的。

在本文中,我们研究如何使用大量的side信息,并提出了NOVA(Non-inVasive self-Attention mechanism),通过使用side信息来提升模型的预测准确率并且取得了非常好的效果。

在NOVA中,side信息作为self-attention模块的辅助信息来学习更好的注意分布,而不是融合到Item表示中,这可能会导致信息压倒性等副作用。我们在实验室数据集和从真实应用商店收集的私有数据集上验证了NOVA-BERT设计效果。结果证明了该方法的优越性。本文的核心贡献有三点:

  1. 提出了NOVA-BERT框架,该框架可以有效地利用各种side信息进行序列化的推荐任务;
  2. 我们提出了非切入(non-invasive)的self-attention机制(NOVA),这是一种新的设计,可以实现对复合序列数据的self-attention;
  3. 基于可视化给出了模型的可解释性。

2. 相关工作

2.1 不同类型的模型比较

  • 从早期的CNN->RNN->Attention的演化中,我们发现基于BERT类型的模型可以获得最好的效果。

2.2 序列化推荐模型的问题

在之前诸多的问题中,大家都知道side information是非常重要的,但是关于side information如何使用的问题却很少研究,之前的框架都是基于invasive fusion的方式;关于Invasive fusion的方法包括:

  • Summation
  • Concatenation
  • Gated Sum

通过上面的操作,然后将混合的信息输入到NN中,我们称此类方法为Invasive的方法,因为它们改变了原始的表示。

  • 以前的CNN和RNN工作都试图利用side信息,将side信息直接融合到商品embedding中,并进行concatenation和addition等操作。

其它一些工作如GRU等提出了更复杂的特征融合门机制和其它训练技巧,试图使特征选择成为可学习的过程。然而,根据他们的实验结果,简单的方法不能有效地利用各种场景下的丰富信息。尽管Hidasi等人通过为每种类型的side信息部署一个并行子网来提高预测精度,但该模型变得繁琐且不灵活。

还有一些研究,并不直接改变商品的embedding,而是使用RNN模型通过item boosting的trick来加入停留时间,这么做我们希望损失函数能意识到dwell time,用户看一个商品的时间越长,她/他可能对某件商品更加感兴趣,但是该trick却更加依赖于启发式。另一方面,一些与商品相关的辅助信息(如价格)描述了商品的内在特征,这些特征与停留时间不同,不容易被此类方式利用。

3. 方法

3.1 问题描述

给定一个用户的历史交互,顺序推荐任务要求与下一个商品交互,或者执行下一个操作。我们用表示一个用户, 他的历史交互可以被表示为:

S_u = [v_u^{(1)}, v_u^{(2)},...,v_u^{(n)}]

其中商品

v_u^{(j)} 表示第
j 个交互(也可以表示为行为),当有一类行为并且没有side信息,每个交互可以通过商品的id进行表示:
v_u^{(j)} = ID^{(k)}

其中

ID^{(k)} 表示第个商品ID,
\tau = \left\{ ID^{(1)},ID^{(2)},...,ID^{(m)} \right\}

是所有商品的vocabulary, 是字典大小,给定用户的历史,我们的目标是预测用户最有可能交互的下一个商品。

I_{pred} = ID^{(\bar{k})}\bar{k} = argmax_kP(v_u^{(n+1)} = ID^{(k)}|S_u)

3.2 Side信息

Side信息可以是为推荐提供额外有用信息的任何内容,可以分为两种类型:

  • 商品相关信息或行为相关信息。

基于商品的side信息是固有的,它们可以表述商品,除了商品ID等还可以加入(price,商品的日期,生产者等等)。

与行为相关的side信息与用户发起的交互有关,例如操作类型(例如,购买、打分)、执行时间或用户反馈分数。每个交互的顺序(即,原始BERT中的位置ID)也可以作为一种行为相关的side信息。如果加入side信息,那么我们的交互就变为:

v_u^{(j)} = (I^{(k)},b_{u,j}^{(1)},...,b_{u,j}^{(q)})I^{(k)} = (ID^{(k)}, f_k^{(1)}, ...,f_k^{(p)})

其中

b_{u,j}^{(\cdot)} 表示用户
u 的第
j 个交互行为相关的side信息,
I^{(\cdot)} 表示一个商品,包括了商品的ID和许多商品相关的成分
f_k^{(\cdot)} 。商品相关的side信息是静态的,并且包含了每个特定商品的内部特征,所以我们的词典可以被重新表示为:
\tau = \left\{ I^{(1)}, I^{(2)}, ..., I^{(m)} \right\}

我们的目标是预测下一个商品的ID:

I_{pred} = ID^{(\bar{k})}\bar{k} = argmax_kP(v_u^{(n+1)} = (I^{(k)},b_1,b_2,...,b_q)|S_u)

其中,

b_1,b_2,...,b_q 是潜在行为相关的side信息。

3.3 BERT和Invasive的self-attention

BERT4Rec是第一次将BERT框架用于序列化推荐任务的,并且取得了SOTA的效果,在BERT框架下面,Item被表示为向量,在训练的过程中,一些商品被随机mask掉,BERT模型需要尽力将它们的向量表示恢复过来,

SA(Q,K,V) = \sigma(\frac{QK^T}{\sqrt{d_k}})V

其中

\sigma 是softmax函数,
d_k 是比例因子。BERT使用encoder decoder的设计形式对每个输入的序列中的商品产出一个上下文的表示,BERT使用embedding层来存储
m 个向量,每个对应词典中的一个商品。

为了更好地使用side信息,传统方法经常会使用分开的embedding层来将side信息编码为向量,然后将它们fuse加入到ID的embedding中,

E_{u,j} = F(\varepsilon_{id}(ID),\varepsilon_{f1}(f^{(1)}),...,\varepsilon_{fp}(f^{(p)}),\varepsilon_{b1}(b_{u,j}^{(1)}),...,\varepsilon_{bq}(b_{u,j}^{(p)}))
E_{u,j} 是用户
u 的第
j 个交互的集成embedding,
\varepsilon 是embedding层,然后我们将集成的embedding序列输入到模型当中。

BERT使用self-attention机制来更新表示层,

R_{i+1} = BERTLayer(R_i)R_1 = (E_{u,1},E_{u,2},...,E_{u,n})

我们知道self-attention操作是位置不变的函数,所以此处我们将位置embedding编码加入其中。也就是说,此处我们的BERT仅仅是将位置信息作为了side信息,并且使用addition作为fusion函数。

3.4 Non-invasive Self-attention

如果我们考虑端到端的BERT框架,它是一个自动编码器,具有堆叠的self-attention层。相同的embedding映射用于编码商品ID和解码还原的向量表示。因此,我们认为

  • invasive方法有复杂嵌入空间的缺点,

因为商品ID不可逆地与其他边信息融合。混合来自id的信息和其他辅助信息可能会使模型难以解码商品ID。对应地,我们提出了一种新的方法,即non-invasive自注意(NOVA),在利用side信息对序列进行更有效建模的同时,保持嵌入空间的一致性。其思路是:

  • 修改自我注意机制,仔细控制自已组件的信息源,即Q、K和V

NOVA不仅是第3.3节中定义的集成嵌入E,还保留了纯ID嵌入的分支。

E_{u,j} ^{(ID)} = \varepsilon _{id} (ID)

因此,对于NOVA,用户的历史由两个表示集合表示,纯ID embedding以及集成的embedding。

R_u^{(ID)} = (E_{u,1}^{ID},E_{u,2}^{ID},...,E_{u,n}^{(ID)})R_u = (E_{u,1}, E_{u,2},...,E_{u,n})

NOVA从集成的embedding R,来自于商品ID的emebdding

E^{(ID)} 中计算Q和V,实践中,我们以张量的形式处理整条序列。
R^{(ID)} \in R^{B*L*h}

其中是Batch size, 是序列长度, 是embedding向量的大小, NOVA可以被表示为:

NOVA(R,R^{(ID)}) = \sigma(\frac{QK^T}{\sqrt{d_k}})V

其中是通过线性转化得到:

Q = RW_Q,K = RW_K,V = R^{ID}W_V

NOVA和invasive方法的比较可以通过下图看到:

3.5 Fusion操作

NOVA和invasive方法在使用side信息下的不同在于,NOVA将其作为一个辅助的并通过fusion函数将side信息作为Keys和Querys输入。此处我们定义concatfusion, 来将所有的side信息进行fusion,后面会接一个全链接层。

F_{concat}(f_1,...,f_m) = FC(f_1\odot...\odot f_m)

我们可以使用从上下文中提取可训练的系数来设计gating的fusion,

F_{gating}(f_1,...,f_m) = \sum_{i=1}^{m} G^{(i)}f_iG = \sigma(FW^F)

其中,

F 是所有特征的矩阵形式,
[f_1,...,f_m]\in R^{m*h}
W^F 是可训练的参数,
h 是被fused的特征向量的维度,
f_i \in R^h

3.6 NOVA-BERT

每个NOVA层接受两个输入,

  • side信息
  • 商品表示序列

然后输出相同形状的更新表示,再将这些表示输送送到下一层。

对于第一层的输入,商品表示是纯商品ID嵌入。由于我们只使用side信息作为辅助来学习更好的注意分布,side信息不会随着NOVA层传播。为每个NOVA层明确提供相同的side信息集。

NOVA-BERT遵循原始的BERT框架,除了将self-attention层替换为了NOVA层之外,所以额外的参数和计算是可以忽略的。

我们认为,在NOVA-BERT算法中,隐藏表示保持在相同的嵌入空间中,这将使解码过程成为一个齐次向量搜索,有利于预测。

4. 实验

4.1 效果比较

  • NOVA-BERT的效果比其它的都要好;
  • 与Bert4Rec仅利用位置ID相比,invasive式方法使用了多种side信息,但改进非常有限甚至没有正向效果。相反,NOVA-BERT方法能有效地利用side信息,性能稳定,优于其他方法。
  • 在我们实验中,发现越大的denser数据集,模型提升的幅度会下降;我们假设,在语料库更为丰富的情况下,这些模型甚至可以从商品的上下文中学习到足够好的商品embedding,从而为辅助信息的补充留下更小的空间。
  • NOVA-BERT的鲁棒性是非常好的;不管我们使用什么fusion函数,Nova-Bert的效果一直比baseline模型要好;
  • 最佳融合函数可能取决于数据集。一般来说,gating方法具有很强的性能,这可能得益于其可训练的gating机制。结果还表明,对于实际部署,融合函数的类型可以是一个超参数,并应根据数据集的内在属性进行调整,以达到最佳的在线性能。

4.2 不同side信息的贡献

  • None:是原始的Bert+position ID;
  • 商品相关和行为相关的side信息并未带来准确率的明显提升;
  • 如果结合了与行为相关的side信息,则改进的效果明显大于其中任何一个带来的改进的总和;也就是说不同类型的side信息并不是独立的;
  • NOVA-BERT从综合信息中获益更多,并且有很强的能力利用丰富的数据而不受信息的困扰;

4.3 Attention 分布的可视化

  • NOVA-BERT的注意力得分在局部性方面表现出更强的模式,大致集中在对角线上。另一方面,在基线模型的图中没有观察到。
  • 根据我们对整个数据集的观察,这种对比是普遍存在的。我们注意到侧边信息导致模型在早期层次形成更明显的attention。实验结果表明,NOVA-BERT算法以side信息作为计算attention矩阵的辅助工具,可以学习目标的注意分布,从而提高计算的准确性。

此外,我们也进行个案研究,以了解NOVA的注意分布,并进行更详细的分析。详情请参阅附录。

4.4 NOVA-BERT的部署和代价

  • NOVA-BERT几乎没有额外的计算开销,与invasive方法的大小相同。

5. 结论

在本文中,我们提出了NOVA-BERT推荐系统和Non-invasive自我注意机制(NOVA)。提出的NOVA机制没有将sidw信息直接融合到商品表示中,而是利用side信息作为方向引导,保持商品表示在向量空间中不被掺杂。我们在实验数据集和工业应用两个方面对NOVA-BERT进行了评估,在计算和模型尺寸方面的开销可以忽略不计的情况下实现了SOTA性能。

参考文献

https://www.aaai.org/AAAI21Papers/A

mp.weixin.qq.com/s/UHQB

最强的Attention函数诞生啦,带给你意想不到的巨大提升!

mp.weixin.qq.com/s/UHQB

更多干货,请关注公众号:炼丹笔记

又一Attention函数诞生啦,带给你意想不到的巨大提升!相关推荐

  1. 最强的Attention函数诞生啦,带给你意想不到的巨大提升!

    Non-invasive Self-attention for Side Information Fusion in Sequential Recommendation(AAAI2021) 一本有仙气 ...

  2. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  3. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  4. 【NLP】Attention函数手册!

    作者:一元,四品炼丹师 前言 目前的诸多机器学习相关的问题,诸如推荐问题中的序列处理,时间序列的预测,文本分类等问题都会涉及到Attention函数的使用,Attention已经成为了这些问题在建模时 ...

  5. Attention函数手册

    Attention基本公式及其变种 一元@炼丹笔记 目前的诸多机器学习相关的问题,诸如推荐问题中的序列处理,时间序列的预测,文本分类等问题都会涉及到Attention函数的使用,Attention已经 ...

  6. 用emWin的2D绘图函数画一个带圆形端点的环形进度条

    先上效果图,首先是顺时针转: 然后是逆时针转: 大概讲一下思路吧,首先讲一下顺时针是怎么弄的,很简单. 画圆弧函数GUI_DrawArc有起始角度a0和终止角度a1两个参数,且a0必须小于a1否则无法 ...

  7. 一个CloudCC生态软件包的诞生:带你体验CloudCC生态-CSDN公开课-专题视频课程

    一个CloudCC生态软件包的诞生:带你体验CloudCC生态-347人已学习 课程介绍         随着市场环境的不断变化和信息技术的日新月异,客户关系管理系统(CRM)越来越受到企业的重视,但 ...

  8. 函数参数中带省略号的用法

     [转]函数参数中带省略号的用法 本文摘自CDSN<可变参数学习笔记>,原帖链接:http://topic.csdn.net/t/20041124/09/3582660.html 前言 ...

  9. 解析身份证_你需要知道的与身份证相关的7个函数,让你的工作效率快速提升!...

    工作中我们经常会碰到计算时间日期的情况,比如计算时间差.从身份证号码中提取出生年月日.根据身份证号码计算人员性别.计算当前日期周期等等.这些都离不开我们的时间相关的函数,这里我们就来详细学习一下Exc ...

最新文章

  1. 模式6--ReadWriteLock
  2. Learn OpenGL (四):纹理
  3. 国行版HomePod售价2799元,本周五发售
  4. 表格单元格中的CSS文本溢出?
  5. php 换行 \n \r\n br 简介
  6. python 处理url 参数_Python 优雅的处理网页URL参数
  7. 2020华南理工计算机考研分数线,华南理工大学2020考研复试分数线已公布
  8. 【转】无法登陆SQL server 服务器的解决办法
  9. 【模板】分散层叠算法(P6466)
  10. java pk .net_Java与.Net大PK
  11. 迷宫问题 (dfs)
  12. RabbitMQ入门:发布/订阅(Publish/Subscribe)
  13. python3.6安装步骤-详解win7下python3.6安装配置方法步骤
  14. python神经网络库识别验证码_基于TensorFlow 使用卷积神经网络识别字符型图片验证码...
  15. 猫和老鼠服务器正在修复中,猫和老鼠手游:关于29日在游戏中出现的异常问题 是暗改还是bug?...
  16. 浅谈软件定制开发与软件外包的区别
  17. PDF转jpg工具(含注册码)
  18. 02325计算机系统结构201810,2018年10月自考02325计算机系统结构真题及答案
  19. 马来西亚:央行与证监会联合实施数字货币与ICO监管
  20. python打开文件的语法_python27语法Python文件打开方式实例详解【a、a+、r+、w+区别】...

热门文章

  1. Java中 Iterable 和 Iterator 的区别
  2. 图像预处理第8步:紧缩重排数字字符
  3. DisplayContent、StackBox、TaskStack笔记
  4. jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
  5. 华测服务器进不去系统,华测rtk单点到固定怎么操作步骤
  6. ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题
  7. unef螺纹_这十一种螺纹,你知道几种呢?
  8. 机器人学习--栅格地图(occupancy grid map)构建
  9. moldflow2016安装教程
  10. C语言 | 编程实现4