工程实践也能拿KDD最佳论文?解读Embeddings at Airbnb
作者 | Mihajlo Grbovic,Airbnb 资深机器学习科学家
译者 | Lang Yang,Airbnb 工程经理
【导读】本文最早于 2018 年 5 月 13 日发表,主要介绍了机器学习的嵌入技术在 Airbnb 爱彼迎房源搜索排序和实时个性化推荐中的实践。Airbnb 爱彼迎的两位机器学习科学家凭借这项技术的实践获得了 2018 年 KDD ADS track 的最佳论文,本文即是对这篇论文的精华概括。
Airbnb 平台包含数百万种不同的房源,用户可以通过浏览搜索结果页面来寻找想要的房源,我们通过复杂的机器学习模型使用上百种信号对搜索结果中的房源进行排序。 当用户查看一个房源时,他们有两种方式继续搜索:返回搜索结果页,或者查看房源详情页的「相似房源」(会推荐和当前房源相似的房源)。我们 99% 的房源预订来自于搜索排序和相似房源推荐。
在这篇博文中,我们将会介绍 Airbnb 开发和部署的房源嵌入(Listing Embedding)技术,以及如何用此来改进相似房源推荐和搜索排序中的实时个性化。 这种嵌入是从搜索会话(Session)中学到的 Airbnb 房源的一种矢量表示,并可用此来衡量房源之间的相似性。 房源嵌入能有效地编码很多房源特征,比如位置、价格、类型、建筑风格和房屋风格等等,并且只需要用 32 个浮点数。我们相信通过嵌入的方法来做个性化和推荐对所有的双边市场平台都非常有效。
嵌入的背景
将词语表示为高维稀疏向量 (high-dimensional, sparse vectors) 是用于语言建模的经典方法。不过,在许多自然语言处理 (NLP) 应用中,这一方法已经被基于神经网络的词嵌入并将词语用低维度 (low-dimentional) 来表示的新模型取代。新模型假设经常一起出现的词也具有更多的统计依赖性,会直接考虑词序及其共现 (co-occurrence) 来训练网络。 随着更容易扩展的单词表达连续词袋模型 (bag-of-words) 和 Skip-gram 模型的发展,在经过大文本数据训练之后,嵌入模型已被证明可以在多种语言处理任务中展现最佳性能。
最近,嵌入的概念已经从词的表示扩展到 NLP 领域之外的其他应用程序。来自网络搜索、电子商务和双边市场领域的研究人员已经意识到,就像可以通过将句子中的一系列单词视为上下文来训练单词嵌入一样,我们也可以通过处理用户的行为序列来训练嵌入用户操作,比如学习用户点击和购买的商品或浏览和点击的广告。 这样的嵌入已经被用于 web 上的各种推荐系统中。
房源嵌入
我们的数据集由 N 个用户的点击会话 (Session) 组成,其中每个会话定义为一个由用户点击的 n 个房源 id 组成的的不间断序列;同时,只要用户连续两次点击之间的时间间隔超过30分钟,我们就会认为是一个新的会话。 基于该数据集,我们的目标是学习一个 32 维的实值表示方式
来包含平台上所有的房源,并使相似房源在嵌入空间中处于临近的位置。
列表嵌入的维度被设置为,这样的设置可以平衡离线性能(在下一节中讨论)和在线搜索服务器内存中存储向量所需的空间,能够更好地进行实时相似度的计算。
目前有几种不同的嵌入训练方法,在这里,我们将专注于一种称为负抽样 (Negative Sampling) 的技术。 首先,它将嵌入初始化为随机向量,然后通过滑动窗口的方式读取所有的搜索会话,并通过随机梯度下降(stochastic gradient descent)来更新它们。 在每一步中,我们都会将中央房源的向量更新并将其推向正向相关房源的向量(用户在点击中心房源前后点击的其他房源,滑动窗口长度为),并通过随机抽样房源的方式将它从负向相关房源推开(因为这些房源很大几率与中央房源没有关系)。
为简洁起见,我们将跳过具体训练过程的细节,并着重解释为了更好地适用我们的场景而做的一些修改:
使用最终预订的房源作为全局上下文 (Global Context) :我们使用以用户预订了房源(上图中紫色标记)为告终的用户会话来做这个优化,在这个优化的每个步骤中我们不仅预测相邻的点击房源,还会预测最终预订的房源。 当窗口滑动时,一些房源会进入和离开窗口,而预订的房源始终作为全局上下文(图中虚线)保留在其中,并用于更新中央房源向量。
适配聚集搜索的情况:在线旅行预订网站的用户通常仅在他们的旅行目的地内进行搜索。 因此,对于给定的中心房源,正相关的房源主要包括来自相同目的地的房源,而负相关房源主要包括来自不同目的地的房源,因为它们是从整个房源列表中随机抽样的。 我们发现,这种不平衡会导致在一个目的地内相似性不是最优的。 为了解决这个问题,我们添加了一组从中央房源的目的地中抽样选择的随机负例样本集
。
考虑到上述所有因素,最终的优化目标可以表述为
在这里
是正在更新的中心房源的向量
是一对正对
,表示(中心房源,相关房源)元组,其向量在优化中会被互相推近
是一对负对
,表示(中心房源,随机房源)元组,其向量在优化中会被互相推离
是最终被预订的房源,被视为全局上下文并被推向中心房源向量
是一对目的地维度的负例对
,代表(中央房源,来自同一目的地的随机列表)元组,其向量被推离彼此
使用上面所描述的优化程序,我们通过使用超过 8 亿次的搜索点击会话,训练了 Airbnb 上 450 万个有效列表的房源嵌入,从而获得了高质量的房源展示。
冷启动嵌入:每天在 Airbnb 上都有新的房源提供。这些房源在新建时还不在我们的训练数据集中,所以没有嵌入信息。 要为新房源创建嵌入,我们会找到 3 个地理位置最接近、房源类别和价格区间相同的已存在的房源,并计算这些房源嵌入的向量平均值来作为新房源的嵌入值。
嵌入学习到的是什么?
我们用多种方式来评估嵌入捕获到的房源的特征。首先,为了评估地理位置相似性是否被包含,我们对用于学习的嵌入进行了 k 均值聚类 (k-means clustering)。下面的图显示了美国加州产生的 100 个聚类,确认了来自近似位置的房源聚集在一起。 接下来,我们评估了不同类型(整套房源,独立房间,共享房间)和价格范围的房源之间的平均余弦相似性 (cosine similarity) ,并确认相同类型和价格范围的房源之间的余弦相似性远高于不同类型和不同价格的房源之间的相似性。 因此我们可以得出结论,这两个房源特征也被很好的包括在训练好的嵌入中了。
虽然有一些房源特征我们可以从房源元数据中提取(例如价格),所以不需要被学习,但是其他类型的房源特征(例如建筑风格,样式和感觉)很难提取为房源特征的形式。 为了评估这些特性并能够在嵌入空间中进行快速简便的探索,我们内部开发了一个相似性探索工具 (Similarity Exploration Tool),并提供了一个视频进行演示。
视频链接:https://www.youtube.com/watch?v=1kJSAG91TrI&feature=youtu.be
该视频提供了许多嵌入示例,能够找到相同独特建筑风格的相似房源,包括船屋、树屋、城堡等。
线下评估
在对使用了嵌入的推荐系统进行线上搜索测试之前,我们进行了多次离线测试。同时我们还使用这些测试比较了多种不同参数训练出来的不同嵌入,以快速做优化,决定嵌入维度、算法修改的不同思路、训练数据的构造、超参数的选择等。
评估嵌入的一种方法是测试它们通过用户最近的点击来推荐的房源,有多大可能最终会产生预订。
更具体地说,假设我们获得了最近点击的房源和需要排序的房源候选列表,其中包括用户最终预订的房源;通过计算点击房源和候选房源在嵌入空间的余弦相似度,我们可以对候选房源进行排序,并观察最终被预订的房源在排序中的位置。
我们在下图中显示了一个此类评估的结果,搜索中的房源根据嵌入空间的相似性进行了重新排序,并且最终被预订房源的排序是按照每次预定前的点击的平均值来计算,追溯到预定前的 17 次点击。
我们比较了几个嵌入版本:
d32 regular,没有对原始嵌入算法进行任何修改
d32 booking global,被预订房源作为全局上下文
d32 booking global + market negatives,被预订房源作为全局上下文,且加入了中央房源的目的地中抽样选择的随机负例样本作为负值(见上述目标优化公式)
从图中我们可以看出,第三个选项中的被预订房源一直都有较为靠前的排序,所以我们可以得出结论,这个选择要比其它两个更优。
基于嵌入的相似房源推荐
每个 Airbnb 房源详情页面都包含一个「相似房源」的轮播,推荐与当前房源相似并且可以在相同时间段内预订的房源。
在我们测试嵌入前,我们主要通过调用主搜索排序模型来搜索相同位置、价格区间和类型的房源以得出相似房源。
在有了嵌入之后,我们对此进行了 A/B 测试,将现有的相似房源算法与基于嵌入的解决方案进行了比较。在基于嵌入的解决方案中,相似房源是通过在房源嵌入空间中找到 k 个最近邻居 (k-nearest neighbors) 来生成的。 更确切地说,给定学习好了的房源嵌入,通过计算其向量与来自相同目的地的所有房源的向量
之间的余弦相似性,可以找到指定房源
的所有可预订的相似房源(如果用户设置了入住和退房日期,房源需要在该时间段内可预订)。最终得到的
个最高相似性的房源组成了相似房源列表。
A/B 测试显示,基于嵌入的解决方案使「相似房源」点击率增加了21%,最终通过「相似房源」产生的预订增加了 4.9%。
基于嵌入的实时个性化搜索
到目前为止,我们已经看到嵌入可以有效地用于计算房源之间的相似性。 我们的下一个想法是在搜索排序中利用此功能进行一个会话内的实时个性化,目的是向用户更多展示他们喜欢的房源,更少展示他们不喜欢的房源。
为实现这一目标,我们为每个用户实时收集和维护(基于 Kafka)两组短期历史事件:
:用户在过去 2 周内点击的房源 ID
:用户在过去 2 周内跳过的房源 ID(我们将跳过的房源定义为排序较靠前的房源,但用户跳过了此房源并点击了排序较靠后的房源)
接下来,在用户进行搜索时,我们为搜索返回的每个候选房源做 2 个相似性计算:
:候选房源与用户点击过的房源的嵌入空间的相似性(来自 )
具体来说,我们计算来自的目的地级质心之间的相似性并选择最大相似度。 例如,如果
包含来自纽约和洛杉矶的房源,那么这两个目的地中每个目的地的房源嵌入将被平均以形成目的地级别的质心。
:候选房源和用户跳过的房源嵌入空间的相似性(来自
)
上面这两个相似性衡量的结果,会作为之后通过搜索排序机器学习模型对候选房源进行排序时考虑的附加信号。
我们首先会记录这两个嵌入相似性特征以及其他搜索排序特征,来为模型训练创建一个新的标记数据集,然后继续训练一个新的搜索排序模型,之后我们可以通过 A/B 测试来和当前线上的排序模型进行对比。
为了评估新模型是否如预期地学会了使用嵌入相似性特征,我们在下面绘制了它们的部分依赖图。这些图显示了如果我们固定住其他所有的特征值,只考虑我们正在测试的某个特征值,候选房源的排序分数会发生什么变化。
从左边的图中可以看出,较大的值(用户最近点击的房源的相似房源)会导致更高的模型得分。
在右边的图中可以看出,较大的值(用户最近跳过的房源的相似房源,即不喜欢的房源)会导致较低的模型得分。
所以部分依赖图的观察结果证实,特征行为符合我们之前预期的模型将学习的内容。除此之外,当新的嵌入特征在搜索排序模型特征中重要性排序很靠前的时候,我们的离线测试结果显示各项性能指标都有所改进。这些数据让我们做出了进行在线实验的决定,之后该实验取得了成功,我们在 2017 年夏季上线了将嵌入特征用于实时个性化生成推荐的功能。
文本经授权转载:
https://zhuanlan.zhihu.com/p/43295545
本文仅代表作者独立观点,转载请联系原作者。
-【完】-
精彩推荐
◆
BDTC 2018
◆
2018 中国大数据技术大会将于 12 月 6 - 8 日在新云南皇冠假日酒店举行。汇聚超百位国内外实力讲师从学界翘楚到行业一线大拿:
管晓宏:中国科学院院士;
张宏江:源码资本投资合伙人;
张晓东:美国俄亥俄州立大学 Robert M. Critchfield 讲席教授;
陈性元:北京信息科学技术研究院副院长;
周靖人:阿里巴巴集团副总裁;
李浩源:Alluxio 公司创始人&CEO
......
全方位立体解读大数据时代的技术进程,为众技术爱好者奉上一场优质干货盛宴。
推荐阅读
胜过iPhone XS?Google Pixel的“夜视功能”是怎样炼成的
近期最受大家关注的机器学习项目Top10!
干货(附源代码) | 爬取一万条b站评论,分析9.7分的新番凭啥这么火?
程序员如何 Get 分布式锁的正确姿势?
让你崩溃无语的程序命名有哪些?
2年2亿美金,澳本聪耗得起BCH内战又怎样?
刚写完排序算法,就被开除了…
相关文章:
计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)
继续上一节的内容,本节主要讲解三维空间中射线、线段与平面及三维物体的交点及距离的计算,它们在碰撞检测和可见性剔除等应用中是必不可少的。首先给出3D空间下点乘和叉乘的定义与定理的推导,再谈如何应用到程序编码的工作中。 设三维空间中任…

android 抓取native层奔溃
使用android的breakpad工具 使用这个工具需要下载Breakpad的源码,然后进行编译,编译之后会生成两个工具 我们使用这两个工具来解析奔溃的位置。这里我们可以下载已经编译好的工具 下载地址是:链接:http://pan.baidu.com/s/1jIiU5c…

渗透各行各业,这家RPA外企宣布全面进军中国市场
11月15日,全球机器人流程自动化(RPA)领域平台UiPath首次在中国举办UiPath Together年度大会,来自自动化、人工智能和机器学习领域的行业专家,以及来自中国和世界的领先公司的客户与合作伙伴共同参与了此次活动。在此次…

java gettext_JAVA中getText()怎么从一个JTextArea中读出内容?
想先创建一个JTextArea,然后在里面输入内容(几个字母),然后用getText读出里面的内容,可是好像只能是先在JTextArea里面写,然后getText才能读出,而不能先运行,在图形界面的JTex...想先创建一个JTextArea&…

想在SqlDbHelper.cs类中加的垃圾方法
虽然没改写SqlDbHelper.cs类的能力,但好不容易想出来的,放着留个纪念~~~~~/**//// <summary> /// 执行SQL语句,返回第一行,第一列(sea) /// </summary> /// <param na…

java全站_javaWeb_全站编码
目的 : 实现javaweb项目的全站编码问题需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparam…

在Linux系统中修改目录的权限如何恢复
在我工作中的某一天执行了chmod -R 777 /home后我十分后悔,这下不知道该怎么办?心里面很是着急。此时灵机一动问了一下谷哥,终于找到了方法解决此问题,不过前提是要自己做了文件权限备份工作,现在我就给大家讲解一下我…

.Net Framework 3.5 结构图
从打印社用A0或A1的纸打出来,大概10RMB,看起来超爽。 转载于:https://www.cnblogs.com/habin/archive/2008/03/15/1107196.html

关于CVPR 2019投稿的一些感想
作者 | 胡国圣,英国 anyvision 高级研究员,从事深度学习,人脸识别的研究。一年一度的 CVPR 是人工智能的机器视觉方向最重要的学术会议,每年吸引都会全球最顶尖的大学和公司的研究人员投稿,文章如果被录用,…

ORACLE 数据泵导入导出数据
一、摘要 在平常备库和数据库迁移的时候,当遇到大的数据库的时候在用exp的时候往往是需要好几个小时,耗费大量时间。oracle10g以后可以用expdp来导出数据库花费的时间要远小于exp花费的时间,而且文件也要小很多。 二、exp/imp与expdp/impdp区…

java备忘录模式应用场景_图解Java设计模式之备忘录模式
图解Java设计模式之备忘录模式游戏角色状态恢复问题游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。传统方案解决游戏角色恢复传统的方式的问题分析…

一文掌握常用的机器学习模型(文末福利)
AI 科技大本营按:本文节选自微软亚洲研究院机器学习研究团队刘铁岩、陈薇、王太峰、高飞合著的《分布式机器学习:算法、理论与实践》一书。为了让大家更好地理解分布式机器学习,AI科技大本营联合华章科技特别邀请到了本书的作者之一——微软亚…

MYSQL替换语句
update dede_art set titlereplace(title, <IMG border0 srcImages/hot.gif>,);update 表名(比如我案例中的dede_art) set 要修改字段名 replace (要修改字段名,被替换的特定字符,替换成的字符) SELECT * FROM supe_spaceitems where subject like %狐狸天空% update …

phpstudy+phpstorm+debug
文:phpstudyphpstormdebug 一、配置前说明: 1、phpStudy集成了XDebug扩展,所以不用单独下载XDebug。 2、打开XDebug扩展:其它选项菜单 > PHP扩展 > Xdebug 二、配置步骤: 1、phpStudy当前版本: 2、修改php.ini…

java 卖票问题_Java之多线程窗口卖票问题(Thread)
/**** 例子:创建三个窗口卖票,总票数为100张.使用继承Thread类的方式** 存在线程的安全问题,待解决。**/class Window extends Thread{private static int ticket 100;Overridepublic void run() {while(true){if(ticket > 0){System.out…

雷军深情告白:在我心里,武汉大学是全球最好的大学
武汉大学将在 11 月 29 迎来 125 周年校庆,作为杰出校友,小米创始人雷军参加了昨天举行的第五届校友珞珈论坛。现场,雷军对武大深情表白:“马云在几个场合说过,杭州师范大学在他心里是全球最好的大学,没有之…

java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方。往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博…

linux proc
/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。 /proc/cmdline 这个文件给出了内核启动的命令行。 /proc/cpuinfo 这个文件提供了有关系统CPU的多种信息。 /proc/d…

专访英特尔AIPG全球研究负责人Casimir Wierzynski:物理学、隐私和大脑将根本性塑造AI
出品| AI 科技大本营 在 11 月 14 日至 15 日在北京召开的英特尔人工智能大会(AIDC)上,英特尔人工智能产品事业部(AIPG)全球研究负责人 Casimir Wierzynski 发表了主题为《人工智能研究——物理学、隐私和大脑》的演讲…

微软OOXML申请国际文档标准已获通过 中国投反对票
51CTO.com北京时间3月28日中午通过消息灵通人士获悉,微软新一代文档标准OOXML已经获得国际标准化组织(ISO)的通过。中国依然投反对票。 ISO共有104个成员,其中包括41个技术能力强、参与标准化活动多的“P成员”。若微软文档标准想…

java中的匿名类方法覆盖_Java技巧:用匿名类来实现简化程序调试
Java技巧:用匿名类来实现简化程序调试在Java中,匿名类(Anonymous inner classes)多用来处理事件(event handle)。但其实,它们对于debug也很有帮助。本文将介绍如何利用匿名类来简化你的debug。我们该如何调试那些非自己源码的方法调用呢&…

记录第一次在egret项目中使用Puremvc
这几天跟着另一个前端在做一个小游戏,使用的是egret引擎和puremvc框架,这对于我来说还是个比较大的突破吧,特此记录下。 因为在此项目中真是的用到了mvc及面向对象编程,值得学习 记录第一次在egret项目中使用Puremvc: …

使用CSS制作圆角效果
Web2.0中,圆角效果是很常见的,以前都是用图片来模仿,现在直接用css就能实现,例子代码如下 Html代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> &…

知识图谱升温之势已现,不要错失下一个AI风口
近年来,随着大家对高级认知能力的积极探索,知识图谱因为表达能力强,扩展性好,并能兼顾人类认知与机器自动处理,引起了学术界、工业界以及政府部门的高度关注。 最先被大家熟知的应用领域应属搜索引擎,为了…

干货 | 谷歌BERT模型fine-tune终极实践教程
作者 | 奇点机智从11月初开始,Google Research就陆续开源了BERT的各个版本。Google此次开源的BERT是通过TensorFlow高级API—— tf.estimator进行封装(wrapper)的。因此对于不同数据集的适配,只需要修改代码中的processor部分,就能进行代码的…

java简介 ppt 精_《JAVA》5选择结构精篇课件.ppt
《JAVA》5选择结构精篇课件选 择 结 构 if 语句 if – else语句 Switch语句 块作用域语句又被称为复合语句,其格式为:用一对花括号将若干条语句括起来,目的是从语法上可以将多条语句解释成一条语句。 { int temp; temp a; a b; …

UPDATE STATISTICS 有何妙用?
txlicenhe 马可 一直没有关注它,今天刚学到的一招,还没彻底弄清楚。 情况是这样,有一个视图,用到了好几个表,其中一个表改了一些资料,在前台操作时总是超时过期(前台设置超时时间不长 60s&#…

js with用法
1)简要说明 with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。要给对象创建新的属性,必须明确地引用该对象。 2)语法格式 with(object instance) { //代码块 } 有…

大数据时代,谁的眼神锁定你?
数据时代当前,欢迎来到楚门的世界。双十一余韵未歇,刚处理完一波售后及退件等“剁手后遗症”的各方人马也已经为再战双十二做好了准备。截至 12 日零点,天猫双十一成交额达 2135 亿元。与此同时,据国家邮政局监测数据显示…

Java类Demo中存在_Java中的数据类型转换
先来看一个题:Java类Demo中存在方法func0、func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( )public class Demo{float func0(){byte i1;return i;}float func1(){int i1;return;}float func2(){short i2;return i…