摘要
搜索排名和推荐系统是大部分互联网公司至关重要的基本问题,包括网络搜索引擎、内容发布网站和市场平台。然而,尽管有一些共同的特点,但在这个领域并不存在一个统一的解决方案。鉴于需要进行排名、个性化和推荐的内容有很大差异,每个市场都有某种程度上的独特挑战。相应地,在Airbnb,一个短租市场,搜索和推荐问题是相当独特的,它是一个双面市场,在一个用户很少两次消费同一物品的世界里,一个房源在一定的日期内只能接受一个客人,我们需要对主人和客人的喜好进行优化。在本文中,我们描述了我们开发和部署的房源和用户嵌入技术,用于搜索排名和类似房源推荐中的实时个性化,这两个渠道推动了99%的转换。这些嵌入模型是专门为Airbnb市场定制的,能够捕捉客人的短期和长期兴趣,提供有效的房屋列表推荐。我们对嵌入模型进行了严格的线下测试,随后在全面部署到生产中之前进行了成功的在线测试。
引言
在过去的十年中,搜索架构通常基于经典的信息检索,但是已经看到机器学习在其各个组成部分中越来越多的应用[2],特别是在搜索排名中,根据被搜索的内容类型,搜索排名往往具有挑战性的目标。这一趋势背后的主要原因是可以收集和分析的搜索数据量的增加。收集到的大量数据为使用机器学习提供了可能性,它可以根据以前的搜索为特定的用户提供个性化的搜索结果,并推荐与最近消费的内容相似的内容。
任何搜索算法的目标都会根据实际的平台而有所不同。有些平台的目标是提高网站的参与度(例如被搜索的新闻文章的点击率和时间),而其他平台的目标是最大限度地提高转化率(例如购买被搜索的商品或服务),在双面市场的情况下,我们往往需要为市场的双方,即卖家和买家优化搜索结果。双面市场在许多现实世界的应用中已经成为一种可行的商业模式。特别是,我们已经从社会网络范式转移到了有两类不同参与者的网络,代表着供应和需求。示例行业包括住宿(Airbnb)、共享汽车(Uber、Lyft)、网上商店(Etsy)等。可以说,这些类型的市场的内容发现和搜索排名需要满足生态系统的供需双方才能发展和繁荣。
就Airbnb而言,显然需要为房东和客人优化搜索结果,也就是说,给定一个带有地点和旅行日期的输入查询,我们需要将那些在地点、价格、风格、评论等方面对客人有吸引力的房源排名靠前,同时,在旅行持续时间和提前天数方面与房东的偏好相匹配。此外,我们需要检测那些可能会因为差评、宠物、逗留时间、团体大小或任何其他因素而拒绝客人的房源,并将这些房源的排名降低。为了实现这一目标,我们采用了学习排名的方法。具体来说,我们将问题表述为对预订成功看作正样本和拒绝预定看作负样本的成对回归,我们使用 Lambda Rank [4] 模型的修改版本对其进行优化,该模型共同优化市场双方的排名。
由于客人在预订前通常会进行多次搜索,即在搜索过程中点击多个房源并联系多个房东,我们可以利用这些会话中的信号,即点击、房东联系等来实现实时个性化,目的是向客人展示更多的类似于我们认为他们在搜索过程中喜欢的房源。同时,我们可以利用负面信号,例如对于高排名的房源的跳过,向客人展示更少的类似于我们认为他们不喜欢的房源。为了能够计算客人互动过的房源和需要排名的候选房源之间的相似性,我们建议使用房源嵌入,即从搜索会话中学习房源的低维向量表示。我们利用这些相似性为我们的搜索排名模型创建个性化功能,并为我们的类似房源推荐提供支持,这两个平台推动了爱彼迎 99% 的预订。
除了使用即时用户行为的实时个性化,如点击,可以作为短期用户兴趣的代理信号,我们还引入了另一种对预订进行训练的嵌入,以便能够捕获用户的长期兴趣。由于旅行业务的性质,用户平均每年旅行 1-2 次,预订是一个稀疏信号,大部分用户只有单次预订。为了解决这个问题,我们建议在用户类型的层面上训练嵌入,而不是特定的用户ID,其中类型是通过基于多对一规则的映射,利用已知的用户属性来确定。同时,我们在与用户类型嵌入相同的向量空间中学习列表类型嵌入。这使我们能够计算正在进行搜索的用户的用户类型嵌入和需要进行排名的候选列表的列表类型嵌入之间的相似性。
与以前发表的关于网络个性化嵌入的工作相比,本文的新贡献在于:
- 实时个性化 之前大多数关于使用嵌入的个性化和项目推荐的工作[8, 11]都是通过离线形成用户-项目和项目-项目推荐表,然后在推荐时读取它们来部署到生产中。 我们实施了一个解决方案,将用户最近与之互动的项目的嵌入以在线方式结合起来,计算与需要排名的项目的相似度。
- 调整训练算法以适应集中搜索的需要 与网络搜索不同,旅游平台上的搜索往往是集中的,用户经常只在某个区域内搜索,例如巴黎,而很少在不同的区域内搜索。我们调整了嵌入训练算法,以便在进行负采样时考虑到这一点,从而更好地捕捉到区域内列表的相似性。
- 用户转化作为全局上下文 我们认识到点击会话的重要性,在我们的案例中,点击会话最终会产生转化,也就是预订。在学习列表嵌入时,我们将预订的列表视为全局上下文 ,在窗口移动的过程中始终被预测。
- 用户类型的嵌入 之前关于训练用户嵌入以捕捉其长期兴趣的工作[6, 27]为每个用户训练一个单独的嵌入。当目标信号是稀疏的,没有足够的数据为每个用户训练一个好的嵌入表示。更不用说为每个用户存储嵌入以进行在线计算,需要大量的内存。出于这个原因,我们建议在用户类型的层面上训练嵌入,具有相同类型的用户组将有相同的嵌入。
- 房东拒绝预定作为显式的负样本 为了减少导致拒绝的推荐,我们在用户和列表类型的嵌入中编码房源主人偏好信号,在训练中把房源主人的拒绝视为明确的负样本。
对于短期兴趣的个性化,我们使用超过8亿次的搜索点击会话来训练列表嵌入,从而得到高质量的列表表示。我们在真实的搜索流量上使用了广泛的离线和在线评估,这表明将嵌入特征添加到排名模型中会带来显著的预订收益。除了搜索排名算法,房源嵌入也被成功测试并推出,用于类似的房源推荐,它们比现有算法的点击率(CTR)高出了20%。
为了实现长期的兴趣个性化,我们使用5000万用户的预订房源序列来训练用户类型和房源类型嵌入。用户和房源类型嵌入都是在同一个向量空间中学习的,这样我们就可以计算出需要进行排名的房源的用户类型和房源类型之间的相似度。该相似性被用作搜索排名模型的额外特征,也被成功地测试和上线。
相关工作
在一些自然语言处理(NLP)的应用中,将单词表示为高维、稀疏向量的经典语言建模方法已被神经语言模型所取代,该模型通过使用神经网络学习单词嵌入,即单词的低维表示[25, 27]。这些网络是通过直接考虑词的顺序和它们的共同出现来训练的,基于这样的假设:在句子中经常一起出现的词也有更多的统计依赖。随着高度可扩展的bag-of-words(CBOW)和 skip-gram(SG)语言模型的发展,用于词的表示学习[17],嵌入模型在对大量文本数据进行训练后,在许多传统语言任务上获得了最先进的性能。
最近,嵌入的概念已经超出了单词表示的范围,被扩展到NLP领域之外的其他应用。来自网络搜索、电子商务和市场领域的研究人员很快意识到,就像人们可以通过将句子中的单词序列作为上下文来训练单词嵌入一样,同样可以通过将用户行为的序列作为上下文来训练用户行为的嵌入,例如,被点击或购买的物品[11, 18],被点击的查询和广告[8, 9]。此后,我们看到嵌入被用于网络上各种类型的推荐,包括音乐推荐[26]、工作搜索[13]、应用程序推荐[21]、电影推荐[3,7]等。此外,已经表明,用户与之互动的项目可以被利用,在与项目嵌入相同的特征空间中直接倾斜用户嵌入,这样就可以直接进行用户-项目推荐[6, 10, 11, 24, 27]。另一种方法,特别是对冷启动推荐有用,是仍然使用文本嵌入(例如那些公开可用的https://code.google.com/p/word2vec),并利用项目和/或用户元数据(例如标题和描述)来计算其嵌入[5, 14, 19, 28]。最后,嵌入方法的类似扩展已被提出用于社会网络分析,其中图上的随机行走可用于学习图结构中节点的嵌入[12, 20]。
嵌入方法在学术界和产业界都产生了重大影响。最近的行业会议出版物和会谈显示,它们已经成功地部署在主要网络公司的各种个性化、推荐和排名引擎中,例如雅虎[8, 11, 29]、Etsy[1]、Criteo[18]、Linkedin[15, 23]、Tinder[16]、Tumblr[10]、Instacart[22]、Facebook[28]。
方法
在下文中,我们将介绍在Airbnb的搜索中进行房源推荐和房源排名的方法。我们描述了两种不同的方法,即分别用于短期实时个性化的房源嵌入和用于长期个性化的用户类型和房源类型嵌入。
Listing Embeddings
假设我们从
更准确地说,该模型的目标是使用 skip-gram 模型 [17] 通过在整个搜索会话集
从点击列表
其中,
计算(1)中目标函数的梯度
其中要学习的参数
预订房源作为全局上下文 我们可以将点击会话集
其中
图1显示了如何通过一个大小为
调整训练方法以适应集中搜索 在线旅游预订网站的用户通常只在一个区域内进行搜索,即他们想呆的地方。因此,
其中要学习的参数
房源嵌入的冷启动 每天都有新的房源被房东创建并在Airbnb上公布。在这一点上,这些房源没有嵌入,因为它们没有出现在点击会话
在创建房源时,主人需要提供有关房源的信息,如位置、价格、房源类型等。我们利用所提供的关于房源的元数据,找到3个地理上最接近的房源(半径10英里内),这些房源都有嵌入,与新房源的房源类型相同(如私人房间),并且与新房源属于同一个价格桶(如每晚
评估嵌入 为了评估房源嵌入的哪些特征,我们检查了在8亿次点击会话上使用(5)训练的
虽然有些房源特征,如价格,不需要学习,因为它们可以从房源元数据中提取,但其他类型的房源特征,如建筑、风格和感觉,则更难以房源特征的形式提取。为了评估这些特征是否被嵌入所捕获,我们可以检查列表嵌入空间中独特建筑列表的
这个工具的演示视频,可在https://youtu.be/1kJSAG91TrI,显示了更多嵌入能够找到相同独特建筑的类似房源的例子,包括船屋、树屋、城堡、木屋、海滨公寓等等。
User-type & Listing-type Embeddings
第3.1节中描述的使用点击会话训练的列表嵌入非常善于发现同一区域的列表之间的相似性。因此,它们适用于短期的、会话中的个性化,其目的是向用户展示与他们在即将到来的搜索会话中所点击的列表相似的列表。
然而,除了基于同一会话中刚刚发生的信号的会话中的个性化之外,基于用户的长期历史信号的个性化搜索也很有用。例如,如果一个用户目前正在搜索洛杉矶的房源,并且过去在纽约和伦敦进行过预订,那么推荐与之前预订的房源相似的房源将是非常有用的。
虽然一些跨区域的相似性在使用点击率训练的列表嵌入中得到了体现,但学习这种跨区域相似性的一个更主要的方法是学习由特定用户在一段时间内预订的列表所构成的会话。具体来说,让我们假设给我们一个
- 首先,预订会话数
要比点击会话数据 小得多,因为预订是不太频繁的事件。
- 第二,许多用户在过去只预订了一个列表,我们无法从长度为1的会话中学习。
- 第三,要从上下文信息中学习任何实体的有意义的嵌入,至少需要该实体在数据中出现 5-10 次,并且平台上有许多listing_ids被预订的次数少于5-10次。
- 最后,用户的两次连续预订之间可能会有很长的时间间隔,在这段时间内,用户的偏好,如价格点,可能会发生变化,例如由于职业的变化。
为了解决实践中这些非常常见的区域问题,我们建议在listing_type层面而不是listing_id层面学习嵌入。考虑到某个listing_id的元数据,如位置、价格、listing类型、容量、床位数等,我们使用表3中定义的基于规则的映射来确定其listing_type。例如,一个来自美国的整个家庭房源,具有2人容量、1张床、1间卧室和1间浴室,每晚平均价格为
为了考虑到用户随着时间推移不断变化的偏好,我们建议在与listing_type嵌入相同的向量空间中学习user_type嵌入。用户类型的确定采用了我们应用于房源的类似程序,即通过利用表4中定义的关于用户和他们以前的预订的元数据。例如,对于一个来自旧金山、拥有MacBook笔记本电脑、英语设置、带有用户照片的完整个人资料、来自房东的83.4%的平均访客5星评级的用户,他在过去进行了3次预订,其中预订房源的平均统计数据为
训练程序 为了在同一向量空间中学习用户类型和列表类型的嵌入,我们将用户类型纳入预订会话中。具体来说,我们形成一个
需要优化的目标可以类似于(3)的定义,其中需要更新的中心项不是
其中
图5
因为根据定义,预订环节大多包含来自不同区域的房源,所以没有必要像我们在环节3.1中所做的那样,从与预订房源相同的区域中抽取额外的负样本,以考虑到点击环节中的集中搜索。
拒绝操作的显式负采样 与只反映客人方偏好的点击不同,预订也反映了主人方的偏好,因为存在一个来自主人的明确反馈,即接受客人的预订请求或拒绝客人的预订请求的形式。主人拒绝的一些原因是客人的星级不好,客人的资料不完整或空白,没有资料图片,等等。这些特征是表4中user_type定义的一部分。
在训练过程中,除了客人的偏好信号外,还可以利用主人方的拒绝信号在嵌入空间中进行编码。纳入拒绝信号的整个目的是,一些listing_types对没有预订、档案不完整和客人星级评分低于平均水平的用户类型的敏感度低于其他类型,我们希望这些listing_types和user_types的嵌入在向量空间中更接近,这样,基于嵌入相似性的推荐将减少未来拒绝预定的情况,同时最大化预订的机会。
我们以如下方式制定使用拒绝的显式负采样。除了
在更新中心项目的情况下,它是一个user_type
在更新中心项目的情况下,这是一个listing_type
考虑到所有user_types和listing_types的学习嵌入表示,我们可以根据用户当前的用户类型嵌入和候选列表的列表类型嵌入之间的余弦相似度,向用户推荐最相关的列表。例如,在表5中,我们显示了user_types=
实验
Comments | NOTHING