【论文阅读】 Real-time Personalization using Embeddings for Search Ranking at Airbnb
主要内容
Airbnb作为全球最大的住宿网站之一,其团队希望构建一个能够实时为用户提供个性化的房源排名的系统。
Airbnb利用word2vec模型针对用户的长期兴趣和短期兴趣分别对房源和用户做了嵌入式编码,以此编码为依据来为用户提供他们想要的房源列表。
用户的短期兴趣:对应listing embedding,与用户此次旅游决定去的地方有关
用户的长期兴趣:对应user-type embedding和listing-type embedding,与用户以往订房的习惯有关(价格,房屋位置,房屋类型等)
以下分别对这两种embedding进行讨论:
listing embedding
通过 click session数据 来生成。click session 即用户在寻找心仪的房源的过程中,依次点击浏览的房源的id
所构成的序列。在采集数据的过程中需要注意以下两点:
- 只有浏览时间超过30s的房源会被视为序列中的一个数据点保存下来。
- 当用户停止操作超过30min,序列中断,下次操作会被视为一个新的序列保存。
这种做法是为了清洗噪声点,并保证每条数据最终寻找的目标相同
接着我们就可以把一个click session看做一条句子,放入word2vec中进行训练。利用滑动窗口截取训练样本。Airbnb在训练过程中还是用了负采样技巧来降低计算量,模型的优化目标如下:
其中Dp为正样本集合,Dn为负样本集合,Vc为输入向量,Vl为输出向量。
在此基础上,Airbnb希望能够把用户最终预定的信息也加入到embedding之中,于是我们将数据按照其最后一个操作将数据分为两类:
- booked session 最后的操作是预定
- exploratory session 最后的操作仍然是点击
对于exploratory session,我们的优化目标保持不变,对于booked session,我们将用户最后预定的房源作为全局上下文来进行优化,每次除了滑动窗口内的房源,还会加上预定的房源来进行优化,于是优化目标就变成如下形式:
新加的一项即为预定房源,因为预定房源只有一个所以没有sigma符号。
同时模型结构如图:
紫色的为预定房源
同时 ,Airbnb发现负样本的集合中大多数房源来自不同的市场(例如客户想要预定的是巴黎的住房,但是很多 房源来自纽约),这样训练会导致sub-optimal(局部最优)。因此,我们需要随机选取一些和正样本处于同一市场的负样本来进行训练,于是优化目标再次变化:
新加的一项即为同市场负样本,Dmn为同市场负样本集合
通过这些训练我们就可以训练我们想要的 Listing embedding,从而得到高质量的房源展示。
冷启动嵌入:对于那些刚刚注册的新房源,Airbnb提出了一种用了一种冷启动嵌入的方法,我们会根据新房源的位置、类别和价格,找到三个与其最类似的已存在的房源,计算三个房源嵌入的向量的平均值来作为新房源的嵌入。
测试embedding
为了评估训练完的embedding捕获到了哪些特征,Airbnb还对其进行了以下测试:
- 对embedding做了k-means聚类,来确定其是否具有地理位置属性,从下图可以看出近似位置的房源都聚集在一起,我们可以得出embedding捕获了房源的地理位置属性。
- 计算了不同类型和不同价格的房源的余弦相似性(cosine similarity),发现相同类型和价格的房源之间的相似性远高于不同类型和价格的房源。因此我们也可以确定embedding捕获了这两个属性。
- Airbnb还做了一个工具用于检验embedding的效果,这个工具可以列出与当前房源相似度较高的一些房源。如下图所示
从这个图我们可以看到,相似度较高的房源几乎连风格都是一样的,说明embedding能够非常有效的表示房源的各个属性。
以上为离线训练,模型还会按照时间不断更新数据集(删掉最旧的数据,加入最新的数据)来保证embedding的时效性(real-time)
User-type & Listing-type Embedding
通过上面的listing embedding,我们可以找出同一市场内各种房屋之间的相似性,用来满足用户的短期兴趣。但是对于用户的长期兴趣,只有listing embedding还不够。比如用户之前在巴黎租过房,而现在需要在纽约找房子,这时候我们就需要考虑用户的长期兴趣(根据其以往的订房记录来考虑)。这个时候问题就出现了:
- 有些用户没有定过房,或者订房的次数很少
- 用户的需求会随着时间和其经济条件发生变化
对此Aibnb想出的解决方案如下:
对房源和人进行分类,分别对应于user_type和listing type,这样我们就有了足够的训练数据,同时训练集的每条数据都不再是单个用户对房源的预定操作,而是一类用户和一类房源的数据对,表示为(user_type,listing type),将user_type和listing type两个embedding作为参数更新,并且为了使计算的cosine距离具有实际的意义,我们将两者放在同一个语料里进行训练,从而保证他们在同一个空间内。
user-type的优化目标如下:
listing-type的优化目标如下
Dbook为一类用户与其预定的一类房源的数据对的合集,Dneg则为随机的用户类型和房源类型组合的数据对的集合
Airbnb的订房操作是双向的,也就是说仅仅用户预订房间是不够的,房东有权利拒绝预订,只有当房东接受预定后订单才算成功。
为了让用户预订房源的成功率再次提升,Airbnb把房东拒绝的可能性也考虑了进去。因此,我们需要再次修改我们的优化目标,分别是
其中Dreject表示为用户预订但被拒绝的数据集合。
最终我们的模型结构如下
运用我们上面学到的两种embedding,和用户的需求数据做一个相似度对比,排列出相似度最接近的房源,就为用户提供让他们满意的房源了。
阅读感想
- 万物皆可vector化,通过阅读这篇论文了解到了一些关于推荐算法的知识,在思想上和训练词向量是非常接近的
- 虽然word2vec是一个非监督的训练模型,但是Airbnb的团队非常巧妙的利用自己的一些需求,将向量的训练向自己需求的方向引导,做出了监督的效果。太厉害了
- 了解到了如何测试自己训练的向量是否捕捉到特征的方法
- 算是自己写的第一篇论文阅读报告,第一遍读下来还是云里雾里的,之后参考了一些别人写的解读,自己再去不断地读,再写下自己的理解,在写报告的过程中才慢慢的理解了这篇论文的内容。写阅读报告是个非常好的习惯,希望自己能够坚持下去,每周能写个一两篇。