2019最新进展 | Transformer在深度推荐系统中的应用
作者 | Alex-zhai
来源 | 深度传送门(ID:deep_deliver)
【导读】最近基于Transformer的一些NLP模型很火(比如BERT,GPT-2等),因此将Transformer模型引入到推荐算法中是近期的一个潮流。Transformer比起传统的LSTM、GRU等模型,可以更好地建模用户的行为序列。本文主要整理Transformer在推荐模型中的一些应用以及在2019年的最新进展。
Self-Attentive Sequential Recommendation, ICDM 2018
模型结构
问题定义:模型输入是用户 u 的一个历史交互序列: , 其期望的输出是该交互序列一个时间刻的偏移:
。
Embedding层
将输入序列 转化成固定长度的序列
。意思是如果序列长度超过n,则使用最近n个行为。如果不足n,则从左侧做padding直到长度为n。
位置embedding:因为self-attention并不包含RNN或CNN模块,因此它不能感知到之前item的位置。本文输入embedding中也结合了位置Embedding P信息,并且位置embedding是可学习的。
Self-Attention层
Transformer中Attention的定义为:
本文中,self-attention以embedding层的输出作为输入,通过线性投影将它转为3个矩阵,然后输入attention层:
为了避免在预测i时刻的item时用到后续时刻的信息,本文将符合(j > i)条件的 与
之间的连接forbidding掉,这是因为self-attention每个时刻的输出会包含所有时刻的信息。
Point-wise前馈网络
尽管self-attention能够用自适应权重并且聚焦之前所有的item,但最终它仍是个线性模型。可用一个两层的point-wise前馈网络去增加非线性同时考虑不同隐式维度之间的交互:
预测层
最后采用MF层来预测相关的item i:
其中 是给定t个item,下一个item i的相关性。N是item embedding矩阵。为了减少模型尺寸及避免过拟合,共用一个item embedding。
显式用户建模
为了提供个性化推荐,当前主要有两种方法:学习显式的用户embedding表示用户偏好(MF,FPMC,Caser);考虑用户之前的行为,通过访问过的item的embedding推测隐式的用户embedding。本文采用第二种方式,同时额外在最后一层插入显式用户embedding ,例如通过加法实现:
但是通过实验发现增加显式用户embedding并没有提升效果。
Next Item Recommendation with Self-Attention, 2018
模型结构
本文亮点是同时建模用户短期兴趣(由self-attention结构提取)和用户长期兴趣。
短期兴趣
其短期兴趣建模过程如下:假定使用用户最近的 L 条行为记录来计算短期兴趣。可使用X表示整个物品集合的embedding,那么,用户 u 在 t 时刻的前 L 条交互记录所对应的embedding表示如下:
其中每个item的embedding维度为d,将 作为transformer中一个block的输入。
这里需要注意和传统transformer的不同点:
计算softmax前先掩掉
矩阵的对角线值,因为对角线其实是item与本身的一个内积值,容易给该位置分配过大的权重。
没有将输入
乘以
得到
,而是直接将输入
乘以softmax算出来的score。
直接将embedding在序列维度求平均,作为用户短期兴趣向量。
长期兴趣
self-attention模块只使用用户最近的L个交互商品作为用户短期的兴趣。那么怎么建模用户的长期兴趣呢?可认为用户和物品同属于一个兴趣空间,用户的长期兴趣可表示成空间中的一个向量,而某物品也可表示为成该兴趣空间中的一个向量。那如果一个用户对一个物品的评分比较高,说明这两个兴趣是相近的,那么它们对应的向量在兴趣空间中距离就应该较近。这个距离可用平方距离表示。
综合短期兴趣和长期兴趣,可得到用户对于某个物品的推荐分,推荐分越低,代表用户和物品越相近,用户越可能与该物品进行交互:
模型采用pair-wise的方法训练,即输入一个正例和一个负例,希望负例的得分至少比正例高γ,否则就发生损失,并在损失函数加入L2正则项:
BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer, CIKM 2019
模型架构
显而易见,本文的亮点是结合使用预训练的BERT模型。
Embedding Layer
模型的输入是用户历史交互序列,对交互序列中的每一个物品 i,其Embedding包含两部分,一部分是物品的Embedding,用vi表示;另一部分是位置信息的Embedding,用 pi 表示。这里的pi是可学习的。
Transformer Layer
主要包括Multi-Head Self-Attention层和Position-Wise Feed-Forward Network,其中Multi-Head Self-Attention计算过程如下:
Stacking Transformer Layer使用了类似于resnet的skip连接结构。
模型训练
因为在BERT4Rec中,输入历史序列[v1, v2, ..., vt-1],输出的是包含上下文信息的向量[h1, h2, ..., ht-1],这里每个向量ht都包含了整个序列的信息。如果要预测用户t时刻的交互物品vt,如果直接把 vt 作为输入,那么其余每个物品在Transformer Layer中会看到目标物品vt的信息,造成一定程度的信息泄漏。
因此可把对应位置的输入变成[mask]标记。打标记的方式和BERT一样,随机把输入序列的一部分遮盖住,然后让模型来预测这部分对应的商品:
Behavior Sequence Transformer for E-commerce Recommendation in Alibaba, 2019
模型结构
问题建模:给定一个用户u的行为序列:S(u) = {v1, v2, ..., vn },学习一个函数F用于预测用户 u 点击item vt的概率。
Transformer layer
对于每个item抽取了一个更深层次的representation,用于捕捉该item和历史行为序列中的其他item的关系。
DIN、DIEN、DSIN和本文BST模型的区别和联系
1. DIN模型使用注意力机制来捕获目标商品与用户先前行为序列中商品之间的相似性,但是未考虑用户行为序列背后的序列性质,并且未捕捉用户兴趣的动态变化性。
2. DIEN主要解决DIN无法捕捉用户兴趣的动态变化性的缺点,提出了兴趣抽取层Interest Extractor Layer、兴趣进化层Interest Evolution Layer。
3. DSIN针对DIN和DIEN没考虑用户历史行为中的会话信息,因为在每个会话中的行为是相近的,而在不同会话之间差别是很大的。DSIN主要是在session层面上来利用用户的历史行为序列信息。
4. BST模型通过Transformer模型来捕捉用户历史序列中各个item的关联特征,并且通过加入待推荐的商品item,也可抽取出行为序列中商品与待推荐商品之间的相关性。
原文链接:https://zhuanlan.zhihu.com/p/85825460
(*本文为AI科技大本营转载文章,转载请联系原作者)
推荐阅读
超模脸、网红脸、萌娃脸...换头像不重样?我开源了5款人脸生成器
解读 | 2019年10篇计算机视觉精选论文(上)
高通:2 亿像素手机 2020 年诞生!
再现暴力裁员!患病员工被关小黑屋,摄像头监控,工作量超其他人!
图灵奖得主Bengio:深度学习不会被取代,我想让AI会推理、计划和想象
VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读
我在华为做外包的真实经历
数据中心“容灾”和“备份”的区别
2019 区块链大事记 | Libra 横空出世,莱特币减产,美国放行 Bakkt……这一年太精彩!
你点的每个“在看”,我都认真当成了AI
相关文章:

自己架设windows升级服务器
大部分对计算机比较熟悉的朋友都知道,通常安装好Windows 操作系统后要做的第一件事就是上Windows Update网站去给Windows 安装补丁程序,否则各种漏洞对系统就是一个很大的威胁。不过遗憾的是很多人还没有这样的意识,疏忽了给系统打补丁。这也…

内嵌IE网页窗口中消除IE默认脚本设置影响的方法
随着人们对客户端软件界面要求的不断提高,软件开发商面临着一个问题:如何快速廉价开发出各种丰富效果的UI界面。设计出一套丰富控件的界面库是不容易的,且产品经理丰富的想法和UED对效果的追求,往往会使程序员疲于编写这些“效果控件”。目前市面上使用的很多界面库是基于X…

win7 64位操作系统中 Oracle 11g 安装教程(图解)
1.下载Oracle 11g R2 for Windows版本,下载地址如下 官方网站: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_database_1of2.zip http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_database_2of2.zip 2.解压两…

使用APIHOOK实现进程隐藏
今天翻出一些今年前写的代码。其中一个是09年,我帮一个读研的同学写的一个“无公害恶意”程序。大致要求就是要实现自启动和自我隐藏。我使用的都是些简单的技术,只是实现自我隐藏稍微让我花费了点时间写算法。其实这个算法也很简单,就是大学…
程序员创业前要做哪些准备?
作者 | hsm_computer出品 | CSDN博客在互联网时代,不少干IT的人白手起家,在短短的几年里通过努力干出了一番事业,有房有车有公司,在人前也很光鲜。这就吸引了更多的程序员想要通过自主创业来实现财务自由。殊不知,创业…

Flex编码过程
Flex编码过程当我们开发一个Flex程序,我们重复其他类型网络程序的过程,例如HTML,JSP,ASP和CFML。创建一个有用的Flex程序是很容易的:打开我们最喜欢的文本编辑器,例如Flex Builder,输入XML标签,编译成为SWF…

BufferedWriter
package JBJADV003;import java.io.*;public class BufferedWriterTest { public static void main(String[] args) { try { //创建一个FileWriter 对象 FileWriter fwnew FileWriter("c:\\myDoc\\hello.txt"); //创建一个BufferedWriter 对象 BufferedWriter bwnew…
使用VC内嵌Python实现的一个代码检测工具
最近组内准备整顿代码,领导让我写个简单的python脚本分析代码中注释的行数和无效注释。因为这个需求不是很急,所以我想把简单的事情做复杂点。于是就写了一个用VC内嵌Python,并通过模拟按键和发消息去控制其他软件的工具。(转载请…
Python如何实现24个微信大群万人同步转发直播?
作者 | 猪哥66来源 | CSDN博客今天我们来学习微信机器人多群转发做同步图文直播!一、背景介绍猪哥一年前在建Python学习群的时候就说过,要邀请企业大佬来学习群做直播。其实文章早就写好了,但是一直没有找到好的转发软件,所以耽搁…

ITSM实施三招[案例]
当前国外成熟的ITSM解决方案的实施成本相对比较高,使一些对成本较敏感的的IT部门,成为ITSM实施的一个真空区。对于国内起步阶段的ITSM(IT服务管理)实施来说,南航的ITSM实施之路是一个借鉴。 南航it环境 在各大航空公司…
lr手工添加关联函数的步骤:
点击“确定”后: 如何修改已经创建好的关联规则:

新闻内容实现分页
/**//// <summary> /// 新闻内容分页 /// </summary> /// <param name"content">新闻内容</param> /// <param name"extension">扩展名(aspx,html..)</param> /// <returns></returns>pub…
使用自己的数据集训练MobileNet、ResNet实现图像分类(TensorFlow)| CSDN博文精选
作者 | pan_jinquan来源 | CSDN博文精选之前写了一篇博客《使用自己的数据集训练GoogLenet InceptionNet V1 V2 V3模型(TensorFlow)》https://panjinquan.blog.csdn.net/article/details/81560537,本博客就是此博客的框架基础上,完…

VC下提前注入进程的一些方法1——远线程不带参数
前些天一直在研究Ring3层的提前注入问题。所谓提前注入,就是在程序代码逻辑还没执行前就注入,这样做一般用于Hook API。(转载请指明出处)自己写了个demo,在此记下。 我的demo使用了两种注入方式:1 远线程&a…

【转】用示例说明索引数据块中出现热块的场景,并给出解决方案
文章转自:http://www.luocs.com/archives/582.html

VC下提前注入进程的一些方法2——远线程带参数
在前一节中介绍了通过远线程不带参数的方式提前注入进程,现在介绍种远线程携带参数的方法。(转载请指明出处) 1.2 执行注入的进程需要传信息给被注入进程 因为同样采用的是远线程注入,所以大致的思路是一样的,只是在细…
芬兰开放“线上AI速成班”课程,全球网民均可免费观看
出品 | AI科技大本营(ID:rgznai100)去年,芬兰推出了一个免费的“人工智能线上速成班”项目,目的是向该国民众教授与新技术有关的知识。现在,作为送给全世界的圣诞节礼物,这个项目已面向全球网民开放访问&am…

deepin开通ssh
1、在终端打入下面命令进行安装sudo apt-get install openssh-server2、启用sshservice ssh start 反馈:start: Rejected send message, 1 matched rules; type"method_call", sender":1.56" (uid1000 pid2272 comm"start ssh ") int…

实现等待窗体的几种方式
实现等待窗体的几种方式:下面说明了五种可以实现等待窗体的方式,其中三种给出了代码。准备资料安全访问控件成员为了保证在创建控件的线程上调用控件成员,用下面的方式封装控件的属性、方法、其他自定义成员的访问。如: winWordControl.LoadD…
GitHub宝藏项目标星1.6w+,编程新手有福了
作者 | Rocky0429来源 | Python空间(ID: Devtogether)特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩ÿ…

VC下提前注入进程的一些方法3——修改程序入口点
前两节中介绍了通过远线程进行注入的方法。现在换一种方法——修改进程入口点。(转载请指明出处) 在PE文件中,其中有个字段标识程序入口点位置。我们通过这个字段,到达程序入口点。PE文件的结构我这儿不讨论(我会在之后…

如何产生签名applet能让applet能够访问本地资源
2019独角兽企业重金招聘Python工程师标准>>> 如何产生签名applet,以使applet能够访问本地资源? 在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大…

VC提前注入.net软件的方法
在之前几节介绍了各种注入方法,但是这些方法存在一些缺陷——对.net程序注入无效。(转载请指明出处) 这个可以理解,.net程序的代码不是汇编,而是微软自定义的IL中间语言。.net CLR如同虚拟机,解析并执行这些…
活动推荐:语音和语言技术在自然交互中的实践沙龙
智能语音技术已经渗透进家居生活、车载、金融服务等日常生活场景,在很大程度上解放了人们的双手和眼睛,语音交互成为连接人与信息/服务的新入口。根据IDC预测,国内对话式人工智能市场规模将在2022年达到78亿元。如何提供便捷、高效、高可用的…

JS字符串 window.open() window.opener window.name window对象总结
晚上总结了一下,发上来分享:字符串 window.open() window.opener window.name window对象等的一点总结 http://download1.csdn.net/down3/20070614/14012050509.rar

dedecms /member/reg_new.php SQL Injection Vul
catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 Dedecms会员中心注入漏洞 2. 漏洞触发条件 http://127.0.0.1/dedecms5.5/member/reg_new.php?dopostregbase&step1&mtype%B8%F6%C8%CB&mt…

VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷
工作中经常会遇到通过进程ID获取进程镜像文件或者其他模块的路径的需求。(转载请指明出处)网上关于方案大致存在两种方案: OpenProcess->GetModuleFileNameOpenProcess->EnumProcessModules->GetModuleFileNameEx我试验了下&#x…
腾讯云100亿元目标达成,发阳光普照奖iPhone 11 Pro,你酸了吗?
12 月 19 日,鹅厂腾讯发钱的消息又像往年一样引来了一群柠檬精。除了微信支付团队获得 2 亿元奖金的消息之外,一张腾讯云团队每个员工奖励一部 iPhone 11 Pro 的 H5 页面截图也不断地轰炸着朋友圈。原来这张图说的是腾讯云在 Q3 已完成 2019 年全年 100 …

分享一个python cookbook的在线教程地址
分享一个python cookbook的在线教程地址:http://python3-cookbook.readthedocs.org/zh_CN/latest/翻译者:熊能转载于:https://blog.51cto.com/verdureorange/1653514