如何评价Airbnb的Real-time Personalization获得2018 kdd最佳论文?

论文原标题: Real-time Personalization using Embeddings for Search Ranking at Air…
关注者
1,159
被浏览
102,520

11 个回答

这篇论文是我最近觉得非常值得一读的,写了篇总结放在了专栏,但感觉还是提问的形式更有助于讨论。原文如下:

Airbnb这篇论文拿了今年KDD best paper,和16年google的W&D类似,并不fancy,但非常practicable,值得一读。可喜的是,据我所知,国内一线团队的实践水平并不比论文中描述的差,而且就是W&D,国内也有团队在论文没有出来之前就做出了类似的结果,可见在推荐这样的场景,大家在一个水平线上。希望未来国内的公司,也发一些真正实用的paper,不一定非要去发听起来fancy的。

自从Word2vec出来后,迅速应用到各个领域中,夸张一点描述,万物皆可embedding。在NLP中,一个困难是如何描述词,传统有onehot、ngram等各种方式,但它们很难表达词与词之间的语义关系,简单来讲,即词之间的距离远近关系。我们把每个词的Embedding向量理解成它在这个词表空间的位置,即位置远近能描述哪些词相关,那些词不相关。

对于互联网场景,比如电商、新闻,同样的,我们很难找到一个合适表达让计算机理解这些实体的含义。传统的方式一般是给实体打标签,比如新闻中的娱乐、体育、八卦等等。且不说构建一个高质量标签体系的成本,就其实际效果来讲,只能算是乏善可陈。类似NLP,完全可以将商品本身或新闻本身当做一个需要embedding的实体。当我们应用embedding方案时,一般要面对下面几个问题:

  1. 希望Embedding表达什么,即选择哪一种方式构建语料
  2. 如何让Embedding向量学到东西
  3. 如何评估向量的效果
  4. 线上如何使用

下面我们结合论文的观点来回答上面问题,水平有限,如有错误,欢迎指出。

希望Embedding表达什么

前面我们提了Embedding向量最终能表达实体在某个空间里面的距离关系,但并没有讲这个空间是什么。在NLP领域,这个问题不需要回答,就是语义空间,由现存的各式各样的文本语料组成。在其他场景中,以电商举例,我们会直接对商品ID做Embedding,其训练的语料来至于用户的行为日志,故这个空间是用户的兴趣点组成。行为日志的类型不同,表达的兴趣也不同,比如点击行为、购买行为,表达的用户兴趣不同。故商品Embedding向量最终的作用,是不同商品在用户兴趣空间中的位置表达。

很多同学花很多时间在尝试各种word2vec的变种上,其实不如花时间在语料构建的细节上。首先,语料要多,论文中提到他们用了800 million search clicks sessions,在我们尝试Embedding的实践中,语料至少要过了亿级别才会发挥作用。其次,session的定义很重要。word2vec在计算词向量时和它context关系非常大,用户行为日志不像文本语料,存在标点符合、段落等标识去区分词的上下文。

举个例子,假设我们用用户的点击行为当做语料,当我们拿到一个用户的历史点击行为时,比如是list(商品A, 商品B,商品C,商品D),很有可能商品B是用户搜索了连衣裙后点的最后一个商品,而商品C是用户搜索了手机后点击的商品,如果我们不做区分,模型会认为B和C处以一个上下文。

具体的session定义要根据自身的业务诉求来,不存在标准答案,比如上面的例子,如果你要做用户跨兴趣点的变换表达,也是可以的,论文中给出了airbnb的规则:

A new session is started whenever there is a time gap of more than 30 minutes between two consecutive user clicks.

值得一提的是,论文中用点击行为代表短期兴趣和booking行为代表长期兴趣,分别构建Embedding向量。关于长短期兴趣,业界讨论很多,我的理解是长期兴趣更稳定,但直接用单个用户行为太稀疏了,无法直接训练,一般会先对用户做聚类再训练。

如何让Embedding向量学到东西

模型细节

一般情况下,我们直接用Word2vec,效果就挺好。论文作者根据Airbnb的业务特点,做了点改造,主要集中在目标函数的细节上,比较出彩。先来看一张图:

主要idea是增加一个global context,普通的word2vec在训练过程中,词的context是随着窗口滑动而变化,这个global context是不变的,原文描述如下:

Both are useful from the standpoint of capturing contextual similarity, however booked sessions can be used to adapt the optimization such that at each step we predict not only the neighboring clicked listings but the eventually booked listing as well. This adaptation can be achieved by adding booked listing as global context, such that it will always be predicted no matter if it is within the context window or not

再看下它的公式,更容易理解:

注意到公式的最后一项和前面两项的区别,在累加符号的下面,没有变D限制。我的理解是,word2vec的算法毕竟是非监督的,而Airbnb的业务最终是希望用户Booking,加入一个约束,能够将学到的Embedding向量更好的和业务目标靠近。后面还有一个公式,思路是类似的,不再赘述。

这个思路也可以理解成另一种简单的多目标融合策略,另一篇阿里的论文也值得一读,提出了完整空间多任务模型(Entire Space Multi-Task Model,ESMM)来解决。

数据稀疏是核心困难

Word2vec的算法并不神奇,还是依赖实体出现的频次,巧妇难为无米之炊,如果实体本身在语料中出现很少,也很好学到好的表达。曾经和阿里的同学聊过一次Embedding上线效果分析,认为其效果来源于中部商品的表达,并不是大家理解的长尾商品。头部商品由于数据量丰富,类似i2i的算法也能学的不错,而尾部由于数据太稀疏,一般也学不好,所以embedding技术要想拿到不错的收益,必须存在一批中部的商品。

论文中也提到,他们会对entity做个频次过滤,过滤条件在5-10 occurrences。有意思的是,以前和头条的同学聊过这个事情,他们那边也是类似这样的频次,我们这边会大一点。目前没有做的很细致,还未深究这个值的变化对效果的影响,如果有这方面经验的同学,欢迎指出。

另一个方法,也是非常常见,即对稀疏的id做个聚类处理,论文提了一个规则,但和Airbnb的业务耦合太深了,其他业务很难直接应用,但可以借鉴思想。阿里以前提过一种sixhot编码,来缓解这个问题,不知道效果如何。也可以直接hash,个人觉得这个会有损,但tensorflow的官网教程上,feature columns部分关于Hashed Column有一段话说是无损的:

At this point, you might rightfully think: "This is crazy!" After all, we are forcing the different input values to a smaller set of categories. This means that two probably unrelated inputs will be mapped to the same category, and consequently mean the same thing to the neural network. The following figure illustrates this dilemma, showing that kitchenware and sports both get assigned to category (hash bucket) 12:
As with many counterintuitive phenomena in machine learning, it turns out that hashing often works well in practice. That's because hash categories provide the model with some separation. The model can use additional features to further separate kitchenware from sports.

离线如何评估效果

向量评估的方式,主要用一些聚类、高维可视化tnse之类的方法,论文中描述的思路和我的另一篇文章zhuanlan.zhihu.com/p/35比较像。当Airbnb的工具做的比较好,直接实现了个系统来帮助评估。

值得一提的是,论文还提出一种评估方法,用embedding向量做排序,去和真实的用户反馈数据比较,直接引用airbnb知乎官方账号描述:

更具体地说,假设我们获得了最近点击的房源和需要排序的房源候选列表,其中包括用户最终预订的房源;通过计算点击房源和候选房源在嵌入空间的余弦相似度,我们可以对候选房源进行排序,并观察最终被预订的房源在排序中的位置。


上图可以看出,d32 book+neg的效果最好。

线上如何用

论文中反复提到的实时个性化并不难,只要支持一个用户实时行为采集的系统,就有很多种方案去实现实时个性化,最简单就是将用户最近的点击序列中的实体Embedding向量做加权平均,再和候选集中的实体做cosine距离计算,用于排序。线上使用的细节比较多,论文中比较出彩的点有两个:

多实体embedding向量空间一致性问题

这是一个很容易被忽视的问题,当需要多个实体embedding时,要在意是否在一个空间,否则计算距离会变得很奇怪。airbnb在构建long-term兴趣是,对用户和list做了聚类,原文如此描述:

To learn user_type and listinд_type embeddings in the same vector space we incorporate the user_type into the booking sessions.

即直接将二者放在一个语料里面训练,保证在一个空间。如此,计算的cosine距离具有实际的意义。

Negative反馈

无论是点击行为还是成交行为,都是用户的positive反馈,需要用户付出较大的成本,而另一种隐式的负反馈,我们很少用到(主要是噪音太强)。当前主流的个性化被人诟病最多的就是相似内容扎堆。给用户推相似内容,已经是被广泛验证有效的策略,但我们无法及时有效的感知到用户的兴趣是否已经发生变化,导致损坏了用户体验。因此,负反馈是一个很好的思路,airbnb给出了skipped listing_ids的策略。

比较可惜的是,我们目前没有在蘑菇街的场景拿到这个负反馈的收益,如果有同学在相关方面有经验,欢迎来指导。

推荐系统的两大任务“记忆”与“扩展”。在我看来,扩展性就来源于将大量的id/categorical类特征进行embedding。原来的id/categorical特征只能进行精确匹配(如:商品有标签A,用户也有标签A),而embedding使id/categorical特征向量化,向量之间就可以计算夹角,变原来的“精确匹配”为“模糊查找”(比如论文中的K近邻)。


以上回答了为什么要在推荐系统中引入embedding。接下来,如何计算这一embedding,在我看来,就分为两大流派:

  • 有监督学习,end-to-end。embedding作为优化变量,随机初始化,在优化最终logloss的过程中,得到有意义的embedding作为“副产品”。个人感觉,这一流派是主流,Youtube对video_id、Wide&Deep对app_id、Deep Interest Network对商品id的embedding都是这一思路。
  • 无监督学习,两步走。以Item2vec: Neural Item Embedding for Collaborative Filtering为代表。
    • 第一步,就是简单套用word2vec的思路,在电商场景,就将word2vec中的句子换成购物车,将单词换成商品;新闻推荐场景中,将句子换成session,将单词换成文章。再直接调word2vec算法,就得到商品、文章的embedding向量。
    • 第二步,这些embedding向量,可以用于召回,可以用于第一类方法的embedding矩阵的初值,也可以当特征喂入其他模型。原谅我读书少,感觉这类方法近年来遇冷,不怎么受关注

从这个角度来看,Airbnb的这篇文章算是对第二类方法的一次复兴。第一次读此文的印象,感觉平淡无奇,就是套用word2vec算法,再稍做修改;第二篇再读此文,才感觉到作者的匠心独具,初读时认为的“小改动”,使“无监督学习embedding”方法摆脱了简单套用word2vec的老套路。尽管本质上还是“无监督学习”,但是作者巧妙将“成功预订”、“host拒绝”这些重要的反馈融入算法,以达到“有监督”的效果

这一将“业务逻辑”融入“机器学习算法”的过程,反映了作者对“业务逻辑”与“算法”两方面的深刻理解。这种基于对业务逻辑的深度理解,再把业务目标反映到算法中的能力,才是目前浮躁的数据科学行业最缺乏的,也是这篇文章的精华所在,也是我们读者应该从这篇文章中学到并举一反三的。

所以,整篇文章读下来,给我留下深刻印象的就是以下这些“业务逻辑”与“算法”的结合点

  • 业务逻辑:Airbnb是一个双方市场,推荐listing给user时,不仅要考虑user的喜好,还要考虑到host拒绝的因素,才能提升“预订成功率”。
  • 解决方案:将host“明确拒绝”也作为一个“negative word”加入word2vec训练集中


  • 业务逻辑:数据稀疏性,大量用户只预订过一次,大量listing被预订小于5次
  • 解决方案:根据业务逻辑,将user_id聚合成user_type,将listing_id聚合成listing_type。


  • 业务逻辑:word2vec毕竟是非监督的,怎样融入提升“预订率”这一业务目标
  • 解决方案:在booked session中,将最终预订的listing增加为global context,无论是否在滑窗中都要参与学习。这样一来,两个listing_id相似,不仅因为所处的点击序列相似,而且还会因为导致预订相同listing而相似。而预订相同listing比点击是一个更强、更有意义的信号,训练得到的embedding对提升“预订率”也更有意义


  • 业务逻辑:word2vec中的negative sampling是随机的,而点击序列中的context都来自同一城市,导致数据集有bias
  • 解决方案:专门增加一个与central listing来自同一个城市的负样本集


将整篇文章读完后,还有两个小疑问:

第一,如前所述,本文的embedding方法属于“无监督学习”。通过加入“预订成功”、“host拒绝”这样的强反馈信号来指导无监督学习,本文方法显然比以往简单套用word2vec的方法更具备优势,在Related Work一节也有论述。但是,与第一类“将embedding作为优化变量,有监督学习”的方法相比,Airbnb的这套算法有何优势,文中却没有涉及

以我这样的局外人的揣度,以Airbnb的数据量、计算能力,实现第一类算法,应该也能获得不错的embedding向量。这些“副产品”也同样可以用于召回相似listing。至于稀疏问题,也同样可以由聚合成listing_type/user_type来解决。而且,如果用第一类算法,加入host perference, host rejection这样的强反馈信号,也更加方便。


我很想知道Airbnb团队当初选择技术路线的思路,为什么会选择了“无监督学习”的思路,而没有随大流地选择“有监督学习”的思路。


第二,本文的思路还是基于word2vec。word2vec之所以能够成立,是因为人类语言本身就有语序问题,相同的三个字“我吃饭”就有意义,“我饭吃”就没有意义。但是clicked session, booked session中,顺序有那么重要吗?

如果两个listing同处一个clicked session,但是间隔超过了滑窗的范围,难道就没有相关性了吗?显然相关性还是存在的。在我看来,增加booked listing作为global context参加每个滑窗的学习,就是为了弥补套用word2vec而不得不强调“相邻”而带来的信息损失

另外,推荐系统天生就有两个bias,一个是position bias,另一个是向用户展示的商品列表是由上一版本的推荐系统决定的。如果“点击顺序”那么重要,那么算法又该如何克服这两个bias。


如果有可能,以上两个问题,还希望得到Airbnb官方团队的解答。再次感谢Airbnb团队的分享,Good Job !!!

------------------------- 分割线 --------------------------

关于第一个问题,我在Airbnb的新文<Applying Deep Learning To Airbnb Search>中找到了官方答案。简单来说,就是:有监督学习的经典思路,Airbnb尝试了,但是效果不好


在<Applying Deep Learning To Airbnb Search>中的3.1节,描述了Airbnb用“有监督学习”思路训练list embedding。结果是比较容易过拟合。Airbnb在文中的解释是,数据太稀疏,有些embedding在训练集中出现的次数太少。感觉这个解释不是很充分,word2vec也同样面临着“罕见词”训练不好的问题。而且,在“有监督学习”中,同样可以将user/listing合并成user_type/listing_type来降低“稀疏性”。


另外,Airbnb还尝试了阿里的Entire Space Multi-Task Model的多任务模型,即共享底层embedding,同时预测booking和long click。为了减轻click bait的影响,对于long click样本,还用“页面停留时长”对样本做了加权。实验结果是大幅增加用户页面停留时长,而对于booking没有太大的影响。

Airbnb给出的解释是:新闻、视频网站中,用户点击后长时间停留,代表用户真心喜欢被推荐的物品;但是在Airbnb中,用户长时间停留,可能是由于被高大上的listing吸引,点击过后长时间浏览来羡慕人家的生活;也有可能是listing的描述写得太长、太幽默而让用户多读几遍;......,长停留并不意味着预订。总之,Airbnb认为在他们独特的市场中,long click与booking肯定是相互信赖的,但是如何用模型来解决click bait,仍然是他们尚未解决的问题