【推荐系统论文】使用Embedding在 Airbnb 上进行搜索排名的实时个性化

Airbnb个性化推荐

论文笔记

Airbnb个性化推荐场景

  • List Embedding
  • Word2Vec的使用
  • List Embedding的评估
  • List Embedding的冷启动
  • 基于List Embedding的相似房源推荐
  • User Type Embedding与Listing Type Embedding
  • 基于Embedding的实时个性化搜索

论文链接:https://www.kdd.org/kdd2018/accepted-papers/view/real-time-personalization-using-embeddings-for-search-ranking-at-airbnb

短租市场:

  • 大部分的用户很少会多次预定同一类型的房间
  • 房间分时段的,只能在某段时间内被某一个用户预订
  • 低频事件(对于大部分预定用户),同一个地方预订酒店更是低频

实时个性化:

  • 搜索排序
  • 相似房源

Airbnb使用场景:

  • 双边的房屋短租平台(顾客,房东)
  • 顾客通过搜索或者系统推荐找到房源 => 贡献了Airbnb 99%的booking
  • 一个顾客很少会预定同一个房源多次
  • 一个房源在某时间段内只能被一个顾客租用
  • 数据存在严重的稀疏性

Airbnb个性化推荐:

  • 针对搜索排序,相似房源推荐进行的实时个性化

  • 基于业务需求,考虑搜索的目标

  • 点击率(CTR),新闻的观看时长(YouTube),提高商品购买的转化率等等

  • 与其他商品不同,不是用户想定就能定上房源

  • 对于双边市场,需要同时为市场两端用户买家(guest)和卖家(host)提供服务

  • 双边的推荐,既需要考虑用户预订,也需要考虑房东是否接受预订(Host Actions:Reject, Accept, No Response)

  • 对于query(带有位置和旅行的时间),同时为host和guest优化搜索结果:

    • 顾客角度:需要根据位置,价格,类型,评论等因素排序来获得客户喜欢的listing
    • 房东角度:需要过滤掉那些有坏的评论,宠物,停留时间,人数,等其他因素而拒绝guest的listing,将这些listing排列的低一点
  • 采用Learnig to rank来做,将问题转换为pairwise regression问题,将预定的listing作为正样本,拒绝的作为负样本。

List Embedding(房源嵌入)

行为数据:点击(量大——特征建模——找到能充分表达的)、购买(数据集小)

  • 将每个房源 => 房源embedding
    • embedding——长度固定(选择32维)
    • 方便可计算
  • 数据集由 N 个用户的**点击会话** (Session) 组成,其中每个会话定义为一个由用户点击的 M个房源 id 组成的的不间断序列
  • 只要用户连续两次点击时间间隔超过30分钟,就认为是一个新的Session

s = ( l 1 , . . , l M ) ∈ S s=(l_1,..,l_M)\in S s=(l1,..,lM)S

  • 目标是通过集合S,学习出每个房源listing的d维( 32 维)embedding表示,让相似listing在embedding空间中距离更近

  • 借鉴了word2vec中的skip-gram算法

  • 房源embedding,把每个用户连续点击过的房源Session看做一个句子,每个房源当做word,训练出房源的embedding

  • Skip-Gram:对于语料库中的句子,设置一个窗口在每一个句子上滑动,用窗口中央的word,去预测滑动窗口内其他的word,通过这种方式,训练出所有word的embedding

Word2vec

输入one-hot编码(300维神经元)——做预测

神经网络是需要保证上下文出现的情况是一致的

  • Word2Vec:通过Embedding,把原先词所在空间映射到一个新的空间中去,使得语义上相似的单词在该空间内距离相近。
  • Word Embedding => 学习隐藏层的权重矩阵输入层是one-hot编码
    • 输出层是概率值输入层和输出层大小与词库大小相等隐藏层的神经元
  • 数量为hidden_size(Embedding Size)对于输入层和隐藏层之间的权值矩阵W,大小为[vocab_size, hidden_size]
    • 输出层为[vocab_size]大小的向量,每一个值代表着输出一个词的概率
  • 假设有多个训练样本(juice,apple) (juice,pear) (juice,banana)
  • 中心词是juice,规定窗口内有apple、pear、banana,共同的输入juice,对应不同word输出。用这些样本训练后,得到的概率结果,apple、pear、banana的概率值会比较高 => 它们在对应隐藏层中的参数是相似的
  • 计算apple, pear, banana对应的隐藏层向量之间余弦相似度,会比较高word2vec可以让单词之间具有相似性和类比关系
  • 我们想要的结果并不是模型本身,而是隐藏层的参数,即让输入向量转换为新的embedding
Word Embedding
  • 对于输入的one-hot编码:
  • 在矩阵相乘的时候,选取出矩阵中的某一行,而这一行就是输入词语的word2vec表示
  • 隐含层的节点个数 = 词向量的维数
  • 隐层的输出是每个输入单词的Word Embedding
  • word2vec,实际上就是一个查找表
image-20221202105313152 image-20221202105322630
Word2Vec的两种模式:
  • Skip-Gram,跳字模型,给定input word预测上下文

  • CBOW,连续词袋模型,给定上下文,预测input word(与Skip-Gram相反)

  • 原始Skip-Gram的目标函数:

  • 因为每个词w都决定了相邻词 w i + j w_{i+j} wi+j ,基于极大似然,期望所有样本的条件概率 p ( w i + j ∣ w t ) p(w_{i+j}|w_t) p(wi+jwt)之积最大,

  • 使用log probability使用softmax函数求解多分类问题,用 表示单词

p ( w o ∣ w t ) = e x p ( v w o T v w l ) ∑ w = 1 W ( v w o T v w l ) p(w_o|w_t)=\frac{exp(v_{w_o}^Tv_{w_l})}{\sum_{w=1}{W}(v_{w_o}^Tv_{w_l})} p(wowt)=w=1W(vwoTvwl)exp(vwoTvwl)

  • 对目标函数求最大化,可以让相似的词具有相似的向量值

List Embedding的目标函数构造

(正样本:前后两个点击的房子是什么)

(负采样:就是没有点击的样本)

  • 使用skip-gram构造基础的目标函数——要让loss最小化
    L = ∑ s ∈ S ∑ l i ∈ s ( ∑ − m ≥ j ≤ m , i ≠ 0 l o g P ( l i + j ∣ l i ) ) L=\sum_{s\in S}\sum_{l_i \in s}(\sum_{-m≥j≤m,i≠0}logP(l_{i+j}|l_i)) L=sSlis(mjm,i=0logP(li+jli))

  • 采用negative sampling构造采样之后的目标函数
    a r g m a x θ ∑ ( l , c ) ∈ D p l o g 1 1 + e − v c ′ v l + ∑ l , c ∈ D n l o g 1 1 + e v c ′ v l argmax_\theta \sum_{(l,c)\in D_p}log \frac{1}{1+e^{-v_c' v_l}}+\sum_{l,c\in D_n}log \frac{1}{1+e^{v_c' v_l}} argmaxθ(l,c)Dplog1+evcvl1+l,cDnlog1+evcvl1

    • v l v_l vl表示位于当前作用center的这个listing的embedding向量
    • v c v_c vc表示center后面的这个输入listing的embedding向量
    • ( l , c ) (l,c) (l,c) 表示当前的输入向量
    • ( l , c ) ∈ D p (l,c)\in D_p (l,c)Dp 表示当前的输入向量属于正样本
    • ( l , c ) ∈ D n (l,c)\in D_n (l,c)Dn 表示当前的输入向量属于负样本
  • 正常的Skip-Gram,学习每个词的时候,根据设置的大小,只会选择每个词前后n个word作为正样本,所以随着窗口的滑动,窗口内的word是一直在变的

  • Airbnb把session中被预定的listing作为一个全局的上下文始终出现在每次的滑动窗口中,被预定的listing id一直存在session的滑动窗口内。

  • 根据预定行为构造有导向于“booking”的目标函数

    • v l v_l vl示booking listing的embedding向量
    • 因为booking listing是正样本 =>目标函数中的指数是“负”因为booking listing是作为上下文的全局参数(global),所以目标函数中没有使用条件求和∑,也就是在session里面,都要考虑到这个booking listing作为正例
    • (多了一个booking的loss)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zkq8kUY5-1669957697611)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20221202111422984.png)]

  • 适配聚集搜索,Adapting Training for Congregated Search

  • 根据房源地区进一步优化得到最终的目标函数

  • 用户旅行目的确定后,房源都应该是同一个区域的,传统的负采样会随机从全样本中随机抽取

  • Airbnb加入了另一组negative sample,就是在 central listing 同一区域的 listing 集合中进行随机抽样

    • l l l是正在更新的中心房源的向量v(l)
    • D p D_p Dp是一对正对(l,c),表示(中心房源,相关房源)tuple,向量在优化中会被相互推近
    • D n D_n Dn是一对负对(l,c),表示(中心房源,随机房源)tuple,向量在优化中会被相互推远
    • D m n D_{mn} Dmn是一对目的地的负样本(l,mn),表示(中央房源,来自同一目的地的随机房源)tuple,向量在优化中会被相互推远

List Embedding的离线评估

  • 在使用基于embedding的推荐系统进行线上搜索测试之前,需要进行多次离线测试。
  • 目的是比较不同参数训练出来的embedding,决定embedding维度,算法思路等。
  • 评估标准,测试用户最近的点击推荐的房源,有多大可能最终会产生预订
  • (建立了4个模型)——推荐了这么多的房型,最后买的是排在第几位的
    • Step1,获取用户最近点击的房源,以及需要排序的房源候选列表,用户最终预订的房源
    • Step2,计算点击房源和候选房源在embedding空间的余弦相似度
    • Step3,对候选房源按照相似度进行排序,观察最终预订的房源在排序中的位置

搜索中的房源根据embedding的相似性进行了重新排序,并且最终被预订房源的排序是按照每次预定前的点击的平均值来计算,追溯到预定前的 17 次点击

横坐标:处于book行为发生前点击的次数

纵坐标:book的listing在该模型下处所处的位置(值越低说明排序位置越高)

  • search ranking,原有的排序模型。re-ranking,在search ranking上进行re-ranking(使用不同目标函数):
    • d32 regular,采用负采样进行训练得到的embedding结果
    • d32 booking global:在d32的基础上增加booked listing作为全局上下文
    • d32 booking global + market negative:在上一个模型的基础上又加入了房源的地区来作为负抽样
    • re-ranking之后,booking listing的位置都往前提了,证明Ranking结果更好
    • d32 booking global + market negative构造的目标函数方法最好

List Embedding的冷启动(找相似)

  • 每天Airbnb都有新的房源产生,冷启动在所难免
  • 房主上传新房源时需要上传3个特征,位置,价格,房源类型(包括整个房源,独立房间,合住房间3个类别)
  • 在和新上传房源具有相同类型和相同价格区间的房源中
    • 找到3个地理位置最接近的房源,用这3个房源的embedding求平均作为新房源的embedding
  • 能覆盖到98%的新Listing

List Embedding的评估(聚类的目的是降维-好计算)

这里的Kmeans就是为了评估——地理位置是不是敏感

  • 用多种方式验证embedding的有效性

  • K-means 聚类,将embdding进行聚类,然后可以发现其在地理位置上的区分度

  • embeddng之间的余弦相似度

  • 不同类型的listing之间的余弦相似度

  • 不同价格范围的listing之间的余弦相似度

  • 除了基础属性(价格,地理位置)很明显的能直接获取,还有隐属性可以通过embedding来发现,比如房屋的文理

  • 计算了每个listing embedding的k近邻,并对比这个listing和k近邻 => Embedding Evaluation Tool

  • YouTube上有专门的视频展示

    • 证明Embedding很有用 => 让相似listing在embedding空间中距离更近

List Embedding的相似房源推荐

  • 每个 Airbnb 房源详情页面都包含一个「相似房源」的轮播,推荐与当前房源相似并且可以在相同时间段内预订的房源
  • 在有了list embedding之后,进行了 A/B 测试,基于embedding的推荐使「相似房源」点击率增加了21%,通过「相似房源」产生的预订增加了 4.9%
  • 在基于embedding的推荐中,相似房源是通过在list embedding空间中找到 k个最近邻居
  • 对于学习好的list embedding,通过计算 ( l ) (l) (l)与来自相同目的地的所有房源的向量 ( l j ) (l_j) (lj)之间的余弦相似性,找到指定房源的所有可预订的相似房源(条件是入住和退房日期,房源需要在该时间段内可预订)=> 最终得到的k个最高相似性的房源组成相似房源列表

Listing Embedding不能够解决的问题

  • 需要基于当前的点击来计算
  • 只提取了用户的short-term兴趣
  • 只能用于“相似房源”场景中
  • 只针对同地区下的用户兴趣房源的挖掘
  • Listing embedding 能很好的表达同一市场下Listing之间的相似性 => 适合做short-term的个性化,用于比较session内的实时推荐(相似房源推荐)

User Type Embedding 和Listing Type Embedding

  • 一些长期的行为,比如一个人在很久之前在另外一个城市预定过房间,那么在当前城市很有可能还是会喜欢预定同类型的房源

  • 进一步从预定的Listing中来捕获这些信息

  • 构造数据集:由前面的点击序列变成预定序列,数据集为N个用户预定的Listing 组成的session集合,每个sesison可以表示为
    s b = ( l b 1 , . . . , l b M ) s_b = (l_{b1},...,l_{bM}) sb=(lb1,...,lbM)

  • 存在的问题:

    • 训练数据集会很小,因为相比点击,预定的数据小一个数量级。
    • 很多用户在过去只预定过一次,这些数据是没法用来训练模型
    • 需要进一步去掉那些在平台上总共就被预定的次数很少的Listing(比如少于5-10次的Listing)
    • 时间跨度太长,可能用户的喜欢偏好已经发生变化
  • 为了处理存在的问题,提出了学习type级别的embedding,而不是学习id级别的embedding

  • 对于原始的Listing数据,比如位置,价格,类型,床位数等,基于一些硬性的规则生成每个Listing的类别

  • 目的是将原本稀疏的数据(基于id),变得稠密(基于类型)很多session出现了共现

  • 将User Type Embedding方式也采样相同的方法,即拥有一些相同的基础属性和相同行为的用户进行分桶

  • 可以理解为,分别对用户和房源做了聚类,按聚类后的数据进行学习embedding,在更高一个维度(粗粒度)上获取长期兴趣

用type来表示原有的user和listing,可以解决

  • 实时个性化的体现,即使对于同一个listing或user,

  • 对应的type也可以发生变化(比如用户行为发生变化)冷启动问题,用户层面上的前五个特征是通用的画像特征,对于新用户可以直接通过这五个特征完成映射

Type Embedding的目标函数

  • 将房东的拒绝行为(rejection)作为负采样的目标函数

  • User Type Embedding

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVp7xF5Q-1669957697614)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20221202113431880.png)]

  • Listing Type Embedding

  • book行为完成包括:用户预定+房东接受预定请求

    • 实际上,也存在房东reject的情况,需要考虑进去
    • 如果book完成了,(user_type,listing_type)是正样本
    • 如果book被reject了,(user_type,listing_type)是负样本

基于Embedding的实时个性化搜索

  • 计算用户的user type embedding与候选listing的listing type embedding之间的余弦相似度
  • 推荐给用户相似度高的listing

基于Embedding的搜索排序

  • 原有的排序模型:
    • 算法:GBDT模型(支持lambda rank)解决pairwise问题
    • 特征:listing features、user features、query features和cross features
  • 现在的排序模型
    • 算法:GBDT模型(支持lambda rank)解决pairwise问题
    • 特征:listing features、user features、query features和cross features,和embedding features

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNhLtzI1-1669957697617)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20221202113609664.png)]

  • 前7个特征需要先根据用户行为计算得到一些基础的指标

  • 基础指标H*会根据用户的行为不断发生变化 => Embedding Features的引入能够实现排序算法的实时更新

  • 450万的房源embedding加入

  • 因为Airbnb采用的在线实时推荐,所以Embedding的维度大小设置为32(在效果和serving之间做了折中)

  • 对于用户短期行为的实时收集,Airbnb采用kafka消息队列来收集用户的两周历史记录

    • H c H_c Hc : 用户过去两周内点击过的Listing id
    • H l c H_{lc} Hlc : 用户点击并且停留在listing详情页超过60s
    • H s H_s Hs : 用户过去两周内跳过的Listing id(跳过的定义是那些排在前面但是用户没有点,反而点了后面的Listing)
    • H w H_w Hw : 用户添加到Wish List中的Listing id
    • H i H_i Hi : 用户联系了但是没有预定
    • H b H_b Hb : 两周内用户预定的
  • Step1,准备3种embedding值,Listing Embedding,User Type Embedding和Listing Type Embedding

  • Step2,获取基础指标H∗

  • Step3,提取地区embedding

    用户在进行Query的时候,地区是重要的特征,先通过H*获取用户的近期行为,因为listing embedding里面包含了地区之间的差异信息,计算每个地区所有listing embedding的均值作为这个地区的embedding,代表用户对该地区的偏好。

  • Step4,计算Embedding Features
    比如EmbClickSim,针对每一个候选的listing,计算候选listing的listing embedding与地区embedding之间的余弦相似度相似度,取最高值作为该listing的EmbClickSim取值
    UserTypeListingTypeSim,计算每一个候选listing所在的listing type embedding和用户的user type embedding之间的相似度

  • Step5,在原有的Ranking Model中加入embedding features进行计算

基于Embedding的搜索排序评测:

  • 原有features+embedding features共有104个
  • embedding features对排序算法影响大(对数据进行拟合之后发现新生成的embedding features的重要度在104个特征中,重要性排名很高)
  • 较大的EmbClickSim值(用户最近点击的房源的相似房源)会导致更高的模型得分。
  • EmbSkipSim值(用户最近跳过的房源的相似房源,即不喜欢的房源)会导致较低的模型得分。
  • 将房源搜索排序问题看成回归问题,去拟合标签。标签包括{0, 0.01, 0.25, 1, -0.4},0表示房源有曝光但是没点击,0.01表示用户点击了房源,0.25表示用户联系了房东但是并没有预订,1表示房源预订成功,-0.4表示房东拒绝了用户的预订
  • 使用A/B Test(使用Embedding Feature的排序和不使用),发现新的排序模型在DCU等指标上都有提升

Summary

  • 2018 KDD best paper

  • 房源嵌入(Listing Embeddings)适合于短期实时个性化排序和推荐场景

  • 用户类型嵌入(User-type Embedding)和房源类型嵌入(Listing-type Embedding)适合于长期个性化场景

  • 训练上,使用了8亿点击Session,为450万房源训练embedding

  • 去掉Session中没有价值的部分,比如页面停留时间少于30秒的点击(无效数据),Session中包含的点击行为少于1个(无效数据)

  • 在训练模型的几个月里,训练集每天都会更新,新增当天的搜索数据,删除当前最早一天的数据

  • Listing Embeddings粒度最细,将用户的租房点击信息(只有浏览超过30秒才算点击信息)分为多个session

  • 在更粗的粒度上(User Type Embedding 和 Listing Type Embedding)上进行长期兴趣学习

  • 考虑双边市场的特点,通过加入“booking”、“host rejection”强反馈信号来指导无监督学习

  • embedding学习过程将搜索session中数据看作类似序列信息,并通过类似word2vec的方式(进行了改进)学习出每个房源id的embedding值

使用嵌入在 Airbnb 上进行搜索排名的实时个性化

摘要

搜索排名和推荐是主要互联网公司(包括网络搜索引擎、内容发布网站和市场)最感兴趣的基本问题。然而,尽管具有一些共同特征,但在这个领域中并不存在一刀切的解决方案。考虑到需要排名、个性化和推荐的内容差异很大,每个市场都面临着独特的挑战。相应地,在短期租赁市场 Airbnb 中,搜索和推荐问题非常独特,它是一个双向市场,在用户很少消费同一项目两次和一个列表只能接受特定日期的一位客人。在本文中,我们描述了我们为搜索排名中的实时个性化和类似列表推荐而开发和部署的列表和用户嵌入技术,这两个渠道可推动 99% 的转化。嵌入模型专为 Airbnb 市场量身定制,能够捕捉客人的短期和长期兴趣,提供有效的房源推荐。我们对嵌入模型进行了严格的离线测试,然后在将它们完全部署到生产中之前进行了成功的在线测试。

1 简介

​ 在过去十年中,通常基于经典信息检索的搜索架构在其各个组件 [2] 中出现了越来越多的机器学习,特别是在搜索排名中,它通常具有具有挑战性的目标,具体取决于内容的类型正在搜查。这一趋势背后的主要原因是可以收集和分析的搜索数据量的增加。收集到的大量数据为使用机器学习根据以前的搜索为特定用户个性化搜索结果并向最近使用的内容推荐类似内容提供了可能性。

​ 任何搜索算法的目标都可能因手头的平台而异。虽然一些平台旨在增加网站参与度(例如点击次数和花费在正在搜索的新闻文章上的时间),但其他平台旨在最大限度地提高转化率(例如购买正在搜索的商品或服务),并且在双方的情况下我们经常需要为市场的双方优化搜索结果,即卖家和买家。在许多现实世界的应用程序中,这两个市场已经成为一种可行的商业模式。特别是,我们已经从社交网络范式转变为具有代表供需的两种不同类型参与者的网络。示例行业包括住宿(Airbnb)、乘车共享(Uber、Lyft)、在线商店(Etsy)等。可以说,这些类型的市场的内容发现和搜索排名需要满足生态系统的供需双方,以便成长和繁荣。

​ 就 Airbnb 而言,显然需要优化房东和房客的搜索结果,这意味着给定包含位置和旅行日期的输入查询,我们需要对位置、价格、风格、评论等符合要求的房源进行排名。对客人有吸引力,同时,就主人对旅行持续时间和提前天数的偏好而言,非常匹配。此外,我们需要检测可能因差评、宠物、入住时间、团体人数或任何其他因素而拒绝客人的房源,并将这些房源排名较低。为了实现这一点,我们求助于使用学习排名。具体来说,我们将问题表述为对预订的正效用和拒绝的负效用的成对回归,我们使用 Lambda Rank [4] 模型的修改版本对其进行优化,该模型共同优化市场双方的排名。

​ 由于客人通常在预订前进行多次搜索,即在搜索会话期间点击多个房源并联系多个房东,我们可以使用这些会话中的信号,即点击、房东联系人等进行实时个性化,其中目的是向客人展示更多与我们认为他们在开始搜索会话后喜欢的房源相似的房源。同时,我们可以使用负面信号,例如跳过排名靠前的房源,向客人展示更少与我们认为他们不喜欢的房源相似的房源。为了能够计算客人交互的列表和需要排名的候选列表之间的相似性,我们建议使用列表嵌入,从搜索会话中学习的低维向量表示。我们利用这些相似性为我们的搜索排名模型创建个性化功能,并为我们的类似房源推荐提供支持,这两个平台推动了爱彼迎 99% 的预订。

​ 除了使用可用作短期用户兴趣的代理信号的即时用户操作(例如点击)的实时个性化之外,我们还引入了另一种类型的在预订上训练的嵌入,以便能够捕捉用户的长期兴趣。由于旅行业务的性质,用户平均每年旅行 1-2 次,预订是一个稀疏信号,单次预订的用户很长。为了解决这个问题,我们建议在用户类型级别而不是特定用户 ID 级别训练嵌入,其中类型是使用利用已知用户属性的基于多对一规则的映射来确定的。同时,我们在与用户类型嵌入相同的向量空间中学习列表类型嵌入。这使我们能够计算正在进行搜索的用户的用户类型嵌入与需要排名的候选列表的列表类型嵌入之间的相似性。

​ 与之前发表的关于 Web 个性化嵌入的工作相比,本文的新贡献是:

​ • 实时个性化 - 之前使用嵌入 [8、11] 进行个性化和项目推荐的大部分工作都部署到生产中离线形成用户-项目和项目-项目推荐表,然后在推荐时从中读取。我们实施了一个解决方案,其中用户最近与之交互的项目的嵌入以在线方式组合,以计算与需要排名的项目的相似性。 • 为聚合搜索调整训练——与网络搜索不同,旅游平台上的搜索通常是聚合的,用户经常只在特定市场(例如巴黎)内搜索,很少跨越不同的市场。我们调整了嵌入训练算法以在进行负采样时考虑到这一点,这导致捕获更好的市场内列表相似性。

​ • 利用转化作为全局背景——在我们的预订案例中,我们认识到最终转化为点击会话的重要性。在学习列表嵌入时,我们将预订的列表视为全局上下文,它总是随着窗口在会话中移动而被预测。

​ • 用户类型嵌入——之前关于训练用户嵌入以捕捉他们的长期兴趣的工作 [6, 27] 为每个用户训练一个单独的嵌入。当目标信号稀疏时,没有足够的数据来为每个用户训练一个好的嵌入表示。更不用说为每个用户存储嵌入以执行在线计算需要大量内存。出于这个原因,我们建议在用户类型级别训练嵌入,其中具有相同类型的用户组将具有相同的嵌入。

​ • 拒绝作为显式否定 - 为了减少导致拒绝的推荐,我们在用户和列表类型嵌入中编码主机偏好信号,方法是在训练期间将主机拒绝视为显式否定。

​ 对于短期兴趣个性化,我们使用超过 8 亿次搜索点击会话来训练列表嵌入,从而产生高质量的列表表示。我们对真实搜索流量进行了广泛的离线和在线评估,结果表明,向排名模型添加嵌入功能会带来显着的预订收益。除了搜索排名算法外,列表嵌入已成功测试并推出类似的列表推荐,它们的点击率 (CTR) 比现有算法高出 20%。对于长期兴趣个性化,我们使用 5000 万用户的预订列表序列训练用户类型和列表类型嵌入。用户和列表类型的嵌入都是在同一个向量空间中学习的,这样我们就可以计算用户类型和需要排序的列表类型之间的相似度。相似度作为搜索排名模型的附加特征,也成功测试上线。

2 相关工作

​ 在许多自然语言处理 (NLP) 应用中,将单词表示为高维稀疏向量的经典语言建模方法已被学习单词嵌入的神经语言模型所取代,即单词的低维表示,通过使用神经网络 [25, 27]。通过直接考虑词序及其共现来训练网络,基于这样的假设,即在句子中经常一起出现的词也具有更多的统计依赖性。随着用于单词表示学习的高度可扩展的连续词袋 (CBOW) 和 skip-gram (SG) 语言模型的发展 [17],嵌入模型已被证明可以获得最先进的性能在大文本数据上训练后的许多传统语言任务。

​ 最近,嵌入的概念已经从词表示扩展到 NLP 领域之外的其他应用。来自网络搜索、电子商务和市场领域的研究人员很快意识到,就像可以通过将句子中的一系列单词作为上下文来训练词嵌入一样,同样可以训练用户操作的嵌入,例如物品被点击或购买的 [11, 18],被点击的查询和广告 [8, 9],通过将用户操作序列视为上下文。从那以后,我们看到嵌入被用于 Web 上各种类型的推荐,包括音乐推荐 [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]

3 方法

​ 在下文中,我们介绍了在 Airbnb 的搜索中列出推荐和列表排名任务的拟议方法。我们描述了两种不同的方法,即分别用于短期实时个性化的列表嵌入和用于长期个性化的用户类型和列表类型嵌入。

3.1 Listing Embeddings

​ 让我们假设我们从 N 个用户那里获得一组 S 个点击会话,其中每个会话 s = (l1, . . . , lM ) ∈ S 被定义为 M 个被点击的列表 id 的不间断序列由用户。只要两次连续用户点击之间的时间间隔超过 30 分钟,就会启动一个新会话。给定这个数据集,目的是学习每个唯一列表 li 的 d 维实值表示 vli ∈ Rd,这样相似的列表就位于嵌入空间附近。

​ 更正式地说,该模型的目标是通过在整个搜索会话集 S 上最大化目标函数 L,使用 skip-gram 模型 [17] 学习列表表示,定义如下;
L = ∑ s ∈ S ∑ l i ∈ S ( ∑ − m ≥ j ≤ m , i ≠ 0 l o g P ( l i + j ∣ l i ) ) 从 点 击 列 表 l i 的 上 下 文 邻 域 观 察 列 表 l i + j 的 概 率 P ( l i + j ∣ l i ) 是 使 用 s o f t − m a x 定 义 的 是 P ( l i + j ∣ l i ) = e x p ( v l i T v l i + j ) ∑ l = 1 ∣ V ∣ e x p ( v l i T v l ′ ) L = \sum_{s\in S}\sum_{l_i \in S}(\sum_{-m≥j≤m,i≠0}logP(l_{i+j}|l_i)) \\ 从点击列表 l_i 的上下文邻域观察列表 l_{i+j} 的概率P(l_{i+j}|l_i) 是使用 soft-max 定义的是\\ P(l_{i+j}|l_i) = \frac{exp(v_{l_i}^Tv_{l_{i+j}})} {\sum_{l=1}^{|V|}exp(v_{l_i}^Tv_l')} L=sSliS(mjm,i=0logP(li+jli))lili+jP(li+jli)使softmaxP(li+jli)=l=1Vexp(vliTvl)exp(vliTvli+j)
其中 v l v_l vl v l ′ v_l' vl; 是列表 l 的输入和输出向量表示,超参数 $m 定 义 为 点 击 列 表 的 相 关 前 瞻 和 后 视 上 下 文 ( 邻 域 ) 的 长 度 , 定义为点击列表的相关前瞻和后视上下文(邻域)的长度, V$ 是一个词汇表,定义为一组数据集中的唯一列表 ID。从 (1) 和 (2) 我们看到,所提出的方法对列表点击序列的时间上下文进行建模,其中具有相似上下文的列表(即,在搜索会话中具有相似的相邻列表)将具有相似的表示。计算(1) 中目标函数的梯度 ∇ L ∇L L 所需的时间与词汇量 ∣ V ∣ |V| V 成正比,这对于大型词汇表(例如几百万个列表id)来说是一项不可行的任务。作为替代方案,我们使用了 [17] 中提出的负采样方法,这显着降低了计算复杂度。负采样可以表述如下。我们生成一组 D p D_p Dp 的正对 $(l,c) $的点击列表 l 及其上下文 c(即,同一用户在长度为 m 的窗口内点击列表 l 之前和之后发生的其他列表的点击),以及一组 D n D_n Dn 个负对$ (l,c) $的点击列表和从整个词汇表 V 中随机抽取的 n 个列表。优化目标变为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcaqWpm8-1669957697618)

其中要学习的参数 θ 是 v l v_l vl v c v_c vc l , c ∈ V l,c ∈ V l,cV。优化是通过随机梯度上升完成的。预订列表作为全局上下文。我们可以将点击会话集合 S 分解为 1) 预订会话,即以用户预订房源结束的点击会话,以及 2) 探索会话,即不以预订结束的点击会话,即用户只是浏览.从捕获上下文相似性的角度来看,两者都是有用的,但是预订会话可用于调整优化,以便在每个步骤中我们不仅预测相邻的点击列表,而且预测最终预订的列表。这种适应可以通过将预订列表添加为全局上下文来实现,这样无论它是否在上下文窗口内,它都将始终被预测到。因此,对于预订的会话,嵌入更新规则变为

其中 v l b v_{l_b} vlb 是预订列表 l b l_b lb 的嵌入。对于探索性会话,更新仍然通过优化目标 (3) 进行。图 1 显示了如何使用大小为 2n + 1 的滑动窗口从预订会话中学习列表嵌入的图形表示,该滑动窗口从第一个点击的列表滑动到预订列表。在每一步中,中央列表 vl 的嵌入都会被更新,以便它预测来自 D p D_p Dp 的上下文列表 $v_c $和预订列表 v l b v_{l_b} vlb 的嵌入。随着窗口的滑动,一些房源进出上下文集,而预订的房源始终作为全局上下文保留在其中(虚线)。为聚合搜索调整训练。在线旅游预订网站的用户通常只在单一市场内搜索,即他们想要停留的位置。因此, D p D_p Dp 很可能包含来自同一市场的列表。另一方面,由于对负样本的随机抽样,很可能 D n D_n Dn 包含的大部分列表与 D p D_p Dp 中的列表不来自相同的市场。在每个步骤中,对于给定的中心列表 l,正面上下文主要由与 l 来自同一市场的列表组成,而负面上下文主要由与 l 来自不同市场的列表组成。我们发现这种不平衡导致学习市场内相似性的次优。为了解决这个问题,我们建议添加一组随机负值 D m n D_{m_n} Dmn,从中央列表 l 的市场中抽样,

其中要学习的参数 θ 是 v l 和 v c , l , c ∈ V v_l 和 v_c,l,c ∈ V vlvcl,cV

冷启动列表嵌入

​ 每天都有新房源由房东创建并在 Airbnb 上提供。那时这些列表没有嵌入,因为它们不存在于点击会话训练数据中。

​ 为了为新列表创建嵌入,我们建议利用其他列表的现有嵌入。创建列表后,房东需要提供有关列表的信息,例如位置、价格、列表类型等。我们使用提供的有关列表的元数据来查找 3 个地理位置最近的列表(在 10 英里半径内)嵌入,与新列表具有相同的列表类型(例如私人房间)并且属于与新列表相同的价格范围(例如每晚 20 美元 - 25 美元)。接下来,我们使用 3 个已识别列表的嵌入来计算均值向量,以形成新的列表嵌入。使用这种技术,我们能够覆盖超过 98% 的新列表。

检查列表嵌入。

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

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

​ 该工具的演示视频可在 https://youtu.be/1kJSAG91TrI 在线获取,展示了更多内容嵌入能够找到相同独特建筑的类似列表的示例,包括船屋、树屋、城堡、小木屋、海滨公寓等。

3.2 User-type & Listing-type

​ Embeddings 3.1节描述的Listing embeddings。使用点击会话训练的人非常擅长发现同一市场列表之间的相似性。因此,它们适用于短期的、会话中的个性化,其目的是向用户显示与他们在内在搜索会话期间点击的列表相似的列表。

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

​ 虽然在使用点击训练的列表嵌入中捕获了一些跨市场相似性,但学习这种跨市场相似性的更主要方法是从特定用户随时间预订的列表构建的会话中学习。具体来说,让我们假设给定了从 N 个用户获得的一组预订会话 S b S_b Sb,其中每个预订会话 s b = ( l b 1 , . . . , l b M ) s_b = (l_{b1}, . . . ,l_{bM}) sb=(lb1,...,lbM)被定义为用户 j 按时间排序的一系列列表。尝试使用这种类型的数据学习每个$ listing_id 的嵌入v_{l_{id}}$ 在许多方面都具有挑战性:

  • 首先,预订会话数据 S b S_b Sb 比点击会话数据 S 小得多,因为预订是不太频繁的事件。
  • 其次,许多用户过去只预订了一个列表,我们无法从长度为 1 的会话中学习.
  • 第三,要从上下文信息中学习任何实体的有意义的嵌入,至少需要 5 - 10 次该实体的出现数据,平台上有很多被预订不到5-10次的 l i s t i n g _ i d listing\_id listing_id。 _
  • 最后,用户两次连续预订之间可能会间隔很长的时间,并且在此期间用户偏好(例如价格点)可能会发生变化,例如由于职业变化。

为了在实践中解决这些非常常见的市场问题,我们建议在 l i s t i n g _ t y p e listing\_type listing_type级别而不是 l i s t i n g _ i d listing\_id listing_id级别学习嵌入。给定可用于特定列表 ID 的元数据,例如位置、价格、列表类型、容量、床位数量等,我们使用表 3 中定义的基于规则的映射来确定其列表类型。例如,美国的一整套房源可容纳 2 人、1 张床、1 间卧室和 1 间浴室,每晚平均价格为 60.8 美元,每位房客每晚平均价格为 29.3 美元,5 次重新浏览,均为 5 星, 100% 的新客人接受率将映射到 l i s t i n g _ t y p e = U S _ l t 1 _ p n 3 _ p g 3 _ r 3 _ 5 s 4 _ c 2 _ b 1 _ b d 2 _ b t 2 _ n u 3 listing\_type = U S\_lt_1\_pn_3\_pg_3\_r_3\_5s_4\_c_2\_b_1\_bd_2\_bt_2\_nu_3 listing_type=US_lt1_pn3_pg3_r3_5s4_c2_b1_bd2_bt2_nu3。 Buckets 以数据驱动的方式确定,以最大化每个 l i s t i n g _ t y p e listing\_type listing_typebucket 中的覆盖年龄。从 l i s t i n g _ i d listing\_id listing_id l i s t i n g _ t y p e listing\_type listing_type 的映射是多对一的映射,这意味着许多列表将映射到相同的 l i s t i n g _ t y p e listing\_type listing_type

​ 为了考虑用户随时间不断变化的偏好,我们建议在与 l i s t i n g _ t y p e listing\_type listing_type嵌入相同的向量空间中学习 user_type 嵌入。 user_type 是使用我们应用于列表的类似程序来确定的,即通过利用表 4 中定义的有关用户及其先前预订的元数据。例如,对于来自旧金山的用户,使用 MacBook 笔记本电脑,英语语言设置,完整配置文件有用户照片,83.4% 的平均客人 5 星评级来自房东,过去曾进行过 3 次预订,预订房源的平均统计数据为每晚 52.52 美元,每位客人每晚 31.85 美元,2.33 容量,8.24 条评论和 76.1 % 清单 5 星级,得到的 user_type 是 S F _ l g 1 _ d t 1 _ f p 1 _ p p 1 _ n b 1 _ p p n 2 _ p p g 3 _ c 2 _ n r 3 _ l 5 s 3 _ g 5 s 3 SF\_lg_1\_dt_1\_fp_1\_pp_1\_nb_1\_ppn_2\_ppg_3\_c_2\_nr_3\_l5s_3\_g5s_3 SF_lg1_dt1_fp1_pp1_nb1_ppn2_ppg3_c2_nr3_l5s3_g5s3。在为训练嵌入生成预订会话时,我们会计算最新预订的 user_type。对于首次预订的用户,user_type 是根据表 4 的前 5 行计算的,因为在预订时我们没有关于过去预订的先验信息。这很方便,因为基于前 5 行的 user_types 学习嵌入可用于已注销用户和没有过去预订的新用户的冷启动个性化。

训练程序

为了在同一向量空间中学习 user_type 和 l i s t i n g _ t y p e e m b e d d i n g listing\_type embedding listing_typeembedding,我们将 user_type 合并到预订会话中。具体来说,我们形成了一个集合 S b S_b Sb,其中包含来自 N 个用户的 N b N_b Nb 个预订会话,其中每个会话 s b = ( u t y p e 1 l t y p e 1 , . . . , u t y p e M l t y p e M ) ∈ S b s_b = (u_{type_1}l_{type_1}, . . .,u_{type_M} l_{type_M}) ∈ S_b sb=(utype1ltype1,...,utypeMltypeM)Sb 被定义为一系列预订事件,即 ( u s e r _ t y p e , l i s t i n g _ t y p e ) (user\_type, listing\_type) (user_type,listing_type)元组或按时间排序。请注意,每个会话都包含相同 user_id 的预订,但是对于单个 user_id,它们的 user_types 可以随时间变化,类似于同一列表的 l i s t i n g _ t y p e listing\_type listing_type 如何随着收到更多预订而随时间变化。需要优化的目标可以类似于 (3) 定义,其中需要更新的中心项目不是 listing l,而是 user_type (ut) 或 l i s t i n g _ t y p e listing\_type listing_type (lt),具体取决于哪个在滑动中被捕获窗户。例如,要更新作为 user_type (ut) 的中心项目,我们使用其中 D b o o k D_{book} Dbook 包含最近用户历史记录中的 user_type 和 l i s t i n g _ t y p e listing\_type listing_type,特别是关于中心项目时间戳的近期和近期用户预订,而 D b o o k D_{book} Dbook包含 randomuser_type or l i s t i n g _ t y p e listing\_type listing_type 实例用作底片。类似地,如果中心项目是 l i s t i n g _ t y p e listing\_type listing_type (lt),我们优化以下目标

图 5a(左侧)显示了该模型的图形表示,其中中央项代表 user_type (ut),如 (6) 中那样为其执行更新。由于根据定义,预订会话主要包含来自不同市场的列表,因此无需像我们在会话 3.1 中所做的那样,从与预订列表相同的市场中抽取额外的负样本。考虑点击会话中的聚集搜索。

拒绝的明确否定

与仅反映客人方偏好的点击不同,预订也反映房东方偏好,因为存在来自房东的明确反馈,以接受客人预订请求或拒绝客人预订请求的形式。房东拒绝的一些原因是房客星级评分不佳、房客个人资料不完整或为空、没有个人资料图片等。这些特征是表 4 中 user_type 定义的一部分。房东拒绝可以在训练期间用于将房东偏好信号编码为除了客人偏好信号之外的嵌入空间。加入拒绝信号的全部目的是一些 listinätypes 对没有预订、不完整的个人资料和低于平均客人星级的 user_types 的敏感度低于其他人,我们希望这些 listinäd_types 和 user_types 的嵌入在向量空间中更接近,这样基于嵌入相似性的推荐除了可以最大化预订机会外,还可以减少未来的拒绝。我们通过以下方式将拒绝的使用表述为明确的否定。除了集合 Dbook 和 Dneä,我们还生成了一个包含拒绝事件中涉及的 user_type 或 listinä_type 对 (ut ,lt ) 的集合 Dr ej。如图 5b(右侧)所示,我们特别关注房东拒绝(标有减号)后同一用户成功预订另一个房源(标有加号)的情况。新的优化目标可以表示为

在更新中心项目的情况下,它是一个 l i s t i n g _ t y p e listing\_type listing_type (lt)。给定所有 user_types 和 l i s t i n g _ t y p e s listing\_types listing_types的学习嵌入,我们可以根据用户当前 user_type 嵌入和候选列表的 l i s t i n g _ t y p e listing\_type listing_type嵌入之间的余弦相似性向用户推荐最相关的列表。例如,在表 5 中,我们显示了 u s e r t y p e = S F _ l g 1 _ d t 1 _ f p 1 _ p p 1 _ n b 3 _ p p n 5 _ p p g 5 _ c 4 _ n r 3 _ l 5 s 3 _ g 5 s 3 user_type = SF\_lg_1\_dt_1\_fp_1\_pp_1\_nb_3\_ppn_5\_ppg_5\_c_4\_nr_3\_l5s_3\_g5s_3 usertype=SF_lg1_dt1_fp1_pp1_nb3_ppn5_ppg5_c4_nr3_l5s3_g5s3 之间的余弦相似性,他们通常在美国预订高质量、宽敞的列表,有很多好评和几种不同的列表类型。可以看出,最符合这些用户偏好的房源类型,即整栋房源、大量好评、量大且高于平均价格,具有较高的余弦相似度,而与用户偏好不匹配的房源类型,即空间较小的房源,较低的价格和少量的评论具有较低的余弦相似度

4 实验

​ 在本节中,我们首先介绍培训 Listing Em 床上用品及其离线评估的细节。然后,我们在列表页面上显示使用列表嵌入进行类似列表推荐的在线实验结果。最后,我们介绍了搜索排名模型的背景,并描述了如何使用列表嵌入和列表类型与用户类型嵌入来实现搜索中的实时个性化功能。嵌入的两个应用程序都已成功投入生产。

4.1 训练列表嵌入

​ 对于训练列表嵌入,我们从搜索中创建了 8 亿次点击会话,方法是从登录用户那里获取所有搜索,按用户 ID 对它们进行分组,并及时对列表 ID 的点击进行排序。随后根据 30 分钟不活动规则将一个大型有序列表列表 ID 拆分为多个列表。接下来,我们删除了意外点击和短暂点击,即用户在列表页面停留时间少于 30 秒的点击,并仅保留包含 2 次或更多点击的会话。最后,通过删除用户 ID 列对会话进行匿名处理。如前所述,点击会话由探索会话和。预订的会话(以预订结束的点击序列)。鉴于离线评估结果,我们在训练数据中对预订会话进行了 5 倍的过采样,从而产生了性能最佳的列表嵌入。

​ 设置日常训练。我们学习了 450 万个 Airbnb 列表的列表嵌入,我们的训练数据实用性和参数使用下面介绍的离线评估技术进行了调整。我们的训练数据在多个月内以滑动窗口的方式每天更新,方法是处理最近一天的搜索会话并将它们添加到数据集中,并从数据集中丢弃最旧的最旧搜索会话。我们为每个 listinä_id 训练嵌入,我们在训练前随机初始化向量(每次都使用相同的随机种子)。我们发现,如果我们每天从头开始重新训练列表嵌入,而不是增量地继续对现有向量进行训练,我们将获得更好的离线性能。日常向量差异不会导致我们的模型出现差异,因为在我们的应用程序中,我们使用余弦相似度作为主要信号,而不是实际向量本身。即使向量随时间变化,余弦相似度度量的含义及其范围也不会改变。

​ 列表嵌入的维数设置为 d = 32,因为我们发现这是离线性能和将向量存储在搜索机的 RAM 内存中以进行实时相似性计算所需的内存之间的良好折衷。上下文窗口大小设置为 m = 5,我们对训练数据执行了 10 次迭代。为了实现对算法的聚合搜索更改,我们修改了原始的 word2vec c code1 。训练使用 MapReduce,其中 300 个映射器读取数据,一个 reducer 以多线程方式训练模型。端到端的日常数据生成和训练管道是使用 Airflow2 实现的,Airflow2 是 Airbnb 的开源调度平台。

4.2 列表嵌入的离线评估

​ 为了能够针对优化函数、训练数据构造、超参数等方面的不同想法做出快速决策,我们需要一种快速比较不同嵌入的方法。评估经过训练的嵌入的一种方法是,根据最近的用户点击,测试它们在推荐用户预订的房源方面有多好。更具体地说,让我们假设我们得到了最近点击的列表和需要排名的候选列表,其中包含用户最终预订的列表。通过计算点击列表和候选列表嵌入之间的余弦相似度,我们可以对候选列表进行排名并观察预订列表的排名位置。

​ 为了评估,我们使用大量此类搜索、点击和预订事件,其中排名已经分配通过我们的搜索排名模型。在图 6 中,我们显示了离线评估的结果,其中我们比较了 d = 32 em beddings 的几个版本,了解它们如何根据之前的点击对预订列表进行排名。预订房源的排名是针对导致预订的每次点击进行平均的,可以追溯到预订前的 17 次点击到预订前的最后一次点击。较低的值意味着较高的排名。我们比较的嵌入版本是 1) d32:使用 (3) 进行训练,2) d32 book:使用预订作为全局上下文进行训练 (4) 和 3) d32 book + neg:使用预订作为全局上下文进行训练,并使用来自同一市场的显式负数进行训练(5).可以观察到,搜索排名模型随着点击次数的增加而变得更好,因为它使用了记忆功能。

​ 还可以观察到,基于嵌入相似性对列表进行重新排名会很有用,尤其是在搜索漏斗的早期阶段。最后,我们可以得出结论,d32 book + neg 优于其他两个嵌入版本。相同类型的图表用于做出有关超参数、数据构建等的决策。

4.3 使用嵌入的相似房源

​ 每个Airbnb 主页房源页面3 都包含相似房源轮播,它推荐与其相似且可用于同一组日期的房源。在我们进行测试时,现有的类似列表轮播算法正在为与给定列表相同的位置调用主要搜索排名模型,然后根据给定列表的可用性、价格范围和列表类型进行过滤。

​ 我们进行了 A/B 测试,将现有的相似列表算法与基于嵌入的解决方案进行比较,在该解决方案中,相似列表是通过在列表嵌入空间中找到 k 最近邻生成的。给定已学习的列表嵌入,通过计算其向量 vl 和来自同一市场的所有列表的向量 vj 之间的余弦相似度来找到给定列表 l 的相似列表,这些列表可用于同一组日期(如果签到和签到-过期日期已定)。检索相似度最高的 K 个列表作为相似列表。计算是在线执行的,并使用我们的分片架构并行进行,其中部分嵌入存储在每个搜索机器上。

​ A/B 测试表明,基于嵌入的解决方案使类似列表轮播的点击率增加了 21%(在列表页面输入日期的情况下为 23%,在无日期页面的情况下为 20%),并且发现访客的人数增加了 4.9%他们最终在类似列表轮播中预订的列表。根据这些结果,我们将基于嵌入的相似列表部署到生产环境中。

4.4 使用嵌入在搜索排名中进行实时个性化

背景

为了正式描述我们的搜索排名模型,让我们假设我们得到了关于每个搜索的训练数据 D s = ( x i , y i ) , i = 1... K D_s = (x_i,y_i),i = 1...K Ds=(xi,yi),i=1...K,其中 K 是搜索返回的列表数量, x i x_i xi 是一个向量包含第 i 个列表结果的特征, y i ∈ { 0 , 0.01 , 0.25 , 1 , − 0.4 } y_i ∈ \{0, 0.01, 0.25, 1, −0.4\} yi{0,0.01,0.25,1,0.4} 是分配给第 i 个列表结果的标签。为了将标签分配给搜索结果中的特定房源,我们在搜索发生后等待 1 周以观察最终结果,如果房源已被预订,则可以是 y i = 1 y_i = 1 yi=1,如果房客联系房东但预订,则 y i = 0.25 y_i = 0.25 yi=0.25没有发生,y = −0.4 如果房东拒绝客人, y i = 0.01 y_i = 0.01 yi=0.01 是房源被点击, y i = 0 y_i = 0 yi=0 如果房源只是被查看但没有被点击。在等待 1 周之后,集合 D s D_s Ds 也被缩短,只保留搜索结果,直到用户点击 K c ≤ K K_c ≤ K KcK 的最后一个结果。最后,为了形成数据 D = U s = 1 N D s D = U_{s=1}^N D_s D=Us=1NDs,我们只保留至少包含一个的 D s D_s Ds 集合预订标签。每次我们训练新的排名模型时,我们都会使用最近 30 天的数据。第i个列表结果的特征向量 x i x_i xi由列表特征、用户特征、查询特征和交叉特征组成。房源特征是与房源本身相关的特征,例如每晚价格、房源类型、房间数、拒绝率等。查询特征是与发出的查询相关的特征,例如客人数量、入住时长、领先优势天等。用户特征是与执行搜索的用户相关的特征,例如平均预订价格、客人评分等。交叉特征是从以下两个或多个特征源派生的特征:列表、用户、查询。此类特征的例子有:query listing distance:查询位置与listing位置之间的距离,capacity fit:query人数与listing capacity之间的差异,price difference:listing price与用户历史预订平均价格之间的差异,rejection probability:概率该主机将拒绝这些查询参数,点击百分比:实时记忆功能,跟踪用户点击该特定列表的百分比等。该模型使用大约 100 个功能。

​ 为了简洁起见,我们不会列出所有这些。接下来,我们将问题表述为以搜索标签作为实用程序的成对回归问题,并使用数据 D 训练梯度提升决策树 (GBDT) 模型,使用经过修改以支持 Lambda Rank 的包 4。当离线评估不同的模型时,我们使用 NDCG,一个标准的排名指标,在保留的搜索会话集上,即 80% 的 D 用于训练,20% 用于测试。

​ 最后,一旦模型经过训练,它就会用于搜索列表的在线评分。为用户 u 执行的搜索查询 q 返回的每个列表计算特征向量 xi 所需的信号都是在线计算的,并且使用我们的分片架构并行进行评分。给定所有分数,列表以预测效用的降序显示给用户。

列出嵌入功能。

​ 将嵌入特征添加到我们的搜索排名模型的第一步是将 450 万个嵌入加载到我们的搜索后端,以便可以实时访问它们以进行特征计算和模型评分。接下来,我们引入了几个用户短期历史记录集,这些历史集保存了过去 2 周的用户操作,并在新用户操作发生时实时更新。该逻辑是使用 Kafka 5 实现的。具体来说,对于每个 user_id,我们收集并维护(定期更新)以下列表 id 集:

  • (1) H c H_c Hc:clicked listing_ids - 用户在过去 2 周内点击的列表。
  • (2) H l c H_{lc} Hlc : long-clicked listing_ids - 用户点击并在listing页面停留超过60秒的listing。
  • (3) H s H_s Hs: skipped listing_ids - 用户为了点击位置较低的列表而跳过的列表
  • (4) H w H_w Hw: wishlisted listing_ids - 用户在过去 2 周内添加到心愿单的列表。
  • (5) H i H_i Hi : inquired listing_ids - 用户在过去 2 周内联系但未预订的房源。
  • (6)$ H_b$ : booked listing_ids - 用户在过去 2 周内预订的房源。

我们进一步将每个短期历史集 H* 分成包含来自同一市场的列表的子集。例如,如果用户点击了纽约和洛杉矶的列表,他们的集合 Hc 将进一步拆分为 $H_c (NY) 和 H_c (LA) $。

最后,我们定义了嵌入特征,它利用定义的集合和列表嵌入来为每个候选列表生成一个分数。表 6 总结了这些特征。

在下文中,我们描述了如何使用 $H_c $ 计算 EmbClickSim 特征。表 6 顶行的其余特征使用相应的用户短期历史集 H* 以相同的方式计算。要为候选列表 $l_i $ 计算 EmbClickSim,我们需要计算其列表嵌入 $v_{li} $ 和列表在 $H_c $ 中的嵌入之间的余弦相似度。为此,我们首先计算 Hc 市场级质心嵌入。为了说明,我们假设 $H_c $ 包含 5 个来自纽约的列表和 3 个来自洛杉矶的列表。这将需要计算两个市场级别的质心嵌入,一个用于纽约,一个用于洛杉矶,方法是对来自每个市场的列表 ID 的嵌入进行平均。最后,EmbClickSim 被计算为列表嵌入 vli 和 Hc 市场级质心嵌入之间的两个相似性中的最大值。更一般地,EmbClickSim 可以表示为

其中 M 是用户点击的一组市场。除了与所有用户点击的相似性之外,我们还添加了一个功能来衡量与最新长点击的相似性,即 EmbLastLongClickSim。对于候选列表 l i l_i li,它是通过查找其嵌入 v l i v_{l_i} vli 与来自 H l c H_{lc} Hlc 的最新长按列表$ l_{last}$ 的嵌入之间的余弦相似度来计算的,

用户类型和列表类型的嵌入特性

​ 我们遵循类似的过程来引入基于用户类型和列表类型嵌入的特征。我们使用 5000 万用户预订会话为 50 万用户类型和 50 万列表类型训练了嵌入。嵌入是 d = 32 维的,并且在预订会话期间使用 m = 5 的滑动窗口进行训练。用户类型和列表类型嵌入被加载到搜索机器的内存中,这样我们就可以在线计算类型相似度。为了计算候选列表$ l_i$ 的 UserTypeListingTypeSim 特征,我们只需查找其当前列表类型 lt 以及正在进行搜索的用户的当前用户类型 ut 并计算它们嵌入之间的余弦相似度,
U s e r T y p e L i s t i n g S i m ( u t , l t ) = c o s ( v u t , v l t ) UserTypeListingSim(u_t,l_t)= cos(v_{u_t},v_{l_t}) UserTypeListingSim(ut,lt)=cos(vut,vlt)
​ 表 6 中的所有特征都记录了 30 天,因此可以将它们添加到搜索排名训练集 D 中。表 7 中报告了特征的覆盖范围,即具有特定特征的 D 的比例。正如预期的那样,它可以可以观察到,基于用户点击和跳过的特征具有最高的覆盖率。最后,我们训练了一个新的 GBDT 搜索排名模型,并添加了嵌入特征。嵌入特征的特征重要性(在 104 个特征中排名)如表 7 所示。排名靠前的特征是与用户点击的列表的相似性(EmbClick Sim:总体排名第 5)和与用户跳过的列表的相似性(EmbSkipSim:总体排名第 8)。五项嵌入功能位列前 20 名。正如预期的那样,使用所有过去用户预订的长期功能 UserType ListingTypeSim 比仅考虑过去 2 周的预订的短期功能 EmbBookSim 排名更好。这也表明,基于过去预订的推荐对于使用历史预订会话而不是点击会话进行训练的嵌入更好。

​ 为了评估模型是否学会了使用我们想要的特征,我们绘制了 3 个嵌入特征的部分依赖图:EmbClickSim、EmbSkipSim 和 UserTypeListTypeSim。这些图显示了如果我们固定除单个特征(我们正在检查的特征)以外的所有值,列表的排名分数会发生什么变化。在左边的子图中可以看到,EmbClickSim 的大值表示列表与用户最近点击的列表相似,导致模型得分更高。中间的子图显示 EmbSkipSim 的大值(表明列表与用户跳过的列表相似)导致模型得分较低。最后,右子图显示 UserTypeListingTypeSim 的较大值(表明用户类型与列表类型相似)会导致更高的模型得分,如预期的那样。

在线实验结果总结

​ 我们进行了离线和在线实验(A/B 测试)。首先,我们比较了使用和不使用嵌入特征在相同数据上训练的两个搜索排名模型。在表 8 中,我们总结了每个效用(印象、点击、拒绝和预订)的 DCU(折扣累积效用)和整体 NDCU(归一化折扣累积效用)的结果。可以观察到,添加嵌入特征导致 NDCU 提升 2.27%,其中预订 DCU 增加了 2.58%,这意味着预订房源在 hold-out 集中排名更高,没有任何拒绝(DCU -0.4 持平) ),这意味着被拒绝的列表没有比没有嵌入特征的模型排名更高。

​ 表 8 的观察结果,加上嵌入特征在 GBDT 特征重要性中排名较高的事实(表 7)以及特征行为与我们匹配的发现直觉预期(图 7)足以做出继续进行在线实验的决定。在在线实验中,我们看到了统计上显着的预订收益,并且嵌入功能已投入生产。几个月后,我们进行了一次回溯测试,我们试图删除嵌入功能,但结果是负预订,这是实时嵌入功能有效的另一个指标。

5 结论

​ 我们在 Airbnb 的搜索排名中提出了一种实时个性化的新方法。该方法基于用户点击和预订会话中的上下文共现来学习家庭列表和用户的低维表示。为了更好地利用可用的搜索上下文,我们将全局上下文和显式负面信号等概念纳入训练过程。我们在类似列表推荐和搜索排名中评估了所提出的方法。在对实时搜索流量进行成功测试后,两个嵌入应用程序都已部署到生产环境中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过去十年来,全球互联网用户的快速增长以及智能设备的技术进步,已经在互联网上带来了许多传统的公共服务,使他们能够在家中舒适的地方使用这些服务,并向社交媒体或服务提供商提供反馈网站。 现在人们可以自由,方便和频繁地表达自己的意见,从而在Internet上产生了大量的意见数据。 当今时代充满竞争,在这个竞争中,如果任何组织想要保持相关性,那么他们将不得不对用户的意见给予足够的关注,这就是公司通过利用人工智能和自然语言处理来做的。 但是,这些意见数据只能以具有大量隐藏信息的非结构化格式获得。 情感分析是NLP中具有挑战性的任务之一,在NLP中,借助机器学习算法和语言建模,可以收集,处理和利用这些意见数据为用户提供更好的服务。 在本文中,我们提出了一种利用句子中上下文信息的机器学习方法。 有很多基于机器学习的概率方法,可以根据文本数据中术语的极性将用户的评论分为正面和负面两类,但是其中大多数都独立对待意见单词,而实际上任何语言单词与其他单词都具有很强的关系,导致用于情感分析的NLP模型的精度较低。 收集的文本数据的特征表示以及机器学习模型如何从文本中学习对于构建良好的模型至关重要。 通过分布式单词矢量表示,可以在预测评论的极性时利用相邻单词的这种缺失的上下文信息。 句子或段落的极性不能视为单个术语基于其独立的正负极性的计数,而且还考虑了句子中那些对复审文档的总体情感有重要贡献的相邻单词。 我们使用神经网络对经过处理的输入用户评论数据进行情感分析,其方式是训练有素的模型应该能够高精度地预测用户情感。我们对可公开获得的高音数据集(Go,Bhayani和Huang nd)进行了实验。 NLP研究。 实验结果表明,在提供上下文信息时,神经网络模型的准确性优于其他基于词典的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值