摆脱 FM!这些推荐系统模型真香
作者 | 梁唐
来源 | TechFlow
之前我们介绍了推荐当中应用得非常广泛的FM大家族,从FM这个模型衍生出了一系列的模型,从纯FM,到AFM、FFM、DeepFM等等一系列的FM模型,最后的终极版本是xDeepFM。这个模型非常复杂,可以说是把FM魔改到了极致,今天这篇文章先不讨论这个,等以后论文解析的时候好好介绍一下这个模型。
现在回过头来看的话,会发现FM模型的各种魔改其实是一种探索,当时还不知道未来的出路在哪里,也不知道深度学习在推荐领域能够带来什么变化。前人尝试出来FM模型效果不错,那么最简单的办法当然是在FM上各种魔改。魔改多了之后,逐渐探索出了方法论,那么就有了下一次的迭代升级。
FM的下一个迭代版本是什么呢?其实不再是单纯的某一个或者是某一种模型,而是一种思想和方法。我们之前的文章也提到过,也就是应用Embedding向量的方法,基于Embedding向量的应用,到这里有衍生出了许多个分支,有了更细维度的拆分。比如有的继续研究传统CTR的提升,有的研究模型的多任务学习,可以让模型同时优化几个指标,有的研究强化学习,想要训练出更加智能的模型等等。
今天我们还是先来聊聊最传统的CTR优化的方向,给大家介绍几个相对来说比较前沿的模型和方法。
用户时序特征
之前在介绍FM模型的时候,曾经提到过它有一个巨大的问题,就是模型的输入的维度是固定的,也就是说我们生成的特征也是固定的。看起来这个没什么问题,因为无论机器学习还是深度学习,它们的模型基本上参数空间都是固定的,至少大小是固定的。
问题不在于模型,而在于应用的时候,我们还是以电商场景举例,大家都知道在电商场景当中,有的用户活跃,行为多,有的用户相对不那么活跃,比较冷淡,偶尔来买点东西。对于这两种不同的用户来说,显然前者的行为更多,传递的信息也就更多。这个也很好理解,用户行为越多,喜好越明显,相反如果用户缺什么来买什么就很难猜测喜好。
但由于模型的输入是固定的,过去买过100件商品和没买过商品的用户,他们的特征加工完了之后是同样的维度,显然这会导致前者丢失大量的信息。另外一个问题是FM模型本身没有时序处理的部分,它肯定就学不到时序的一些信息。比如张三一周之前想买袜子,于是点击了很多袜子,前两天又对一款游戏感兴趣,点击了几次游戏。可能总体上来说游戏点击的次数不如袜子多,但显然由于游戏点击的行为发生地距离现在更近,他之后会点击游戏的概率要大于袜子。如果只是单纯的制作一个用户过去最经常点击的类别,那么对于张三来说这个类别显然是袜子,但是这个信息肯定是不准确的。
早年的算法工程师们也不傻,也都知道要把用户行为的特征着重研究,应用进模型。但这里有两个问题,第一个问题是用户的行为数量是不同的,有的用户行为多有的行为少,但模型的参数往往是固定的。第二个问题是FM模型没有时序的处理逻辑,它不能处理时间上的先后关系以及这个关系带来的影响。
由于这两个问题的存在,导致了我们仅仅制作特征是不够的,包含的信息往往比较片面,我们还需要模型层面的改进。
怎么改进呢,其实很简单,不是说了FM本身没有时序处理的部分,导致它学不到先后逻辑上的关联么。那什么领域的模型主要研究时序?NLP,因为语句是有先后顺序的,无论是文本分析还是机器翻译都需要考虑上下文,所以NLP是最早使用RNN、LSTM等时序模型的领域。
NLP先行一步,推荐也紧跟而上,尝试着将NLP的一些技术和思想应用到推荐模型当中来,由此诞生了许许多多的模型。在这里承志着重挑选了这两年效果不俗得到广泛认可的模型给大家简单介绍一下。
DIN
整体上来说DIN模型的原理并不复杂,相反还很简单。它的本身其实就是一个Embedding + MLP的结构,只不过在其中加上了DIN模块。也就是下图红框当中的部分。

红框当中的Goods1到Goods N表示的用户历史的行为数据,也就是用户和哪些商品有过交互。对于用户交互过的每一个商品,我们都通过Activation Unit计算它和当前将要预测的候选商品的权重。这个权重也可以理解成相似度,也就是用户交互的商品和候选的商品的相似度。然后我们把序列里所有商品都通过这个方式得到权重,并且对它们的Embedding表示通过sum pooling进行加权求和,最后我们把这么一个加权求和得到的向量输入DNN。
这里的精髓有两个,一个是sum pooling可以解决有的用户行为多有的行为少的问题,因为sum到一起了之后长度就固定了。第二个是这里的权重要经过一次softmax运算,这样可以保证所有权重之和为1。
Transformer
第二个要介绍的模型叫做transformer,如果说DIN只是借鉴了NLP当中时序模型的一些处理逻辑和思想的话,那么transformer几乎就是实打实的直接搬运了。
transformer原本是NLP领域的模型,尤其在机器翻译上获得了非常好的效果。它本质上是一个encoder和decoder的结合,也就是一个编码器和解码器的结合。也就是说通过编码和解码的过程,让模型学到两个序列之间的映射或者是内在关系。
它的整个模型结构图如下所示:

上图当中左边一列是编码器,也就是将input通过Multi-Head Attention、Add & Norm等操作最后输入到解码器decoder当中。解码器会对output做同样的编码操作,然后再学习两个编码之间的交叉信息。至于Multi-Head Attention、Add & Norm这些子模块当中究竟进行了什么样的操作,这里就不多做赘述了,有很多复杂的实现细节,大家感兴趣的话可以去阅读论文原文。
正是因为它开创性地对输入和输出都做了编码和解码的操作,使得它在机器翻译的领域大放异彩,获得了非常好的效果。对于推荐领域来说,它不需要预测一个序列,只需要预测当前item的CTR。所以它主要被用来处理用户行为序列这个特征,利用transformer结构对用户行为序列当中的item以及目标item进行encoding和decoding运算,得到一个定长的向量。
这里我们可以看下transformer在美团推荐场景下的应用,我找来了博客里的图。

从图中可以看得出来,它的结构和DIN没有什么本质上的区别,无非是把用户行为序列按照时间长短分成了两个部分。然后多个Embedding归并的方法不再是sum pooling而是transformer而已。
总结
在推荐场景,尤其是电商场景下,用户的历史行为数据至关重要,它能直接反应用户的兴趣以及偏好。尤其是当用户行为序列很长的时候,还能反应出用户历史行为以及消费能力的变化,使得模型的预测能够更加精准。淘宝的首页推荐能做得这么好,总能推出很吸引人耳目一新的商品,和用户行为序列特征的深度挖掘和使用脱不开干系。
DIN和BST(Transformer)这两篇论文分别发表于18和19年,它的作者都是阿里巴巴,应该算是推荐领域比较前沿尖端的论文了。非常推荐给想要从事推荐算法领域的小伙伴。
好了,今天的文章就到这里,感谢阅读,喜欢的话不要忘了三连。
更多精彩推荐
☞混沌、无序、变局?探索之中,《拟合》开启☞深入浅出,机器学习该怎么入门?☞好看又好用的 GUI,你需要这七个 Python 必备库点分享点收藏点点赞点在看
相关文章:

新技术、新思维开创公共安全管理新模式
智慧城市的建设在国内外许多地区正如火如荼的进行中,在为期六天的第十七届中国国际高新技术成果交易会(高交会)上,智慧城市这一话题再次引发观众及城市建设者们的热议。 尤其是高交会期间召开的“2015亚太智慧城市发展高峰论坛”&…

.Net 中字符串性能
Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。在本文中,我需要考虑两个由于使用字符串而产生的问题:临时字符串变量的使用和字符串连接。 Background 每个项目都有需要你为其考虑编码标准的时候。使用 FxCop 是一个好的开…

Lambda表达式可以被转换为委托类型
void Main() { //向Users类中增加两人; List<Users> usernew List<Users>{ new Users{ID1,Name"Jalen",Age23}, new Users{ID12,Name"Administrator",Age32}, }; //接下来就是利用Linq提供的新的方法来进行相关操作; var userslistuser.Wher…

人工干预如何提高模型性能?看这文就够了!
作者 | Preetam Joshi译者 | 吴家帆出品 | AI科技大本营(ID:rgznai100)有一些行业对误报非常敏感,如金融行业,在对信用卡欺诈检测时,如果检测系统将用户的行为错误地分类为欺诈,这将对该金融机构的声誉产生…
一种无需留坑为页面动态添加View方案
在Activity或Fragment页面动态添加View,有其应用场景,比如配合运营在首页动态插入H5活动页(如下图手淘的雪花例示[1]),在页面头部插入通知View等。本文结合ActivityLifecycleCallbacks[2]及DecorView使用,为类似需求提…

边缘加速创新和AI应用,Xilinx推出Kria自适应系统模块产品组合
为了帮助开发者更容易使用FPGA和SoC的功能,赛灵思在开发工具上做了不少的投入,自适应系统模块(SOM)产品组合就是其中之一。 近日,赛灵思宣布推出Kria™自适应系统模块( SOM )产品组合ÿ…

windows计算器
using System; using System.Drawing; using System.Windows; using System.Windows.Forms; using System.Collections; using System.ComponentModel; using System.Data; namespace comput{ /// <summary> /// 这是一个计算器的简单实现。 /// </summary&…

哈夫曼树的构造
[转载于网易博客,具体地址不详] 构造哈夫曼树的过程是这样的 一、构成初始集合 对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F{T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空…

物联网时代全面降临
从智能建筑到零售,英特尔物联网解决方案可以说是华丽丽地惊艳着大家的大脑和眼球,一切的不可能似乎都在朝着可能的方向努力着。在2015 MWC上,英特尔再次用各种神奇的物联网设备告诉大家:物联网时代已经来临。 “半边天”的力量&am…

Linux C++/Java/Web/OC Socket网络编程
一,Linux C Socket网络编程 1.什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设…

ASP.NET抓取其他网页代码
在.Net 平台下,创建一个ASP.Net的程序 1、引用两个NAMESPACE using System.Text //因为用了Encoding类 using System.Net //因为用了WebClient 类 2、整个程序用了三个控件 txtUrl //输入你要获取的网页地址 TEXTBOX控件 txtBody //得到你要获取的网…

特斯拉遇上 CPU:程序员的心思你别猜
作者 | 码农的荒岛求生来源 | 码农的荒岛求生图源 | 视觉中国18世纪流水线的诞生带来了制造技术的变革,人类当今拥有琳琅满目物美价廉的商品和流水线技术的发明密不可分,因此当你喝着可乐、吹着空调、坐在特斯拉里拿着智能手机刷这篇文章时需要感谢流水线…

《算法技术手册》一2.4.6 二次方的算法性能
2.4.6 二次方的算法性能 现在考虑一个类似的问题:两个n位的整数相乘。例2-4展示了使用小学课堂上学过的算法实现的乘法运算,其中n位数字的表示方法与之前的加法一样。 例2-4:mult乘法的Java实现 public static void mult (int[] n1, int[] n2…

如何使用 OpenCV 实现图像均衡?
来源 | 小白视觉志头图 | 下载于视觉中国我们已经练习了很多图像处理——操作图像(精确地说是图像矩阵)。为此,我们探索了图像的均衡方法,以便在一定程度上增强对比度,以使被处理的图像看起来比原始图像更好࿰…

《中国人工智能学会通讯》——1.42 理解情感
1.42 理解情感 安德鲁摩尔认为,人工智能能“感受”人类情感是人工智能研究领域最重要、也最先进的一个方向。扬波利斯基认为,计算机能够理解语言的能力最终会向人和计算机“无缝沟通”的方向发展。 越来越精准的图像、声音和面部识别系统能让计算机更好探…

matlab中help所有函数功能的英文翻译
doc funname 在帮助浏览器中打开帮助文档help funname 在命令窗口打开帮助文档helpbrowser 直接打开帮助浏览器lookfor funname 搜索某个关键字相关函数demo 打开视频教程 转http://blog.renren.com/share/239121107/690877048 里面有些不全的,自己用到的已添加…

C# 静态构造函数
(1)用于对静态字段、只读字段等的初始化。 (2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。 (3)类的静态构造函数在给定应用程序域中…

破解数据流通痛点,华控清交的隐私计算之道
从无序中寻找踪迹,从眼前事探索未来。 正值 IT 黄金十年新开端, CSDN 欲以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,现在推出年度重磅企划栏目——「拟合」,通过对话企业高管大咖,跟踪报…

mac系统添加VSCode到右键菜单(转)
转自:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001470969077294a6455fc9cd1f48b69f82cd05e7fa9b40000 在Mac系统上,Finder选中一个目录,右键菜单并没有“通过Code打开”这个操作。不过我们可以…

在 C# 中通过 P/Invoke 调用Win32 DLL
,.NET Framework 1.0 或 1.1 版类库中存在任何 Windows 所没有的功能限制都不足为怪。毕竟,32 位的 Windows(不管何种版本)是一个成熟的操作系统,为广大客户服务了十多年。相比之下,.NET Framework 却是一个…

xp/2003开关3389指令
开启3389: echo offtitle 开启3389clsrem 开启3389reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f >nulecho.echo 提示你:3389已经开启 关闭3389&…

TIOBE 新榜单:Python 超越 Java 重回第二,Rust 崛起
作者 | 苏宓出品 | CSDN(ID:CSDNnews)TIOBE 官方最新发布了 5 月的编程语言榜单,不妨一起来看一下本月榜单中又有哪些最新的变化呢?Python 重回第二和 4 月相比,本月榜单的 TOP 10 中变化最大的非 Python 与…

Docker编排工具Fig介绍
本文讲的是Docker编排工具Fig介绍,【编者的话】Fig是一个基于Docker的用于快速搭建开发环境的工具,目前Fig团队已经加入Docker公司。Fig通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。Fig可以和Docker一起来…

java调用ffmpeg,mencoder进行视频转换,读取时长等
2019独角兽企业重金招聘Python工程师标准>>> 以前做的一个基于ffmpeg的视频格式转换的程序,现在抽空整理一下,很多地方都是从别的大神那借鉴的,只是把自己的觉得有用的,对别人有帮助的拿出来分享分享,下面是…

数字人民币实现可控匿名交易?产业升级离不开安全可信的“数字底座”
自央行进行数字人民币试点测试工作以来,人们讨论最多的可能是它的便捷性、匿名性。不过,它的意义远不止于人类个体层面。 作为一种面向未来的货币形式,在未来数字经济时代,央行数字人民币的普及无疑将加速全球资产数字化和身份数…

apache+tomcat 搭建负载均衡系统
apachetomcatmod_jk 搭建负载均衡系统。0.os系统采用centos6.8 x64 2.6.32-642.el6.x86_641.首先安装好jdk环境本次采用jdk-8u111-linux-x64.gz jdk和jre的安装目录要不同,否则的话lib目录下没有dt.jar 和tools.jar 要配置好环境变量如下 vi /etc/profile #ad…

从普本到北大:我的跨校跨专业考研经验
首先做一个我考研情况的简介。 经历了2013年考研的混战,据说是史上考研人数顶峰的年份,因为2014改革,不再有自费生之后,人民群众对于所谓学术硕士的需求量激减,继 而投奔价格费用相当,读书年份较少的专业硕…

C#中使用DirectX编程
我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。这里是展示最最最最最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了吧? 准备工作:1.安装了Direc…

40+场面试,100%通过率,我想分享的14条经验
来源 | 陈同学在搬砖头图 | 下载于视觉中国大家好,我是陈同学,首先来一个简单的自我介绍和个人的经历分享。我的本科和硕士均就读于哈工大,在研究生期1年时间内自学操作系统、计算机网络、C、数据结构等,累计学习30本书、500博客文…

云端卫士架构师讲DDoS攻击的智能防御之道
DDoS即分布式拒绝服务攻击,这是一场关乎资源的较量,攻击者通过自己控制的大量僵尸主机,向目标设施(服务器、运营商网络和基础架构等)发起洪水猛兽般的流量型攻击,或是连绵不绝的应用型攻击。 如果将受害者比…