Real-time Personalization using Embeddings for Search Ranking at Airbnb 学习笔记
- 2018年kdd的best paper
0.背景介绍
Airbnb提供了一个连接房主(host)挂出的短租房(listing)和主要是以旅游为目的的用户(guest/user,=租客,下文皆使用【用户】)的中介平台(需要注意的是在论文中房源使用的是「listing」进行表示)。Airbnb的交互方式比较简单,用户输入地点,价位,关键词等等,Airbnb会给出房源的搜索推荐列表。图一展示了Airbnb网站的示例图。
1. Airbnb交互方式
- 用户点击listing (click)
- 用户预定lising (book)
- 房主有可能拒绝用户的预定请求 (reject)
基于这样的场景和交互方式,Airbnb的要构建一个实时的个性化推荐排序模型。
2. 贡献
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所示。
- 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)∈D∑logp(c∣w)=(w,c)∈D∑logevc⋅vw−logc′∑evc′⋅vw(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)∈Dp∑logσ(vc′⋅vl)+(l,c)∈Dn∑logσ(−vc′⋅vl)(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)∈Dp∑logσ(vc′⋅vl)+(l,c)∈Dn∑logσ(−vc′⋅vl)+logσ(vlb′⋅vl)(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)∈Dp∑logσ(vc′⋅vl)+(l,c)∈Dn∑logσ(−vc′⋅vl)+logσ(vlb′⋅vl)+(l,mn)∈Dmn∑logσ(−vmn′⋅vl)(4)
其中
D
m
n
D_{m_n}
Dmn是与目标民宿相同类别(比如相同城市)的样本。
冷启动
此外,Airbnb每天都有新上的房源,但是因为其没有出现在训练集中,导致无法生出embedding,这里采用的解决办法是最相近的三个房源的平均embedding进行表示衡量房源的相近程度。
embedding检验
从图中可以看到,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(而不是每个用户、每个房源)。
举个例子,一个来自美国的房源,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)∈Dbook∑logσ(vc′⋅vut)+(ut,c)∈Dneg∑logσ(−vc′⋅vut)(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)∈Dbook∑logσ(vc′⋅vlt)+(lt,c)∈Dneg∑logσ(−vc′⋅vlt)(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)∈Dbook∑logσ(vc′⋅vut)+(ut,c)∈Dneg∑logσ(−vc′⋅vut)+(ut,lt)∈Dreject∑logσ(−vlt′⋅vut)(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)∈Dbook∑logσ(vc′⋅vlt)+(lt,c)∈Dneg∑logσ(−vc′⋅vlt)+(lt,ut)∈Dreject∑logσ(−vut′⋅vlt)(8)
4 个人公众号:四一五学习笔记
由于CSDN一直把公众号的二维码当做违规处置,故增加一个标题。公众号会不定期更新机器学习文章笔记。感兴趣的同学可以搜索【四一五学习笔记】进行关注。😁