热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Airbnb深度学习搜索引擎实践-模型发展历程

http://www.semocean.com/airbnb%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e5%ae%9e%e8%b7%b5%ef%bc%8d%e6%a8%a1%e5%9e%8b%e5%8f%91%e5%b1%95%e5%8e%86%e7%a8%8b/

 

Applying Deep Learning for Airbnb Search engine

该文章是KDD 2019上发表的Airbnb的搜索引擎主要算法的文章,主要介绍了Airbnb算法的演进历程。还是Airbnb一贯的朴实无华的风格:不在乎有多少创新,更多是工业界结合业务上的算法工程,该文章很难的是文章中不仅介绍了Airbnb的算法,以及使用该算法的出发点和考虑,同时还记录了中间的各种坑,甚至一些失败的实验,真的是经验的无私分享,写作手法更像各大厂内网的技术总结分享文章。对于广大研发有较强的借鉴作用。
再具体到技术细节,Airbnb的场景是低频,且作为平台需要同时考虑需求侧(用户/网民)同时还要考虑供给侧(Airbnb中是民宿),另外民宿预订有很强的地理位置属性,所以文中的算法对于低频场景,LBS场景的搜索推荐都有较强的借鉴意义。低频场景例如飞猪,携程,马蜂窝的酒店,旅游预订;LBS属性例如Google Map,百度地图,高德地图等场景。

Abstract

搜索引擎一直都是airbnb成功的重要的因素,之前的实现主要是使用树模型来实现核心的算法,但是出现了瓶颈,所以后来airbnb就使用深度学习来优化其搜索引擎。
本文不会针对深度学习的算法进行创新,更多的是在使用深度学习的构建核心引擎中的一些细节的探讨。bon voyage

Introduction

搜索场景是airbnb的重要的场景,最开始系统使用的是人工的打分函数。之后使用gbdt进行特征的组合,这是一个比较大的进步,并且经过了比较多的迭代。现在开始转移到深度学习。

Airbnb深度学习搜索引擎实践-模型发展历程

图:搜索session示例
典型的搜索引擎,在用户看了一系列的listing(相当于其它文章中的item)之后,完成了booked的工作。
系统运行中间的日志都被记录下来,之后使用离线的方式训练新的模型模型,尽量的将booked的listing的排序排到最靠前。之后在线上使用ab test的方式进行验证。
本文叙述的方式是从feature engineering和system engineering的方式进行的介绍。最后再对内容进行回顾。

Model Evolution

模型的迭代也是一步接一步的。深度学习是顶峰的表现,是最终逐步迭代后的结果,过程中也走了很多弯路。
图:展示了在各个模型迭代上离线ndcg的提升幅度:

Airbnb深度学习搜索引擎实践-模型发展历程

 

图:展示了各个模型在线转化的相对提升幅度:

Airbnb深度学习搜索引擎实践-模型发展历程

 

Dustinsea: 可以看到,在全面DeepNN前,就已经拿到了比较多的受益,DeepNN让效果更上一层楼

第一阶段:SIMPLE NN

论文12提到don’t be a hero,但是我们一开始就从复杂的nn模型出发,到最后只是得到了复杂结构,还有花时间的循环。
在nn上也也花了比较多的时间,gbdt模型输出作为nn模型的输入。该过程最重要的贡献,就是把特征的pipeline给建立起来。

第二阶段:LAMBDARANK NN

使用lambda rank,直接对离线的ndcg进行优化。

第三阶段:GBDT/FM NN

gbdt作为另外一条线,在进行优化中间发现一个有意思的现象:从指标上gbdt的效果和nn的效果比较类似,但是他们排序出来的结果是不一样的。受这一现象的启发,将gbdt/fm和nn的架构进行了融合,FM的最终输出直接作为nn的特征,同时树模型的节点index作为nn的特征输入(和2014年facebook发表论文中gbdt+lr的思路异曲同工)。模型结构图如下:

Airbnb深度学习搜索引擎实践-模型发展历程

图:NN和GBDT模型融合方法示例

第四阶段:DEEP NN

模型
最终使用具有两个隐藏层的nn。配置如下:

 

 

特征
大部分的特征都直接进行输入,没有进行太多的feature enginering,少部分的特征作为其他模型的输出,会进行特殊的处理。
price特征:使用模型进行处理。
similarity features:使用功现的embedding进行处理。
使用17亿样本进行训练,以ndcg作为评估指标的情况下,能够达到收敛的效果。

Airbnb深度学习搜索引擎实践-模型发展历程

 

在评估过程中一个非常困难的点就是我们如何评判模型的结果和人的认知评判的结果的效果的对比。在图像中人是可以作为一个评判标准的绝对增值进行评价的,但是在我们的数据里边却看不出来绝对的增值,因为这些绝对的因素都是隐藏的比较深的。这和video或者audio领域不一样。

失败的模型

一般大家在叙事的时候都是在讲成功的案例,但这其实只是整个过程的很少的一部分,下面就向大家介绍一下失败的尝试,因为失败的尝试比较多,所以这个地方挑了两个模型。

Airbnb深度学习搜索引擎实践-模型发展历程

第一种失败尝试:直接使用listing ids embedding

在nlp中或者电商视频推荐中,对于item的embedding使用是比较成熟的,并且证明效果比较好。但在airbnb的环境中,因为数据量比较稀少,就算最火的民宿一年也只能有365个预定,更多的民宿数据都是非常少的,所以很难学出稳定的embedding,基本上都是Over fitting,所以listing ids使用会失败。
Dustinsea:所以Airbnb进行embedding的时候,更多是对人群/POI群进行embedding,而非用户/单个POI进行embedding.

Airbnb深度学习搜索引擎实践-模型发展历程

 

图:增加listing id embedding后,over fitting问题明显严重

第二种:multi-task learning

多任务是现在很多推荐搜索场景中常用的技术,多任务是现在比较fancy的技术,听起来也是make sense的。Airbnb也进行了尝试。
进一步讲,在文中尝试的方向:是认为浏览时间比较长的listing应该会和booked行为有比较强的相关性。所以进行了多任务的学习,在学习的过程当中有两个子任务,一个是booked的子任务,另外一个是预估用户浏览时长的子任务。
多任务模型在低层共用embedding,在上层分成两个任务,并且在loss function中将booked的样本进行加权。线上使用的时候只使用booked子任务进行预估。
但最终线上的结果是用户的浏览是浏览市场的确变长,但是预定基本上没有什么变化,经过分析可能的原因如下
第一是推荐出来的内容描述会比较长,或者描述中带有一些比较独特的东西,或者甚至是比较搞笑,这样用户浏览的时间就变成了,但是并不会影响到对应的预定。
第2个可能的原因,是模型倾向于推荐价格比较高的listing,这样用户会进行浏览,但是最后也没有预定。所以多任务是一个比较有挑战的方向,需要继续进行研究。


Dustinsea: multi-task learning是大趋势,从理论上也是符合逻辑的,但真正应用的时候,需要的投入也比较多,包括对于问题的细致分析,所以可以作为系统成熟阶段需要突破的手段,但在系统的拓荒阶段,不一定是很好的选择。

Airbnb深度学习搜索引擎实践-模型发展历程

 

图:下单率分布


特征工程
传统的feature engineering需要很多的时间以及经验,并且中间有很多的tricks才能提升目前的效果,但是这些经验和方法不一定还适用于最新的变化的数据(因为用户的行为是动态变化的,之前人工feature engineering的人工经验知识可能已经迁移)
nn的一个优势就是它能对特征进行***的组合,不过我们还是需要一部分的特征工程,只是我们的特种工程不再聚焦在我们选择以及如何进行特征变化,更多的是对数据进行统一的预处理,这样nn能够更正确的对特征进行转换和组合。
feature nomalization
gbdt值和特征的相对顺序有关,但是nn会和特征的值有关,所以进行特征的规范化。

Airbnb深度学习搜索引擎实践-模型发展历程

图:特征归一化方法
第1种相对进行z score的处理
第2种,如果分布符合指数分布,则进行log的处理
feature distribution

从特征的角度保证特征是平滑的,是比较重要的。因为如果一般特征不平衡,都是存在问题。检查特征是否平滑,有以下好处:
检查数据种是否有bugs
检查如何进行特征变换,例如文中将lng/lat转变为用户和listing的distance

 

图:经纬度特征分布

 

超参数

dropout: 一般dropout在nn中都是防止过你和的标配,但在该场景中效果不佳,文中给出的解释是dropout比较像数据增强,相当于引入噪音。文中后续引入了人工构造的噪音, 线下ndcg有1%提升,但线上无变化
initialization:使用xavier initialization方法,比参数默认置0好
Optimizer:文中最后使用的是LazyAdamOptimizer,因为实验中使用Adam发现效果很难再优化
文中最后还是推荐dnn是一个方向,因为能够让大家很大程度上摆脱特征工程,而站到更高的角度上去考虑优化目标的问题。但是整个过程也是比较耗时的,作者认为他们DNN的工作也才刚刚开始。

Airbnb深度学习搜索引擎实践-模型发展历程

 

图:发展历程


 


推荐阅读
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
author-avatar
宇宇宇你同行
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有