《Real-time Personalization using Embeddings for Search Ranking at Airbnb》翻译

发布于 2023-01-08  499 次阅读


摘要

搜索排名和推荐系统是大部分互联网公司至关重要的基本问题,包括网络搜索引擎、内容发布网站和市场平台。然而,尽管有一些共同的特点,但在这个领域并不存在一个统一的解决方案。鉴于需要进行排名、个性化和推荐的内容有很大差异,每个市场都有某种程度上的独特挑战。相应地,在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

假设我们从 个用户那里获得了一组点击会话 的集合 ,其中每个会话 被定义为用户点击的不间断的 列表 ID 序列。只要两次连续用户点击之间的时间间隔超过 30 分钟,就会启动一个新会话。给定这个数据集,目的是学习每个唯一列表维实值表示 ,使得相似的列表位于嵌入空间中相近的位置。

更准确地说,该模型的目标是使用 skip-gram 模型 [17] 通过在整个搜索会话集 上最大化目标函数 来学习列表表示,定义如下

从点击列表 的上下文邻域观察列表 的概率 是使用 softmax函数定义的

其中,是列表的输入和输出向量表示,超参数被定义为点击列表的相关前向和后向背景(邻域)的长度,是定义为数据集中唯一列表id集合的字典。从(1)和(2)中我们可以看出,所提出的方法对列表点击序列的时间背景进行建模,其中具有类似背景的列表(即在搜索会话中具有类似的邻近列表)将具有类似的表示。

计算(1)中目标函数的梯度所需的时间与字典大小成正比,对于大的字典大小,例如几百万的列表id,是一项不可行的任务。作为一种替代方法,我们使用了[17]中提出的负抽样方法,它大大降低了计算的复杂性。负抽样可以被表述为:我们生成一个的正数对的点击列表和其上下文(即。在长度为的窗口内,同一用户在点击l之前和之后对其他列表的点击),以及一组被点击的列表和从整个字典中随机抽取的列表的负样本对。然后,优化目标变为

其中要学习的参数。优化是通过随机梯度上升法完成的。

预订房源作为全局上下文 我们可以将点击会话集分解为:1)预订会话,即以用户预订房源结束的点击会话;2)探索会话,即不以预订结束的点击会话,即用户只是在浏览。从捕捉上下文相似性的角度看,这两种情况都是有用的,然而,预订的会话可以用来调整优化,使我们在每一步不仅预测邻近的点击房源,而且预测最终预订的房源。这种调整可以通过添加预订的房源作为全局上下文来实现,这样,无论它是否在上下文窗口内,都会被预测到。因此,对于已预订的会话,嵌入的更新规则为

其中是预订的列表的嵌入。对于探索性会话,仍然通过优化目标(3)进行更新。

image-20230107140409561

图1显示了如何通过一个大小为的滑动窗口,从第一个被点击的列表滑动到已预订的列表,来学习列表嵌入的图形。在每个步骤中,中心列表的嵌入被更新,这样它就能预测来自的上下文列表和已预订列表的嵌入。随着窗口的滑动,一些列表落入或落出上下文集,而预订的列表始终作为全局上下文留在其中(虚线)。

调整训练方法以适应集中搜索 在线旅游预订网站的用户通常只在一个区域内进行搜索,即他们想呆的地方。因此,包含同一区域的房源的概率很高。另一方面,由于对负面信息的随机抽样,很可能包含的大部分房源与的房源不属于同一区域。在每个步骤中,对于一个给定的中心房源来说,正样本上下文大多由与来自同一区域的房源组成,而负样本上下文大多由与不来自同一区域的房源组成。我们发现,这种不平衡导致了学习次优的区域内相似性。为了解决这个问题,我们建议增加一组随机的负样本,从中心房源的区域中抽取。

其中要学习的参数

image-20230107141850323

房源嵌入的冷启动 每天都有新的房源被房东创建并在Airbnb上公布。在这一点上,这些房源没有嵌入,因为它们没有出现在点击会话训练数据中。为了创建新房源的嵌入,我们建议利用其他房源的现有嵌入。

在创建房源时,主人需要提供有关房源的信息,如位置、价格、房源类型等。我们利用所提供的关于房源的元数据,找到3个地理上最接近的房源(半径10英里内),这些房源都有嵌入,与新房源的房源类型相同(如私人房间),并且与新房源属于同一个价格桶(如每晚25)。接下来,我们用3个已识别房源的嵌入来计算平均矢量,形成新的房源嵌入。使用这种技术,我们能够覆盖超过98%的新房源。

image-20230107141208864

image-20230107152048325

评估嵌入 为了评估房源嵌入的哪些特征,我们检查了在8亿次点击会话上使用(5)训练的维度的嵌入。首先,通过对学到的嵌入进行均值聚类,我们评估地理相似性是否被编码。图2显示了加利福尼亚的100个聚类,证实了来自相似地点的房源被聚类在一起。我们发现这些聚类对于重新评估我们对旅游市场的定义非常有用。接下来,我们评估了洛杉矶不同类型的房源(表1)和不同价格范围的房源(表2)之间的平均余弦相似度。从这些表中可以看出,相同类型和价格范围的房源之间的余弦相似度要比不同类型和价格范围的房源之间的相似度高得多。因此,我们可以得出结论,这两个房源特征在学习到的嵌入中也被很好地编码了。

虽然有些房源特征,如价格,不需要学习,因为它们可以从房源元数据中提取,但其他类型的房源特征,如建筑、风格和感觉,则更难以房源特征的形式提取。为了评估这些特征是否被嵌入所捕获,我们可以检查列表嵌入空间中独特建筑列表的近邻。图3显示了这样一个案例,对于左边的独特建筑列表,最相似的列表是相同的风格和结构。为了能够在列表嵌入空间中进行快速和简单的探索,我们开发了一个内部相似性检索工具,如图4所示。

image-20230107141900953

这个工具的演示视频,可在https://youtu.be/1kJSAG91TrI,显示了更多嵌入能够找到相同独特建筑的类似房源的例子,包括船屋、树屋、城堡、木屋、海滨公寓等等。

User-type & Listing-type Embeddings

第3.1节中描述的使用点击会话训练的列表嵌入非常善于发现同一区域的列表之间的相似性。因此,它们适用于短期的、会话中的个性化,其目的是向用户展示与他们在即将到来的搜索会话中所点击的列表相似的列表。

然而,除了基于同一会话中刚刚发生的信号的会话中的个性化之外,基于用户的长期历史信号的个性化搜索也很有用。例如,如果一个用户目前正在搜索洛杉矶的房源,并且过去在纽约和伦敦进行过预订,那么推荐与之前预订的房源相似的房源将是非常有用的。

虽然一些跨区域的相似性在使用点击率训练的列表嵌入中得到了体现,但学习这种跨区域相似性的一个更主要的方法是学习由特定用户在一段时间内预订的列表所构成的会话。具体来说,让我们假设给我们一个的预订会话集合,该集合来自个用户,其中每个预订会话被定义为由用户按时间顺序预订的房源序列。试图用这种类型的数据为每个listing_id学习嵌入,在很多方面都是挑战。

  • 首先,预订会话数要比点击会话数据小得多,因为预订是不太频繁的事件。
  • 第二,许多用户在过去只预订了一个列表,我们无法从长度为1的会话中学习。
  • 第三,要从上下文信息中学习任何实体的有意义的嵌入,至少需要该实体在数据中出现 5-10 次,并且平台上有许多listing_ids被预订的次数少于5-10次。
  • 最后,用户的两次连续预订之间可能会有很长的时间间隔,在这段时间内,用户的偏好,如价格点,可能会发生变化,例如由于职业的变化。

image-20230107153117665

为了解决实践中这些非常常见的区域问题,我们建议在listing_type层面而不是listing_id层面学习嵌入。考虑到某个listing_id的元数据,如位置、价格、listing类型、容量、床位数等,我们使用表3中定义的基于规则的映射来确定其listing_type。例如,一个来自美国的整个家庭房源,具有2人容量、1张床、1间卧室和1间浴室,每晚平均价格为美元,每位客人每晚平均价格为美元,有5条评论,全部为5星级,新客人接受率为100%,将映射为listing_type。桶是以数据驱动的方式确定的,以最大限度地覆盖每个listing_type桶。从listing_id到listing_type的映射是一个多对一的映射,也就是说,许多listing会映射到同一个listing_type。

image-20230107153740698

为了考虑到用户随着时间推移不断变化的偏好,我们建议在与listing_type嵌入相同的向量空间中学习user_type嵌入。用户类型的确定采用了我们应用于房源的类似程序,即通过利用表4中定义的关于用户和他们以前的预订的元数据。例如,对于一个来自旧金山、拥有MacBook笔记本电脑、英语设置、带有用户照片的完整个人资料、来自房东的83.4%的平均访客5星评级的用户,他在过去进行了3次预订,其中预订房源的平均统计数据为美元每晚, 美元每晚每客户, 2.33 容量,8.24 评论和 76.1% 列表 5 星评级,产生的用户类型是 。在生成用于训练嵌入的预订会话时,我们计算用户类型,直到最近一次预订。对于第一次预订的用户,用户类型的计算是基于表4的前5行,因为我们没有关于过去预订的信息。这很方便,因为基于前5行的user_types的学习嵌入可以用于登录用户和没有过去预订的新用户的冷启动个性化。

训练程序 为了在同一向量空间中学习用户类型和列表类型的嵌入,我们将用户类型纳入预订会话中。具体来说,我们形成一个集合,由个用户的预订会话组成,其中每个会话被定义为预订事件的序列,即。 即按时间排序的(用户类型,列表类型)二元组。需要注意的是,每个会话都是由同一个user_id的预订组成的,但是对于一个user_id来说,他们的user_type可以随着时间的推移而改变,类似于同一个listing的listing_types当他们会收到更多的预订时,listing_types可以随着时间的推移而改变。

需要优化的目标可以类似于(3)的定义,其中需要更新的中心项不是的列表,而是user_type或listing_type,取决于哪一个在滑动窗口中被抓住。例如,为了更新用户类型的中心项目,我们用

其中包含最近用户历史中的user_type和listing_type,特别是相对于中心项目的时间戳而言的过去和未来的用户预订,而包含用作负样本的随机user_type或listing_type实例。同样地,如果中心项目是一个listing_type我们优化以下目标

image-20230107161734165

图5(左边)显示了这个模型的图形表示,其中中心项代表用户类型,对其进行的更新如(6)所示。

因为根据定义,预订环节大多包含来自不同区域的房源,所以没有必要像我们在环节3.1中所做的那样,从与预订房源相同的区域中抽取额外的负样本,以考虑到点击环节中的集中搜索。

拒绝操作的显式负采样 与只反映客人方偏好的点击不同,预订也反映了主人方的偏好,因为存在一个来自主人的明确反馈,即接受客人的预订请求或拒绝客人的预订请求的形式。主人拒绝的一些原因是客人的星级不好,客人的资料不完整或空白,没有资料图片,等等。这些特征是表4中user_type定义的一部分。

在训练过程中,除了客人的偏好信号外,还可以利用主人方的拒绝信号在嵌入空间中进行编码。纳入拒绝信号的整个目的是,一些listing_types对没有预订、档案不完整和客人星级评分低于平均水平的用户类型的敏感度低于其他类型,我们希望这些listing_types和user_types的嵌入在向量空间中更接近,这样,基于嵌入相似性的推荐将减少未来拒绝预定的情况,同时最大化预订的机会。

我们以如下方式制定使用拒绝的显式负采样。除了这两个集合之外,我们还生成了一个的user_type或listing_type的对,这些对涉及到拒绝事件。如图5 (右侧)所示,我们特别关注主人拒绝(标有减号)后被同一用户成功预订(标有加号)的情况。然后,新的优化目标可以被表述为

在更新中心项目的情况下,它是一个user_type,并且

在更新中心项目的情况下,这是一个listing_type

考虑到所有user_types和listing_types的学习嵌入表示,我们可以根据用户当前的用户类型嵌入和候选列表的列表类型嵌入之间的余弦相似度,向用户推荐最相关的列表。例如,在表5中,我们显示了user_types=与具有大量良好评论的高质量、宽敞的书籍和几种不同的listing_types之间的余弦相似性。可以看出,最符合这些用户偏好的房源类型,即整个房屋、大量好评、面积大和高于平均价格的房源,具有较高的余弦相似度,而不符合用户偏好的房源,即空间小、价格低和评论数量少的房源,具有较低的余弦相似度。

实验

 

 

 

 

 

结论


面向ACG编程