当前位置: 首页 > 编程日记 > 正文

性能超越最新序列推荐模型,华为诺亚方舟提出记忆增强的图神经网络


作者 | Chen Ma, Liheng Ma等

译者 | Rachel

出品 | AI科技大本营(ID:rgznai100)

用户-商品交互的时间顺序可以揭示出推荐系统中用户行为随时间演进的序列性特征。用户与之交互的商品可能受到用户曾经接触的商品的影响。但是,用户和商品数量的大量增加,使得序列推荐系统仍然面临很多重要问题:(1)对短时用户兴趣建模的困难;(2)捕捉用户长期兴趣的困难;(3)对商品共现模式的建模效率较低。为了应对这些挑战,本文提出了一个记忆增强的图神经网络(memory augmented graph neural network, MA-GNN),以捕捉用户的长期和短期兴趣。

特别地,本文使用图神经网络对短期的商品语境信息建模,并使用共享的记忆网络来捕捉商品之间的长期依赖。另外,本文使用双线性函数以捕捉相关商品的共现模式。在模型评估上,本文在五个真实场景的数据集上进行了评测,并使用一系列评估指标和多个当前效果最优的模型进行了对比。试验结果显示,本文模型在Top-K序列推荐中效果极佳。

介绍

随着网络服务和移动设备的快速增加,个性化推荐系统在现代社会中正扮演着越来越重要的角色。个性化推荐系统能够降低信息负载、满足多种服务需求,并至少在以下两方面起到极大助力:(i)帮助用户发现上百万候选产品中的合适商品;(ii)为产品提供商创造增长营业额的机会。

在网络中,用户以线性顺序访问商品。用户在未来查看的商品可能收到历史浏览记录的影响,这创造了一个具有操作性的应用场景——序列推荐。在序列推荐任务中,除了和通用推荐系统一样需要捕捉用户的整体兴趣之外,我们认为还有另外三个重要因素需要考虑:用户短期兴趣,用户长期兴趣商品共现模式。用户短期兴趣描述了用户在短期内访问商品的偏好。用户长期兴趣捕捉用户之前访问的和未来将访问的商品之间的长期以来。商品共现模式则对相关商品的共现规律进行阐释。

尽管目前已有很多序列推荐模型,但我们认为已有模型尚不能完整捕捉前文提到的三个因素。首先,Caser, MARank, Fossil等人仅对用户短期兴趣进行了建模,忽略了商品的长期依赖关系。第二, SARSRec等类似模型没有对用户短期兴趣进行有效的建模,使得模型难以理解用户在短期内的兴趣变化。第三,GC-SAN,GRU4Rec++等类似模型未能明确捕捉商品序列中的商品共现规律。由于相关商品经常共同出现,推荐模型应当对此因素加以考量。

为将上述三个因素加入序列推荐模型,本文提出了一个记忆增强的图神经网络(MA-GNN)。该模型包括一个整体兴趣模块,一个短期兴趣模块,一个长期兴趣模块,以及一个商品共现模块。在整体兴趣模块中,我们使用矩阵分解对用户整体兴趣建模,该模块不包含商品对序列变化信息。在短时兴趣模块中,我们使用一个GNN结构加入商品的邻接关系信息,以构成用户的短期兴趣。

这一结构能够捕捉较短时期的情境信息和结构。为了对用户的长期兴趣建模,我用使用一个键值记忆网络(key-value memory network)以基于用户的长期商品序列形成对用户兴趣的表征。通过该方法,在推荐一个商品时,其他具有相似偏好的用户也会成为影响因素。为了综合用户的长期和短期兴趣,我们在GNN框架中引入了门机制,和LSTM网络中的门机制类似。这一机制对长时和短时兴趣在模型中的贡献度进行控制。在商品共现模块中,我们使用了一个双线性函数以捕捉商品序列中高度相关的商品。我们在五个真实世界的数据集上对模型进行了评估,并使用一系列评估指标,和多个当前最先进的模型进行了对比。试验结果显示了本文模型相较于其他模型在推荐效果上的提升,并展示了上述模块的有效性。

总体而言,本文的主要共现为:

  • 为了对用户短期和长期兴趣建模,提出一个记忆增强的图神经网络,以捕捉短期情境信息和长期依赖;

  • 为了高校融合短期和长期兴趣信息,提出了GNN框架中的门机制;

  • 为对商品共现模式进行建模,使用双线性函数来捕捉商品之间的特征关联;

  • 在五个真实世界数据集上进行评估试验,结果显示MA-GNN的效果显著由于已有的序列推荐模型。

相关工作

整体推荐

早期的推荐模型主要研究显性反馈,近期研究则逐渐转向隐性数据。使用隐性反馈的协同过滤(collaborative filtering, CF)往往被认为是一个Top-K推荐认为,该任务的目标即为用户推荐一个可能感兴趣的商品列表。这一任务更具有实际性和挑战性,且更适合真实世界的推荐场景。早期的相关工作主要使用矩阵分解技术学习用户和商品的隐性特征,基于神经网络的方法也经常被采用。

序列推荐

序列推荐模型将商品序列作为输入信息。一个经典方法是使用马尔可夫链对数据建模。FPMC, TransREC都属于此类方法。近期,受自然语言处理中序列学习的启发,学者们提出了基于(深度)神经网络的方法,包括基于卷积神经网络(CNN)、基于循环神经网络(RNN)等。注意力机制、记忆网络也在序列推荐模型中得到应用。

本文和已有模型的不同之处在于,模型使用记忆增强的图神经网络以捕捉长期和短期兴趣。另外,本文加入了一个商品共现模块,以对高度相关的商品建模。

问题定义

本文考量的推荐任务将序列的隐性反馈作为训练数据。用户兴趣通过一个用户-商品的线性序列进行表征,公式如下:

M个用户的用户偏好即:

对于M个用户,问题即可定义为从N个商品中为每个用户推荐一个长度为K的商品列表,并评估下述偏好中的商品是否出现在推荐列表中:

方法

本部分对MA-GNN模型进行了介绍,该部分介绍了四个对用户偏好和意图进行学习有所影响对因素,以及该模型了预测和训练步骤。

图1:MA-GNN模型结构

整体兴趣建模

模型假定用户的整体兴趣相对于时间保持稳定。模型使用矩阵分解以捕捉整体兴趣,且不考虑商品的序列动态变化。使用Pu代表用户u的嵌入表示,Qj表示商品j的输出嵌入,d表示隐空间的维度,矩阵分解公式如下:

短时兴趣建模

用户短期兴趣基于用户近期浏览的多个商品。我们使用滑动窗口策略,将商品序列分割为细粒度子序列。之后,我们使用近期子序列预测下一个浏览的商品,并忽略影响较小的无关商品。对于每一个用户u,抽取每 |L| 个连续商品作为输入,之后的 |T| 个商品为预测目标,则用户u的长度为l的子序列即:

则问题可定义为,在用户-商品互动序列              中,给定一个具有 |L| 个连续商品的序列,有多大可能为该用户推荐 |T| 序列商品。由于GNN能够聚合邻接信息并学习本地结构,该模型较适用于学习用户短期兴趣。

商品图构建

由于商品序列不天然适用于GNN,需要构建图结构以捕捉商品之间的关系。对序列中的每个商品,抽取多个商品子序列(本文选取子序列长度为3),并在其之间添加边。我们对每一用户记性呢此操作,并计算所有用户被抽取商品对的边数量。之后,我们对邻接矩阵进行列归一,即可得到序列中关系更近的商品。图2展示了抽取商品邻接对并构建邻接矩阵的方法。

图2:商品邻接矩阵构建示例

短时兴趣聚合

为捕捉用户短期兴趣,我们使用一个两层GNN以聚合邻接商品,并学习用户短期兴趣表征。对于在长度为l的窗口中的商品j,其输入嵌入为ej,用户短期兴趣可表示如下:

基于用户短期兴趣信息,即可预测用户将浏览的下一个商品。

但是,近使用上一公式预测,未能考虑到用户过去的长期兴趣:

而对于序列推荐模型而言,如何对长期商品依赖关系建模,并平衡长期和短期信息的关系,是非常重要的问题。

长时兴趣建模

我们可以使用外部记忆单元存储随时间变化的用户兴趣。这一方法的问题在于,维护每一用户的记忆单元会占据大量的存储空间。另外,记忆单元可能捕捉和用户嵌入非常相似的信息。因此,本文使用记忆网络存储所有用户共享的隐兴趣表征,其中每一记忆单元表示一个特定类型的隐用户兴趣。对于一个用户在过去浏览的商品Hu,l,可以学习到一个多类型兴趣的组合,以反映用户在Lu,l之前的长期兴趣。

本文使用了多维度注意力模型以生成查询的嵌入表示。Hu,l中的商品嵌入表示为:

则生成查询嵌入Zu,l的多维度注意力计算公式如下:

对于查询嵌入Zu,l,我们使用下述查询在记忆网络中寻找合适的共享用户隐兴趣的组合。一般地,记忆网络中的键和值分别表示为K和V,则用户长期兴趣嵌入可表示为:

兴趣聚合

下一步即在GNN框架中对用户的长期和短期兴趣进行组合,以生成用户兴趣预测。我们借鉴LSTM中的门机制平衡两类信息,公式如下:

商品共现建模

对于推荐系统而言,学习商品间关系是最关键的步骤之一。在序列推荐问题中,关系紧密的商品会在商品序列中接连出现。为捕捉商品共现规律,我们使用双线性函数以显性表示Lu,l序列中的商品,函数如下:

预测和训练

为了推测用户偏好,我们使用了一个预测层以结合前述所有因素:

由于训练数据从用户隐性反馈中产生,我们通过梯度下降,使用贝叶斯个性化排序算法对模型进行优化,该优化同时对积极(可观测)和消息(不可观测)的商品的对偶排序进行优化:

评估

本部分介绍了评估实验的设置和结果。

数据集

我们在五个真实世界数据集上对模型的效果进行了评估:MovieLens-20M, Amazon-Books and Amazon-CDs, Goodreads-Children and Goodreads-Comics。我们保留评分不低于4星的商品作为积极输入,其他作为缺失输入。为过滤噪音信息,仅保留评分多于10个的用户和商品。预处理后数据集情况表1。

表1:数据集统计数据

评估指标

我们使用Recall@KNDCG@K对所有模型进行了评估。

用于比较的推荐方法

我们比较了下述所有模型的表现:(1)BPRMF; (2) GRU4Rec; (3)GRU4Rec+; (4)GC-SAN; (5)Caser; (6)SASRec; (7)MARank; (8)MA-GNN。

实验设置

试验中,所有模型的隐维度均设定为50。对基于短序列的(session-based)方法,设定一个短时窗口中的商品作为一个序列。模型超参数依据验证集基于原论文设置进行微调。对于MA-GNN,设置 |L| = 5, |T| = 3。

性能比较

表2:所有方法的性能比较。其中,标下划线的是同任务中表现最佳的模型。    

消融实验

表3:消融分析。S 代表短期兴趣模块,H 代表长期兴趣模块,concat代表串接操作。    

超参数的影响

多维度注意力模型的维度h和记忆单元数量m是本文模型中两个最重要的超参数。其对模型的影响见图3。

     图3:h和m的变化

记忆可视化

为验证每一记忆单元是否可以表示一个特定类型的用户兴趣,我们在MovieLens数据集上进行了一个案例研究。记忆网络的注意力可视化情况如图4。

图4:记忆网络注意力可视化

结论

本文对于序列推荐任务,提出了记忆增强的图神经网络(MA-GNN)。该模型使用GNN对商品对短期情境信息建模,并使用记忆网络捕捉长期商品依赖关系。除用户兴趣建模之外,我们还使用双显性函数对商品对特征关联进行了建模。在五个真实世界数据集上的实验结果显示,MA-GNN的性能超越了已有的许多最新的序列推荐模型。

论文链接:

https://arxiv.org/pdf/1912.11730

推荐阅读
  • 全网唯一秃头数据集:20万张人像,网罗各类秃头

  • 阿里云科学家入选计算机顶会HPCA名人堂,他是什么来头?

  • 干货 | 基于SRS直播平台的监控系统之实现思路与过程

  • 程序员在这些地方敲代码,普通笔记本根本扛不住

  • 又一国产数据库诞生!腾讯发布 TGDB,实时查询比 Neo4j 快 20-150 倍

  • 力挺比特币的世界第2交易员:仅次于索罗斯,连续25年无亏损

你点的每个“在看”,我都认真当成了AI

相关文章:

ASP.net 中的页面继承实现和通用页面的工厂模式的实现

最近用.Net做web项目的时候遇到了一些问题,就是很多的页面的处理一样的,不一样的就是我们写的存储过程不同,为了考虑代码的重复利用和可维护性和可 扩展性,于是写了一个对于单据页面的工厂模式,采用界面的继承技术&…

5502的时钟组

5502有四个时钟组,分别为: C55x Subsystem Clock GroupFast Peripherals Clock GroupSlow Peripherals Clock GroupExternal Memory Interface Clock Group1、C55x Subsystem Clock Group该时钟组包括C55X CPU core、内存(DARAM和ROM&#xf…

遇到的浏览器兼容问题及应对方法

前言: 上周天的时候有个学长找我帮忙做三张页面,因为没有数据交换之类的,只是单纯的前端页面,想着好久没做东西, 看书都看烦了,所以就接了也当是练手。之前因为没有系统的看书,所以其实很多问题…

浅谈权限设计(来自深空老大)

2019独角兽企业重金招聘Python工程师标准>>> By 深空, 2009-09-13 21:45:07 PHPChina的专家版在谈权限设计,苦于没有权限回帖,特发此博文谈谈简单的权限设计。讨论在这里。 最简单的权限验证,应该是登录态的验证,如果登…

5年Python功力,总结了10个开发技巧

作者 | 写代码的明哥来源 |Python编程时光(ID: Cool-Python)如何在运行状态查看源代码?查看函数的源代码,我们通常会使用 IDE 来完成。比如在 PyCharm 中,你可以 Ctrl 鼠标点击 进入函数的源代码。那如果没有 IDE 呢&…

怎样给目录加权限0777

# chmod -R 0777 /var/www/html/子目录

php学习,一个简单的Calendar(2) 一个简单的活动页面

有了前面的基础&#xff0c;后面就是将页面展示出来。 预览图如下&#xff1a;1号和31号分别有活动&#xff0c;会一并显示出来 这里需要搞定几个问题&#xff0c;一个就是数据库的连接&#xff0c;我们用\sys\class\class.db_connect.inc.php <?php /* * 数据库操作&#…

涨见识了,在终端执行 Python 代码的 6 种方式

作者 | BRETT CANNON译者 | 豌豆花下猫Python猫为了我们推出的 VS Code 的 Python 插件[1]&#xff0c;我写了一个简单的脚本来生成变更日志[2]&#xff08;类似于Towncrier[3]&#xff0c;但简单些&#xff0c;支持 Markdown&#xff0c;符合我们的需求&#xff09;。在发布过…

ASP.NET中DataGrid鼠标经过感知以及点击行弹出窗口

选择自 xujh 的 Blog 作者Blog&#xff1a;http://blog.csdn.net/xujh/ 很多人说很难&#xff0c;其实就这几行代码。只要在DataGrid1的ItemDataBound中写入下代码即可 private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventAr…

python中的module

Python中的Module是比较重要的概念。常见的情况是&#xff0c;事先写好一个.py文件&#xff0c;在另一个文件中需要import时&#xff0c;将事先写好的.py文件拷贝到当前目录&#xff0c;或者是在sys.path中增加事先写好的.py文件所在的目录&#xff0c;然后import。这样的做法&…

找子串替换(kmp)poj1572

题目链接&#xff1a;http://poj.org/problem?id1572 输入数据时要注意&#xff0c;这里是string型 用getline(cin,origin[i]); #include <string> #include <iostream> #include <algorithm> #include <stdio.h>using namespace std;const int maxn …

dll的概念、dll导出类(转)

1、 DLL的概念DLL(Dynamic Linkable Library)&#xff0c;动态链接库&#xff0c;可以向程序提供一些函数、变量或类。这些可以直接拿来使用。静态链接库与动态链接库的区别&#xff1a;&#xff08;1&#xff09;静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的…

墨奇科技汤林鹏:如何用 AI 技术颠覆指纹识别?

受访者 | 墨奇科技联合创始人& CTO 汤林鹏 记者 | Aholiab&#xff0c;编辑 | Carol 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 随着深度学习等AI技术的成熟&#xff0c;生物识别成为了关注度较高的领域&#xff0c;指纹、人脸、虹膜等识别技术…

ASP.Net ViewState的实现

选择自 timmy3310 的 Blog ViewState是.Net中提出的状态保存的一种新途径&#xff08;实际上也是老瓶装新酒&#xff09;&#xff1b;我们知道&#xff0c;传统的Web程序保存状态的方式有这样几种&#xff1a;1、Application 这是Web应用程序生命期中的全局保存区&#xff0c…

【51CTO学院三周年】遇到

作为一名二流学校的大学生&#xff0c;因为学校的一门嵌入式Linux应用程序开发而喜欢上了嵌入式&#xff0c;但是学校却是只上了一学期的课&#xff0c;无奈只能自己找教程继续学习。在3个月前&#xff0c;无意中找到了朱有鹏老师的嵌入式学习基础视频&#xff0c;通过老师视频…

ASP.NET图象处理详解

作者&#xff1a;未知 请与本人联系在使用ASP的时候&#xff0c;我们时常要借助第三方控件来实现一些图象功能。而现在&#xff0c;ASP.NET的推出&#xff0c;我们已经没有必要再使用第三方控件来实现&#xff0c;因为ASP.NET 已经具有强大的功能来实现一些图象处理。现在&…

IT工作者,你们的爱情是这样的吗?

今天在博客里看到了这篇文章&#xff0c;看完这个视频我随笔写了点自己的感受和看法&#xff0c; 视频链接在下方&#xff1a; http://leidu.blog.51cto.com/3245712/622534 很感谢90 男孩提供&#xff0c;建议IT人员看一下&#xff0c;看完写一下你们的感受吧&#xff01;…

平头哥玄铁处理器Linux新版本,5大亮点速览

来源 | 芯片开放社区为了便于 CPU 评估&#xff0c;系统集成&#xff0c;快速上手玄铁处理器 Linux 操作系统&#xff0c;平头哥更新了玄铁处理器 linux 版本&#xff0c;结合 gitlab 开源 CI/CD 系统&#xff0c;对已发布到开源社区的玄铁架构 CPU 相关的生态软件形成持续保障…

费用保险单,如何失焦时自动补零

费用&#xff0c;如何失焦时自动补零转载于:https://www.cnblogs.com/maojiayan/p/5606247.html

腾讯AI种番茄双丰收:参赛AI全胜专家,辽宁试点净利增千元

6月9日&#xff0c;腾讯宣布了两项AI农业领域进展。在研究侧&#xff0c;腾讯 AI Lab 与荷兰瓦赫宁根大学&#xff08;下称WUR&#xff09;联办的“第二届国际智慧温室种植挑战赛”&#xff08;下称比赛&#xff09;落幕。在全球疫情肆虐之时&#xff0c;复赛的五支队伍挑战用 …

在ASP.NET中值得注意的两个地方

在ASP.NET中ASPX页面的Page_Load事件有两个让人奇怪的地方&#xff0c;你应该记住它们&#xff1a; a.有时Page_Load事件在你的ASP.NET页面里会发生多次。这种情况发生的一个可能的原因是你把ASPX页面的AutoEvenWireup值设置成了True。如果是这样&#xff0c;那么在“Sub Page…

yii 级联删除

alter table 外键表 add constraint 级联删除名 foreign key (外键字段) references 主表名(主表字段)ON delete CASCADE go 转载于:https://blog.51cto.com/dasangshu/624605

iOS--优秀博客记录

感谢唐巧整理&#xff0c;我又加了一些备注。原地址&#xff1a;https://github.com/tangqiaoboy/iOSBlogCN 博客地址RSS地址psOneVs Denhttp://onevcat.com/atom.xml 一只魔法师的工坊http://blog.ibireme.com/feed/图片处理、YYKit破船之家http://beyondvincent.com/atom.xml…

linux环境下和网络服务相关的配置文件含义及如何配置

要建立一个安全Linux服务器就首先要了解Linux环境下和网络服务相关的配置文件的含义及如何进行安全的配置。那天查看服务器的eth0地址&#xff0c;后来想了一些问题&#xff0c;到家里就翻了翻以前的文档&#xff0c;无意中看到了这个&#xff0c;现在发布出来&#xff0c;希望…

ASP.NET保持用户状态的九种选择

2003-06-10 ■陶刚编译 ■yesky摘要&#xff1a;ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象&#xff0c;以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术&…

Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

作者 | 杨秀璋&#xff0c;责编 | 夕颜 题图 | 视觉中国出品 | CSDN博客本篇文章主要讲解Python调用OpenCV实现图像平滑&#xff0c;包括四个算法&#xff1a;均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识&#xff0c;希望对您有所帮助。知识点如下&#xff1a;…

Laravel Lumen之Eloquent ORM使用速查-基础部分

使用Eloquent [eləkwənt] 时&#xff0c;数据库查询构造器的方法对模型类也是也用的&#xff0c;使用上只是省略了DB::table(表名)部分。 在模型中使用protected成员变量$table指定绑定的表名。<?php namespace App;use Illuminate\Database\Eloquent\Model;class Flight…

数据库连接字在Web.config里的用法

作者&#xff1a;未知 请速与本人联系在asp.net中的WEB程序的设置中我们必须用到Web.config来存储数据库连接字.事实上这是个很好的做法,因为可以省去我们很多的麻烦还可以帮助我们避免不必要的错位,是的很多情况下我就是这样做.它通过XML来记录这些信息.具体的是在....这个标…

重构ncnn,腾讯优图开源新一代移动端推理框架TNN

来源 | 腾讯优图从学界到工业界&#xff0c;“开源”已经成为AI领域的一个关键词。一方面&#xff0c;它以“授人以渔”的方式为AI构建了一个开放共进的生态环境&#xff0c;帮助行业加速AI应用落地&#xff1b;另一方面&#xff0c;在解决行业实际问题时持续更新和迭代&#x…

java读取文件

1 java8读取文本文件2 3 4 public static void java8ReadFileLines(String fileName) throws IOException {5 List lineList Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8);6 7 for(String line:lineList){8 Sys…