KDD 2018, August 19-23, 2018, London, United Kingdom
Mihajlo Grbovic;Airbnb, Inc;San Francisco, California, USA
Haibin Cheng Airbnb, Inc. San Francisco, California, USA
爱彼迎是一个双边市场,需要同时优化租户和房东的偏好。本文中我们为了在搜索过程中达到实时的个性化,使用了相似列表推荐和用户嵌入技术。该嵌入模型专门为爱彼迎市场设计,能够捕捉用户的短期和长期兴趣,从而提供有效的住房推荐。
在过去十年中,机器学习已经开始出现在基于传统信息检索的搜索架构中,特别是在搜索序列。造成这个趋势的原因是能搜集和分析的搜索数据不断增长,这些数据为在个性化特定用户的搜索使用机器学习提供了可能性。
任何搜索算法的目标都可能因平台而异。 虽然一些平台旨在增加网站参与度(例如点击次数和在搜索的新闻文章上花费的时间),但其他平台旨在最大化转换(例如购买正在搜索的商品或服务),以及双边市场的情况 我们经常需要优化市场双方的搜索结果,即卖家和买家。在许多现实应用中,双边市场已经成为一个可行的商业模式。我们将社会网络范式转化为具有供需两种不同类型的参与者。相似的结构有爱彼迎,uber,lyft,etsy等。这种类型的市场的内容发现和搜索排序需要同时满足供需双方。
在爱彼迎中,需要得到地点、价格、风格和评论等的排序列表以吸引客户,同时还需要确定旅行时间和起始时间是否与房东匹配。此外,还需要检测可能因拒绝评论,宠物,逗留时间,团体规模或任何其他因素而拒绝客人的列表。为了做到这一点,我们使用排序学习(leanring to rank)。我们将问题表示为成对回归,其中包含预测的正实用程序和拒绝的负实用程序,我们使用修改后的Lambda Rank [4]模型进行优化,该模型共同优化了市场双方的排名。
由于客人通常在预订前进行多次搜索,即点击多个列表并在搜索会话期间联系多个房东,我们可以使用这些会话中的信号,即点击,联系房东等,以实现实时个性化 目的是向客人展示更多类似于我们认为他们喜欢的列表,因为他们正在开始搜索会话。同时我们可以使用负信号,例如 跳过高排名的房源,向客人展示与我们认为不喜欢的房源相似的房源。 为了能够计算客人与之交互的列表与需要排名的候选列表之间的相似性,我们建议使用列表嵌入,从搜索会话中学习的低维向量表示。 我们利用这些相似之处为我们的搜索排名模型创建个性化功能,并推动我们的类似上市建议,这两个平台推动了爱彼迎99%的预订。
为了解决某些不活跃用户的长尾问题,我们建议在用户类型级别而不是特定用户ID上训练嵌入,其中使用利用已知用户属性的多对一规则映射来确定类型。同时,我们在与用户类型嵌入相同的向量空间中学习列表类型嵌入。这使我们能够计算进行搜索的用户的用户类型嵌入与需要排名的候选列表的列表类型嵌入之间的相似性。
本文的创新点在于:
在一些NLP应用中,传统的语言模型算法中将词作为高维稀疏向量已经被词嵌入模型取代,即通过使用神经网络用低维向量表示词。该网络通过直接考虑词序和共现训练而成,其基于一个假设:经常在句子中一起出现的词语具有统计相关性。随着表示学习中CBOW(highly scalable
continuous bag-of-words)和SG(skip-gram)的发展,嵌入模型在很多传统的语言任务中有着高水平的表现。
最近,嵌入式的概念已经从单词表示扩展到NLP领域之外的其他应用领域。网页搜索、电商以及市场等领域迅速意识到就像可以通过将句子中的单词序列作为上下文来训练单词嵌入一样,也可以训练用户操作的嵌入,例如通过将用户操作序列作为上下文来处理被单击或购买的项目、被单击的查询和广告。自此,我们看到嵌入被用于Web上各种类型的推荐,包括音乐推荐,工作搜索,应用推荐,电影推荐等。此外,还表明可以利用与用户交互的项直接精益用户嵌入到与项嵌入相同的功能空间中,这样就可以直接提出用户项建议。对于冷启动建议特别有用的另一种方法是仍然使用文本嵌入(例如,可以在https://code.google.com/p/word2vec上公开获取),并利用项和/或用户元数据(例如标题和描述)来计算它们的嵌入。最后,类似的嵌入方法的扩展也被提出用于社交网络分析,利用图上的随机游动学习节点在图结构中的嵌入。
嵌入方法对学术界和工业界都产生了重大影响。 最近的行业会议出版物和出版物表明,它们已成功部署在各大网络公司的各种个性化,推荐和排名引擎中,例如雅虎、etsy,criteo ,linkedin,facebook等。
在下文中,我们介绍了在Airbnb上搜索推荐和列出排名的任务的建议方法。 我们描述了两种不同的方法,即分别列出用于短期实时个性化的嵌入和用于长期个性化的用户类型和列表类型嵌入。
我们假设从N个用户中获得了s点击回话的一个集合S,其中 被定义为用户点击M列表ID的一个连续序列。只要连续两次用户单击之间的时间间隔超过30分钟,就会启动一个新会话。用这些数据集为每一个列表l1学习一个d维实值表示,类似的列表位于嵌入空间附近。
该模型的目标是通过在整个搜索会话集合S中最大化目标函数L来学习使用skip-gram模型的列表表示,定义如下
从公式(1)和(2)我们可以看到,所提出的方法对列表单击序列的时间上下文建模,其中具有类似上下文的列表(即,在搜索会话中使用类似的邻近列表)将具有类似的表示。
计算目标函数的梯度时间与词汇集的大小成正比,对于数以亿计的词汇集,这是不可能完成的任务。作为改进,我们使用了一种负采样策略,能够极大的降低时间复杂度。负采样定义如下:我们对点击列表l的正对产生一个集合Dp,他们的内容集合c(即在长度为m的窗口中单击列表l前后发生的相同用户对其他列表的单击),点击列表l的负对几何为Dn,从整个词汇集V中随机抽取n个随机样本,于是目标函数变为:
我们将点击会话分为两类,(1)已预定会话,即用户完成了预定;(2)探索会话,即用户只是浏览而未完成预定。从捕获上下文相似性的角度来看,这两种方法都很有用,然而已预订的会话可用于调整优化,以便在每一步中,我们不仅预测相邻的已单击列表,而且还预测最终已预订的列表。这种调整可以通过将已预订的列表添加为全局上下文来实现,这样无论是否在上下文窗口中,它都将始终被预测。对于已预订会话,其嵌入规则变为:
图1显示了如何使用大小为2n+1的滑动窗口从已预订的会话学习清单嵌入的图形表示,该窗口从第一次单击的清单滑动到已预订的清单。在每个步骤中,都会更新中央清单vl的嵌入,以便预测来自Dp的上下文清单vc和已预订的清单vlb的嵌入。当窗口滑动时,一些清单会进入或离开上下文集,而已预订的清单始终作为全局上下文(虚线)保留在其中。
在线旅游预订网站的用户通常只搜索一个单一的市场,即他们想要停留的位置。因此,Dp包含来自同一市场的列表的概率很高。另一方面,由于负样本的随机抽样,Dn很可能主要包含与Dp中的列表不在同一市场的列表。 在每个步骤中,对于给定的中央列表l,正例上下文主要包括来自与l相同的市场的列表,而负例上下文主要包括不是来自与l相同的市场的列表。这种不平衡导致学习次优的市场内相似性。 为了解决这个问题,我们从中央列表l的市场中抽样添加一组随机负片Dmn,
每天都有新的房源由房东创建,并在爱彼迎上提供。此时,这些列表没有嵌入,因为它们没有出现在点击列表的训练数据中。为了创建新清单的嵌入,我们建议使用其他清单的现有嵌入。
创建清单时,需要房东提供关于清单的信息,如位置、价格、清单类型等。我们使用提供的关于列表的元数据来找出具有嵌入的3个地理上最接近的列表(半径10英里内),与新列表具有相同的列表类型(例如私人房间)并且属于与该列表相同的价格例如每晚20美元至25美元)。之后我们使用3个嵌入的标识列表来计算平均向量,从而形成新的列表嵌入。使用这种技术,我们可以覆盖98%以上的新列表。
为了评估嵌入物捕获列表的特征,我们检查了使用在8亿次点击会话上训练的d = 32维嵌入。首先,通过对学习嵌入执行k均值聚类,我们评估是否编码了地理相似性。 图2显示了加利福尼亚州产生的100个集群,确认来自相似位置的列表聚集在一起。 我们发现这些集群对于重新评估我们对旅游市场的定义非常有用。接下来,我们评估洛杉矶不同上市类型(表1)和不同价格范围列表(表2)之间的平均余弦相似性。 从这些表中可以看出,与不同类型和价格范围的列表之间的相似性相比,相同类型和价格范围的列表之间的余弦相似性要高得多。 因此,我们可以得出结论,这两个列表特征也在学习嵌入中很好地编码。
虽然一些列表特征(例如价格)不需要学习,因为它们可以从列表元数据中提取,但是其他类型的列表特征(例如架构,风格和感觉)更难以以列表特征的形式提取。 为了评估嵌入是否捕获了这些特征,我们可以在列表嵌入空间中检查唯一体系结构列表的k-最近邻居。 图3显示了一个这样的情况,其中对于左侧的唯一体系结构列表,最相似的列表具有相同的样式和体系结构。 为了能够在列表嵌入空间中进行快速简便的探索,我们开发了一个内部相似性探索工具,如图4所示。
该工具的演示视频可在线获取,网址为https://youtu.be/1kJSAG91TrI,其中显示了更多嵌入式示例,可以找到相同独特架构的相似列表,包括船屋,树屋,城堡,小木屋,海滨公寓 等
上一部分介绍了列表嵌入,利用点击序列训练是一个很好的方法来找到同一市场下不同列表之间的相似性。因此,它们适合于短期,序列,个性化,其目的是向用户列表显示与他们在内在搜索会话期间点击的列表类似的列表。
然而,除了会话内个性化之外,基于刚刚在同一会话中发生的信号,基于来自用户的长寿历史的信号来个性化搜索将是有用的。例如,给出一个当前寻找洛杉矶地区的住宿,但曾经在纽约和伦敦有过预定的用户,推荐和之前相似的推荐列表会得到更好的效果。
虽然在使用点击培训的列表嵌入中捕获了一些跨市场的相似性,但是学习这种跨市场相似性的更主要方式是从特定用户随时间预订的列表构建的会话中学习。特别地,假设我们从N个用户得到了一个预定序列Sb,其中每一个预定会话sb = (lb1, . . . ,lbM ) 是用户j关于时间的预定列表。试图使用这种类型的数据学习每个listing_id的嵌入vlid在很多方面都具有挑战性:
为了学习在同一个向量空间的用户类型嵌入和列表类型嵌入,我们将用户类型合并到预定序列中。特别地,我们构成一个集合Sb包括了N个用户的Nb预定序列,其中每一个序列sb = (utype1ltype1, . . . ,utypeM ltypeM ) ∈ Sb 是一个预定事件的序列,即(用户类型,列表类型)按时间序列排列的元组。注意到每个序列包括相同用户id的预定,然而对于单个用户id,他们的用户类型会随着时间而改变,相同列表的列表类型也会随着预定的增多而改变。
需要优化的目标与公式(3)有着相同的定义,其中,需要更新的中心项是user_type(ut)或listing_type(lt),具体取决于滑动窗口中捕获的那个。例如,要更新我们使用的user_type(ut)的中心项:
其中,Dbook包含了最近用户历史中的用户类型和列表类型,特别是关于中心项目的时间戳的近期和近期的用户预订,而Dneg包含用作负面的列表类型实例的随机用户类型。相同的,如果中心项是一个列表类型,我们需要优化如下目标:
图5a显示此模型的图形表示,其中中心项表示执行更新的user_type(ut),如(6)中所示。
与仅反映客人偏好的点击不同,预订也反映了房东方偏好,因为房东有明确的反馈,接受客人的预订请求或拒绝客人的预订请求。房东拒绝的一些原因是低分评价,不完整或空客户人物,没有概况图片等。这些特征是表4中用户类型定义的一部分。
除了客户偏好信号之外,还可以在训练期间利用房东拒绝来对嵌入空间中的房东偏好信号进行编码。合并拒绝信号是因为某些列表类型对没有预订的用户类型不太敏感,我们希望这些列表类型和用户类型的嵌入在向量空间中更接近,以便基于嵌入相似性的推荐除了最大化预订机会之外还会减少未来的拒绝。
我们以下列方式将拒绝的使用制定为明确的否定。除了设置Dbook和Dneg集合以外,我们为设计拒绝事件中的用户类型和类别类型的(ut,lt)对产生了一个集合Drej,如图5b(右侧)所示,我们特别关注当主机拒绝(标有减号)后由同一用户成功预订(标有加号)另一个列表的情况。 然后可以将新的优化目标表述为
在用户类型(ut)作为更新的中心项的情况下。
在列表类型作为更新的中心项的情况下。
给定所有用户类型和列表类型的学习嵌入,我们可以根据用户当前用户类型嵌入和候选列表的列表类型嵌入之间的余弦相似性向用户推荐最相关的列表。例如在表5中,我们显示了通常会在美国预订高质量,宽敞的房源,并提供大量好评和几种不同的列表类型user_type =
SF_lg1_dt1_fp1_pp1_nb3_ppn5_ppg5_c4_nr3_l5s3_g5s3 之间的余弦相似度。可以观察到,最符合这些用户偏好的列表类型,即整个住宅,大量好评,大且高于平均价格,具有高余弦相似性,而与用户偏好不匹配的那些,即具有较小空间的那些, 较低的价格和较少的评论具有较低的余弦相似性
我们将首先介绍嵌入嵌入及其offline评估的详细信息, 然后,我们将在列表页面上显示使用列表嵌入列表的类似列表建议的在线实验结果, 最后,我们给出了搜索排名模型的背景,并描述了如何使用列表嵌入和列表类型和用户类型嵌入来实现搜索中的实时个性化功能。 这两种嵌入应用都成功投入生产。我们将首先介绍嵌入嵌入及其offline评估的详细信息。 然后,我们将在列表页面上显示使用列表嵌入列表的类似列表建议的在线实验结果。 最后,我们给出了搜索排名模型的背景,并描述了如何使用列表嵌入和列表类型和用户类型嵌入来实现搜索中的实时个性化功能。 这两种嵌入应用都成功投入生产。
对于培训列表嵌入,我们从搜索中创建了8亿个点击会话,从登录用户中获取所有搜索,按用户ID对其进行分组,并及时点击列表ID。接下来,根据30分钟的不活动规则将一个大的有序列表ID分成多个。接下来,我们删除了意外和短暂点击,即用户在列表页面上停留的点击次数少于30秒,并且仅保留包含2次或更多次点击的会话。最后,通过删除用户标识列来匿名化会话。如前所述,点击会话包括探索会话和。预订会话(以预订结束的点击次数)。根据评估结果,我们在培训数据中对预定会话进行了过度抽样5次,从而实现了性能最佳的列表嵌入。
我们学习了450万个爱彼迎列表的列表嵌入,我们的训练数据实用性和参数使用下面提供的offline评估技术进行了调整。我们的训练数据每天以滑动窗口方式更新,通过处理最新一天的搜索会话并将其添加到数据集并从数据集中丢弃最早的搜索会话。我们为每个列表id训练嵌入,在训练之前随机初始化向量(每次使用相同的随机种子)。我们发现,如果每天从头开始重新训练列表嵌入,会获得更好的性能,而不是逐步继续对现有向量进行训练。日常矢量差异不会导致我们的模型出现差异,因为在我们的应用中,我们使用余弦相似度作为主要信号,而不是实际的矢量本身。即使随着时间的推移矢量变化,余弦相似性度量的内涵及其范围也不会改变。
列表嵌入的维度被设置为d = 32,上下文窗口大小设置为m = 5,对训练数据执行了10次迭代。 为了实现对算法的聚集搜索更改,我们修改了原始的word2vec代码。训练时使用MapReduce,其中300个映射器读取数据,单个缩减器以多线程方式训练模型。 端到端日常数据生成和培训管道使用Airflow实施,Airflow是爱彼迎的开源调度平台。
为了能够快速决定关于优化功能,训练数据构建,超参数等的不同想法,我们需要一种快速比较不同嵌入的方法,以便能够快速决定关于优化功能的不同想法,训练数据构建,超参数等,我们需要一种方法来快速比较不同的嵌入。
评估经过培训的嵌入的一种方法是根据最近的用户点击来测试他们推荐用户预订的列表的好处。 更具体地说,让我们假设我们获得了最近点击的列表和列出需要排名的候选人,其中包含用户最终预订的列表。 通过计算点击列表和候选列表嵌入之间的余弦相似度,我们可以对候选人进行排名并观察预订列表的排名位置。
出于评估目的,我们使用了大量此类搜索,点击和预订活动,其中排名已由我们的搜索排名模型指定。 在图6中,我们显示了评估结果,其中我们比较了几个版本的d = 32嵌入,以及它们如何根据预先列出的列表对其进行排名。 预订列表的排名是每次点击导致预订的平均值,在预订前最多点击17次点击到预订前的最后点击。 值越低意味着排名越高。
可以看出,搜索排名模型随着点击次数的增加而变得更好,因为它使用了记忆功能。 还可以观察到,基于嵌入相似性对列表进行重新排序将是有用的,尤其是在搜索漏斗的早期阶段。
每个爱彼迎主页列表页都包含相似的列表轮播,它推荐与其相似且可用于同一组日期的列表。 在我们测试的时候,类似列表轮播的现有算法在与给定列表相同的位置调用主搜索排名模型,然后在给定列表的可用性,价格范围和列表类型上进行过滤。
我们进行了A / B测试,我们将现有的类似列表算法与基于嵌入的解决方案进行了比较,其中类似的列表是通过在嵌入空间中列出k-最近邻居来生成的。 给定学习列表嵌入,通过计算其向量v1和来自同一市场的所有列表的向量vj之间的余弦相似性来找到给定列表l的类似列表(如果登记和签出) 日期已设定)。 具有最高相似性的K列表被检索为类似列表。 计算是在线进行的,并使用我们的分片架构并行进行,其中部分嵌入存储在每台搜索机器上。
A / B测试显示,基于嵌入式的解决方案导致类似列表轮播点击率增加21%(列表页面输入日期时为23%,无日历页面为20%)和fnd客户增加4.9% 他们最终在类似列表轮播中预订。 鉴于这些结果,我们将基于嵌入的类似列表部署到生产中。
背景:为了正式描述我们的搜索排名模型,假设我们得到关于每个搜索的训练数据Ds =(xi,yi),i = 1 … K,其中K是搜索返回的列表数,xi是矢量包含第i个列表结果的特征并且yi∈{0,0.01,0.25,1,-0.4}是分配给第i个列表结果的标签。要从搜索结果中将标签分配给特定列表,在搜索结束后等待1周以观察最终结果,如果客人联系了列表房东则列出预订是yi = 1,如果预订没有发生则yi = 0.25但,如果房东拒绝了客人y = -0.4,如果列表被点击则yi = 0.01,如果列表刚刚被查看但没有被点击则yi = 0。在那1周之后等待设置Ds也缩短以保持搜索结果直到最后结果用户点击Kc≤K。最后,为了形成数据D我们只保留包含至少一个的Ds集预订标签。每当我们培训新的排名模型时,我们都会使用最近30天的数据。
第i个列表结果的特征向量xi包括列表特征,用户特征,查询特征和交叉特征。列表功能是与列表本身相关联的功能,例如每晚的价格,列表类型,房间数,拒绝率等。查询功能是与发布的查询相关联的功能,例如访客数量,逗留时间,前置天数用户特征是与进行搜索的用户相关联的特征,例如平均预订价格,客人评级等。交叉特征是从这些特征源中的两个或更多个得到的特征:列表,用户,查询。此类功能的示例是查询列表距离:查询位置与列表位置之间的距离,容量ft:查询客人数量与列表容量之间的差异,价格差异:上市价格与用户历史预订平均价格之间的差异,拒绝概率:概率主机将拒绝这些查询参数,点击百分比:实时记忆功能,跟踪用户点击该特定列表的百分比等。该模型使用大约100个功能。为简明起见,我们不会列出所有这些内容。
接下来,我们利用搜索标签将问题表示为成对回归,并使用数据D训练梯度提升决策树(GBDT)模型,使用修改后的包来支持Lambda Rank。 在评估不同的模型时,我们使用NDCG(一种标准排名指标)来保留搜索会话,即80%的数据用于培训,20%用于测试。
最后,一旦模型被训练,它就被用于搜索中的列表的在线评分。 计算由用户u执行的搜索查询q返回的每个列表的特征向量xi所需的信号是所有这些都是以在线方式计算的,并且使用我们的分片架构并行进行评分。 给定所有分数,列表以预测效用的降序显示给户。
在我们的搜索排名模型中添加嵌入功能的第一步是将450万个嵌入加载到我们的搜索后端,以便可以实时访问它们以进行特征计算和模型评分。
接下来,我们介绍了几个用户短期历史记录集,用于保存过去2周内的用户操作,这些操作会在新用户操作发生时实时更新。 逻辑是使用Kafka实现的。 具体来说,对于每个用户id,我们收集并维护(定期更新)以下几组列表ID:
我们遵循类似的程序来介绍基于用户类型和列表类型嵌入的功能。 我们使用5000万用户预订会话为500K用户类型和500K列表类型培训嵌入。 嵌入是d = 32维,并且在预订会话期间使用m = 5的滑动窗口进行训练。 用户类型和列表类型嵌入被加载到搜索机器内存中,这样我们就可以在线计算类型相似度。
要计算候选列表li的UserTypeListingTypeSim功能,我们只需查找其当前列表类型lt以及正在进行搜索的用户的当前用户类型ut并计算其嵌入之间的余弦相似度
表6中的所有功能都记录了30天,因此可以将它们添加到搜索排名训练集D.表7中报告了功能的覆盖范围,即具有特定功能的D的比例。如预期的那样,它可以是观察到基于用户点击和跳过的功能具有最高的覆盖率。
最后,我们培训了一个新的GBDT搜索排名模型,其中添加了嵌入功能。 嵌入特征的特征重要性(在104个特征中排名)如表7所示。排名最高的特征是与用户点击的列表相似(EmbClickSim:排名第5)和与列表用户跳过的相似性(EmbSkipSim:排名第8)。 五种嵌入功能跻身前20大功能。 正如预期的那样,使用所有过去用户预订的长期功能UserTypeListingTypeSim排名优于短期功能EmbBookSim,其仅考虑过去2周的预订。 这也表明,使用历史预订会话而不是点击会话培训的嵌入会更好地基于过去预订的建议。
为了评估模型是否学会了按照我们的意图使用这些特征,我们绘制了3个嵌入特征的部分依赖图:EmbClickSim,EmbSkipSim和UserTypeListTypeSim。 这些图表显示了如果除了单个特征(我们正在研究的那个)之外的所有值的fx值,列表的排名得分会发生什么。 在左侧子图中可以看出,传达该列表的大值EmbClickSim类似于用户最近点击的列表,导致更高的模型得分。 中间的子图显示,EmbSkipSim的大值表示列表类似于用户跳过的列表,导致模型得分较低。 最后,右侧子图显示UserTypeListingTypeSim的较大值(表示用户类型与列表类型相似)会导致模型得分高于预期。
我们进行了在线实验和在线实验(A / B测试)。 首先,我们比较了使用和不使用嵌入功能在相同数据上训练的两个搜索排名模型。 在表8中,我们总结了每个公用事业(印象,点击,拒绝和预订)和整体NDCU(标准化折扣累积效用)的DCU(折扣累积效用)方面的结果。 可以观察到,添加嵌入功能导致NDCU上升2.27%,其中预订DCU增加了2.58%,这意味着预订列表在保留集中排名较高,没有任何拒绝命中(DCU -0.4为fl) ,意味着被拒绝的列表在没有嵌入特征的情况下没有排名高于模型。
表8中的观察结果加上GBDT特征重要性中嵌入特征的嵌入特征(表7)以及特征行为符合我们直观预期的结果(图7)这一事实足以决定进行在线实验。 在在线实验中,我们看到了统计上显着的预订收益,并且嵌入功能已投入生产。 几个月后,我们进行了一次回测,我们尝试删除嵌入功能,导致负面预订,这是实时嵌入功能有效的另一个指标。
我们在爱彼迎的搜索排名中提出了一种实时个性化的新方法。 该方法基于用户点击和预订会话中的上下文共现来学习家庭列表和用户的低维表示。 为了更好地利用可用的搜索上下文,我们将诸如全局上下文和显式否定信号之类的概念合并到训练过程中。 我们在类似清单建议和搜索排名中评估了提议的方法。 在对实时搜索traffic进行成功测试后
嵌入式应用程序已部署到生产中