Airbnb Embeding学习笔记

news/2024/5/19 21:50:22 标签: 算法, 推荐算法

Real-time Personalization using Embeddings for Search Ranking at Airbnb 学习笔记

  • 2018年kdd的best paper

0.背景介绍

Airbnb提供了一个连接房主(host)挂出的短租房(listing)和主要是以旅游为目的的用户(guest/user,=租客,下文皆使用【用户】)的中介平台(需要注意的是在论文中房源使用的是「listing」进行表示)。Airbnb的交互方式比较简单,用户输入地点,价位,关键词等等,Airbnb会给出房源的搜索推荐列表。图一展示了Airbnb网站的示例图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3r8TbYuH-1647101243949)(./AirbnbEmbedding/airbnb%E7%BD%91%E7%AB%99%E7%A4%BA%E4%BE%8B%E5%9B%BE.jpg)]

图一 Airbnb网站示例图
在点击某个具体的房源之后,也会有相似房源推荐,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nJK3KBrf-1647101243950)(./AirbnbEmbedding/%E7%8C%9C%E4%BD%A0%E5%96%9C%E6%AC%A2.png)]

1. Airbnb交互方式

  • 用户点击listing (click)
  • 用户预定lising (book)
  • 房主有可能拒绝用户的预定请求 (reject)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjB7YrGh-1647101243952)(./AirbnbEmbedding/%E4%BA%A4%E4%BA%92%E6%96%B9%E5%BC%8F.jpg)]

图二 Airbnb交互方式

基于这样的场景和交互方式,Airbnb的要构建一个实时的个性化推荐排序模型。

2. 贡献

  • 将“业务逻辑”融入“机器学习算法”,再把业务目标反应到算法
  • 考虑了样本稀疏问题,对用户类型embedding,而不是对单个用户embedding

3. 模型

  • 自从Word2vec出来后,迅速应用到各个领域中,夸张一点描述,万物皆可embedding。

为了捕捉到用户短期以及长期的兴趣,Airbnb并没有把用户历史的点击房源ids或者预订房源ids直接输入排序模型,而是先对用户和房源进行了embedding,进而利用embedding的结果构建出诸多特征,作为排序模型的输入。故本文重点即如何生成用户和房源的embedding

3.1 房源embedding用于短期实时个性化推荐

这一部分通过点击session数据,类似于Word2vec中Skip-gram负采样训练来构建房源的embedding。
具体如下:

符合定义

符号含义
S \mathcal{S} S N N N个用户的 S S S个点击session
s = ( l 1 , ⋯   , l M ) ∈ S s = (l_1, \cdots, l_M) \in S s=(l1,,lM)S由用户点击的 M M M个房源ids的不间断序列
(如果一个用户的两次点击之间超过30分钟进行session的截断)
$\mathbf{V} \in \mathbb{R}^d $ d d d维的实值向量
L \mathcal{L} L目标函数
V \mathcal{V} V房源唯一id的集合

使用word2vec中的skip-gram模型。如图3所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z7rXeTil-1647101243956)(./AirbnbEmbedding/%E7%94%A8%E4%BA%8E%E6%88%BF%E6%BA%90%E5%B5%8C%E5%85%A5%E7%9A%84skip-gram%E6%A8%A1%E5%9E%8B.jpg)]

图三 用于房源嵌入的skip-gram模型
  • skip-gram的目标函数
    a r g m a x θ ∑ ( w , c ) ∈ D log ⁡ p ( c ∣ w ) = ∑ ( w , c ) ∈ D log ⁡ e v c ⋅ v w − log ⁡ ∑ c ′ e v c ′ ⋅ v w (1) arg\underset{\theta }{max} \sum_{\left ( w,c \right ) \in D}{\log_{}{p(c|w)}} = \sum_{\left (w,c\right)\in D}{\log{e^{v_c\cdot v_w} - \log{\sum_{c'}{e^{v_{c'}\cdot v_w}} }}} \tag{1} argθmax(w,c)Dlogp(cw)=(w,c)Dlogevcvwlogcevcvw(1)
  • 本文目标函数
    a r g m a x θ ∑ ( l , c ) ∈ D p log ⁡ σ ( v c ′ ⋅ v l ) + ∑ ( l , c ) ∈ D n log ⁡ σ ( − v c ′ ⋅ v l ) (2) arg\underset{\theta }{max} \sum_{\left (l,c\right) \in D_p}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} + \sum_{\left (l,c\right)\in D_n}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} \tag{2} argθmax(l,c)Dplogσ(vcvl)+(l,c)Dnlogσ(vcvl)(2)
    其中 D p D_p Dp是正样本集合, D n D_n Dn是负样本集合, v l \mathbf{v_l} vl是房源 l l l的输入向量, v l ′ \mathbf{v'_l} vl是房源 l l l的输出向量表示,要学习的参数 θ \theta θ v l \mathbf{v_l} vl v c \mathbf{v_c} vc,$l,c \in \mathcal{V} $。
  • 正样本:滑动窗口内点击房源 l l l和上下文 c c c
  • 负样本:从整个房源集合中进行抽取。

针对Airbnb的业务特点(用户预订房源,房租出租房源是目标),作者在目标函数中引入预订行为。目标函数由公式2更改为公式3:
a r g m a x θ ∑ ( l , c ) ∈ D p log ⁡ σ ( v c ′ ⋅ v l ) + ∑ ( l , c ) ∈ D n log ⁡ σ ( − v c ′ ⋅ v l ) + log ⁡ σ ( v l b ′ ⋅ v l ) (3) arg\underset{\theta }{max} \sum_{\left (l,c\right) \in D_p}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} + \sum_{\left (l,c\right)\in D_n}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} + \log{\sigma \left ( \mathbf{v'_{l_b}} \cdot \mathbf{v_l} \right ) } \tag{3} argθmax(l,c)Dplogσ(vcvl)+(l,c)Dnlogσ(vcvl)+logσ(vlbvl)(3)
其中 v l b \mathbf{v_{l_b}} vlb是被预订房源的embedding。值得注意的是最后一项没有sigma符号直观理解是因为被预订的房源只有一个。

聚集性搜索进行调整

此外,在Airbnb中,用户搜索往往有特定目的,比如说搜索巴黎的民宿。然而在负采样中,负样本往往包括了所有的样本,使范围扩大,本文考虑将特定的样本(比如和目标序列相同位置的民宿)考虑进负采样中,也相当于引入一些先验“监督信息”,使模型训练效果更好,此时优化函数为公式4:
a r g m a x θ ∑ ( l , c ) ∈ D p log ⁡ σ ( v c ′ ⋅ v l ) + ∑ ( l , c ) ∈ D n log ⁡ σ ( − v c ′ ⋅ v l ) + log ⁡ σ ( v l b ′ ⋅ v l ) + ∑ ( l , m n ) ∈ D m n log ⁡ σ ( − v m n ′ ⋅ v l ) (4) arg\underset{\theta }{max} \sum_{\left (l,c\right) \in D_p}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} + \sum_{\left (l,c\right)\in D_n}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_l} \right ) }} + \log{\sigma \left ( \mathbf{v'_{l_b}} \cdot \mathbf{v_l} \right ) } + \sum_{\left (l,m_n\right) \in D_{m_n}}{\log{\sigma \left ( -\mathbf{v'_{m_n}} \cdot \mathbf{v_l} \right ) }} \tag{4} argθmax(l,c)Dplogσ(vcvl)+(l,c)Dnlogσ(vcvl)+logσ(vlbvl)+(l,mn)Dmnlogσ(vmnvl)(4)
其中 D m n D_{m_n} Dmn是与目标民宿相同类别(比如相同城市)的样本。

冷启动

此外,Airbnb每天都有新上的房源,但是因为其没有出现在训练集中,导致无法生出embedding,这里采用的解决办法是最相近的三个房源的平均embedding进行表示衡量房源的相近程度。

embedding检验

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTbTditU-1647101243957)(./AirbnbEmbedding/embedding%E6%A3%80%E9%AA%8C.jpg)]

从图中可以看到,embedding不仅编码了价格,房源类型等信息,甚至连房源风格信息都能抓住,说明即使我们不利用图片信息,也能从用户的点击行为中挖掘出相似风格的房源。

3.2 用户类型&房源类型embedding用于长期个性化推荐

3.2.1 背景

在3.1介绍了适用于短期、会话中的个性化,基于session中点击构建了房源的embedding,基于该embedding,可以很好的找出相似房源,但并没有包含用户的长期兴趣信息。比如用户6个月前订了一个listing,其中包含了该用户对于房屋价格、房屋类型等属性的长期偏好,但由于之前的embedding只使用了session级别的点击数据,从而明显丢失了用户的长期兴趣信息。

为了捕获用户长期兴趣信息,使用用户的历史预订信息,有一个假设,即用户现在的偏好房源与历史偏好是相近的,其实这也是显然的。举个例子假设用户目前正在洛杉矶搜索房源,并且过去曾在纽约和伦敦有过预订,那么推荐与之前预订的房源相似的房源会很有效。

有了用户的历史预订信息,看上去可以进行embedding了,但是由于预订信息非常非常稀疏,不可像3.1一样直接进行嵌入表示。稀疏原因如下:

  • 预订会话数据 S b S_b Sb远小于点击会话数据 S S S,因为预订是不太频繁的事件。
  • 许多用户过去只预订了一个房源,无法从长度为1的session中学习。
  • 要从上下文信息学习有意义的实体嵌入,数据中至少需要该实体出现5-10次,并且平台上有许多房源的预订次数少于5次。
  • 用户的两次连续预订之间可能会经过较长的时间间隔,用户偏好(例如价格点)可能会发生变化。

3.2.2 用户类型和房源类型

在这里插入图片描述

针对上述原因,Airbnb做了一些策略,基于属性规则对用户和房源进行聚合,然后对每类用户、每类房源学习embedding(而不是每个用户、每个房源)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEyIDTUW-1647146100229)(./AirbnbEmbedding/%E8%A7%84%E5%88%99%E5%B1%9E%E6%80%A7.jpg)]

举个例子,一个来自美国的房源,capacity为2人,beds为1张床,bedroom为1间卧室,bathroom为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 = US\_lt1\_pn3\_pg3\_r3\_5s4\_c2\_b1\_bd2\_bt2\_nu3 listing_type=US_lt1_pn3_pg3_r3_5s4_c2_b1_bd2_bt2_nu3

在这里插入图片描述

用户类型定义同理。可以看出考虑了用户的语言、设备、信息、照片、预定次数、接受价格、房价大小、评论数、星级等,考虑房源的位置、类型、价格、房间大小、卧室数量、评论数等。

3.2.3 同向量空间

有了用户类型和项目类型,(1)直接把用户类型当作原来的用户id,生成一个由房源类型组成的预订session,这种方法能够解决数据稀疏性的问题,却无法直接得到用户类型embedding。(2)让用户类型embedding和房源类型embedding在同一个向量中生成,生成预订房源列表,即可以得到用户类型,也可以得到项目类型的embedding。故而使用方式2。形式化: 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 = \left(u_{type_1}l_{type_1},\cdots,u_{type_M}l_{type_M} \right) \in \mathcal{S}_b sb=(utype1ltype1,,utypeMltypeM)Sb

用户类型和房源类型可能随时间而改变,故目标函数如下:
a r g m a x θ ∑ ( u t , c ) ∈ D b o o k log ⁡ σ ( v c ′ ⋅ v u t ) + ∑ ( u t , c ) ∈ D n e g log ⁡ σ ( − v c ′ ⋅ v u t ) (5) arg\underset{\theta }{max} \sum_{\left (u_t,c\right) \in D_{book}}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_{u_t}} \right ) }} + \sum_{\left (u_t,c\right)\in D_{neg}}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_{u_t}} \right ) }} \tag{5} argθmax(ut,c)Dbooklogσ(vcvut)+(ut,c)Dneglogσ(vcvut)(5)
a r g m a x θ ∑ ( l t , c ) ∈ D b o o k log ⁡ σ ( v c ′ ⋅ v l t ) + ∑ ( l t , c ) ∈ D n e g log ⁡ σ ( − v c ′ ⋅ v l t ) (6) arg\underset{\theta }{max} \sum_{\left (l_t,c\right) \in D_{book}}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_{l_t}} \right ) }} + \sum_{\left (l_t,c\right)\in D_{neg}}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_{l_t}} \right ) }} \tag{6} argθmax(lt,c)Dbooklogσ(vcvlt)+(lt,c)Dneglogσ(vcvlt)(6)

3.2.4 房主拒绝

由于Airbnb的业务场景,房主可以由于用户星级低、信息不完整等拒绝用户。引入拒绝负反馈信息来衡量房东的偏好。目标函数如下:

a r g m a x θ ∑ ( u t , c ) ∈ D b o o k log ⁡ σ ( v c ′ ⋅ v u t ) + ∑ ( u t , c ) ∈ D n e g log ⁡ σ ( − v c ′ ⋅ v u t ) + ∑ ( u t , l t ) ∈ D r e j e c t log ⁡ σ ( − v l t ′ ⋅ v u t ) (7) arg\underset{\theta }{max} \sum_{\left (u_t,c\right) \in D_{book}}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_{u_t}} \right ) }} + \sum_{\left (u_t,c\right)\in D_{neg}}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_{u_t}} \right ) }} + \sum_{\left (u_t,l_t\right) \in D_{reject}}{\log{\sigma \left ( -\mathbf{v'_{l_t}} \cdot \mathbf{v_{u_t}} \right ) }} \tag{7} argθmax(ut,c)Dbooklogσ(vcvut)+(ut,c)Dneglogσ(vcvut)+(ut,lt)Drejectlogσ(vltvut)(7)
a r g m a x θ ∑ ( l t , c ) ∈ D b o o k log ⁡ σ ( v c ′ ⋅ v l t ) + ∑ ( l t , c ) ∈ D n e g log ⁡ σ ( − v c ′ ⋅ v l t ) + ∑ ( l t , u t ) ∈ D r e j e c t log ⁡ σ ( − v u t ′ ⋅ v l t ) (8) arg\underset{\theta }{max} \sum_{\left (l_t,c\right) \in D_{book}}{\log{\sigma \left ( \mathbf{v'_{c}} \cdot \mathbf{v_{l_t}} \right ) }} + \sum_{\left (l_t,c\right)\in D_{neg}}{\log{\sigma \left ( - \mathbf{v'_{c}} \cdot \mathbf{v_{l_t}} \right ) }} + \sum_{\left (l_t,u_t\right) \in D_{reject}}{\log{\sigma \left ( -\mathbf{v'_{u_t}} \cdot \mathbf{v_{l_t}} \right ) }}\tag{8} argθmax(lt,c)Dbooklogσ(vcvlt)+(lt,c)Dneglogσ(vcvlt)+(lt,ut)Drejectlogσ(vutvlt)(8)

4 个人公众号:四一五学习笔记

由于CSDN一直把公众号的二维码当做违规处置,故增加一个标题。公众号会不定期更新机器学习文章笔记。感兴趣的同学可以搜索【四一五学习笔记】进行关注。😁
为什么会违规


http://www.niftyadmin.cn/n/1073963.html

相关文章

深入浅出图神经网络|GNN原理解析☄学习笔记(二)神经网络基础

《深入浅出图神经网络》GNN原理解析☄学习笔记(二)神经网络基础 文章目录《深入浅出图神经网络》GNN原理解析☄学习笔记(二)神经网络基础机器学习基本概念机器学习分类机器学习流程概述常见的损失函数神经网络神经元多层感知器激活…

VS2010-MFC(常用控件:按钮控件的编程实例)

转自:http://www.jizhuomi.com/software/184.html 因为Button控件在前面的例子中涉及到了,比较简单,本文就不作深入分析了,而是重点讲解单选按钮Radio Button、复选框Check Box的使用。 按钮控件实例的功能 首先介绍此实例实现的功…

卸料装置弹性零件的计算方法_轴承装配知识(9)--轴承配套计算方法,轴承游隙、宽度与接触角...

滚动轴承装配的主要过程有两个:第一个过程是将内圈、外圈和滚动体进行尺寸分选,保证它们之间符合规定的配合关系;第二个过程是组装,使滚动体约束在轴承的套圈内不至于散落,形成完整的机械元件。这两个过程提炼成两个字…

新闻个性化推荐综述

MIND: A Large-scale Dataset for News Recommendation ACL 2020 0. 摘要 新闻推荐是实现个性化新闻服务的一项重要技术。与已经被广泛研究的产品推荐和电影推荐相比,新闻推荐的研究非常有限,主要是因为缺乏高质量的基准数据集。本文提出了一个名为MI…

从零开始 Spring Boot 56:JPA中的一对一关系

从零开始 Spring Boot 56:JPA中的一对一关系 图源:简书 (jianshu.com) 在对数据库进行建模的时候,有些表之间是存在关联关系的,这种关联关系分为多种: 一对一一对多多对多 这篇文章将介绍如何在 JPA(Hib…

小程序仿微视_微信小程序2020-day-4 仿糗事百科

day-4 仿糗事百科app.wxss/**app.wxss**/.content {width: 100%;height: 100%;display: flex;flex-direction: column;box-sizing: border-box; }app.json{"pages":["pages/home/home"],"window":{"backgroundTextStyle":"light&…

GNN for NLP综述

图1:分类法,它沿着四个轴系统地组织NLP的GNN:图构建、图表示学习、编码器-解码器模型和applications。 摘要 深度学习已经成为处理自然语言处理(NLP)中各种任务的主要方法。尽管文本输入通常表示为一系列标记&#x…

lcl手术和飞秒区别_福利 | 近视眼可摘镜!30个全飞秒手术优惠名额等你来领

有约君说很多近视患者想摘镜,听说有全飞秒微创恢复快,但这类手术需要符合什么条件?术后会有不适感吗?可以帮助视力恢复到什么程度?……别急,有约君请来广医五院眼科主任周少博,就这些常见疑问为…