概述
本文为阿里2018年发表论文《Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba》的阅读笔记
论文中提出了淘宝的推荐系统面临的三个挑战:扩展性、稀疏性以及冷启动。文章中提出了改进的基于知识图谱的图表示学习技术解决这三个挑战。他们使用用户在淘宝中浏览商品的session构建知识图谱。然后利用基于游走的图表示学习算法对图谱的商品节点进行向量表示学习。最后计算商品节点之间的相似度用于推荐过程中。
为了解决冷启动和稀疏性问题,他们将边信息融入到图谱表示学习当中。
- 扩展性:虽然目前很多推荐系统在小规模数据上取得很好的推荐效果,但是运用在大规模数据集上(10亿用户和20亿商品)没有效果。
- 稀疏性:在大规模商品数据中用户感兴趣的商品只有少数,因此,构建精准的推荐模型非常困难。
- 冷启动:对于一些新用户吗,在没有用户行为的情况下推荐商品非常困难。
为了解决这三个挑战,他们设计了一个分层模型:第一层为匹配;第二层为排序。在匹配层,主要是找出用户感兴趣商品的相似商品。在排序层,他们训练一个深度神经网络,根据用户的偏好为他们排出候选商品。在这篇论文中,只介绍了如何解决匹配层的问题。
在推荐系统的匹配层有三个重要的部分:
- 根据用户的的浏览商品的历史行为,使用启发式方法构建商品图谱。
- 使用三种图谱表示学习模型训练节点表示。
- 将其部署到实际应用当中验证其有效性
模型框架介绍
论文中使用了最为流行的图嵌入模型之一:DeepWalk。该模型的基本原理是通过随机游走算法生成节点序列,然后使用语言模型对节点序列训练生成节点的向量表示。详情参见博文《Graph Embedding模型【DeepWalk】学习笔记》。
构建商品图谱
如图所示,他们使用用户行为作为商品的连接关系构建商品图谱。论文表示之前的协同过滤仅仅只考虑了商品的共现性,忽视了商品的这种序列性。而这种由用户行为构建的商品序列更能表达用户的偏好。考虑到用户的行为有时效性以及计算量的问题,设置了一个时间窗口。只取1小时之内的用户行为,如图中(a)表示三个用户的行为序列,可以构建出图中(b)的商品图谱。图谱的边的权重则由用户数决定。具体地,如果一个商品到另一个商品的这个行为在同一个时间段有多个用户发生。则这两个商品的边权重就是所有发生这个行为用户的人数。最后过滤一些噪声数据,便形成了最终的商品图谱。
图表示学习模型
1、 Based Graph Embedding(基准)
论文使用的是DeepWalk模型学习图谱节点的向量表示。为了让模型能够训练带权图,对随机游走的转移概率进行了定义:
P
(
v
j
∣
v
i
)
=
{
M
i
j
∑
j
∈
N
+
(
v
i
)
M
i
j
,
v
j
∈
N
+
(
v
i
)
0
,
e
i
j
∉
ε
P(v_j|v_i)=\begin{cases} \frac{M_{ij}}{\sum\limits_{j \isin N_{+}(v_i)}M_{ij}}, & v_j \isin N_{+}(v_i)\\ 0 &,e_{ij} \not \isin \large{\varepsilon} \end{cases}
P(vj∣vi)=⎩⎨⎧j∈N+(vi)∑MijMij,0vj∈N+(vi),eij∈ε其中
N
+
(
v
i
)
N_{+}(v_i)
N+(vi)表示
v
i
v_i
vi节点的邻接节点,
M
i
j
M_{ij}
Mij表示节点
i
i
i指向节点
j
j
j的边的权重矩阵。通过随机游走便可得到如图中(c)所示的节点序列。
得到节点序列之后,便可以运用Skip-gram模型学习向量表示,其优化目标:
min
Φ
−
l
o
g
P
r
(
{
v
i
−
w
,
.
.
,
v
i
+
w
}
\
v
i
∣
Φ
(
v
i
)
)
\min _{\Phi}-log Pr(\{v_{i-w},..,v_{i+w}\} \backslash v_i|\Phi(v_i))
Φmin−logPr({vi−w,..,vi+w}\vi∣Φ(vi))其中
w
w
w表示序列中节点上下文窗口大小,根据独立分布假设
P
r
(
{
v
i
−
w
,
.
.
,
v
i
+
w
}
\
v
i
∣
Φ
(
v
i
)
)
=
∏
j
=
i
−
w
,
j
≠
i
i
+
w
P
r
(
v
j
∣
Φ
(
v
i
)
)
Pr(\{v_{i-w},..,v_{i+w}\} \backslash v_i|\Phi(v_i))=\prod_{j=i-w,j \not=i}^{i+w}Pr(v_j|\Phi(v_i))
Pr({vi−w,..,vi+w}\vi∣Φ(vi))=j=i−w,j=i∏i+wPr(vj∣Φ(vi))应用负采用算法可以将优化目标转化成:
min
Φ
l
o
g
σ
(
Φ
(
v
j
)
T
Φ
(
v
i
)
)
+
∑
t
∈
N
(
v
i
)
′
l
o
g
σ
(
−
Φ
(
v
t
)
T
Φ
(
v
i
)
)
\min_{\Phi}log\sigma(\Phi(v_j)^T\Phi(v_i))+\sum_{t\in N(v_i)'}log\sigma(-\Phi(v_t)^T\Phi(v_i))
Φminlogσ(Φ(vj)TΦ(vi))+t∈N(vi)′∑logσ(−Φ(vt)TΦ(vi))其中
N
(
v
i
)
′
N(v_i)'
N(vi)′表示节点
v
i
v_i
vi的负采样,
σ
(
)
\sigma()
σ()表示sigma函数
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1。实验表明
N
(
v
i
)
′
N(v_i)'
N(vi)′越大,结果越好。
2、 Graph Embedding with Side Information(融入边信息)
上面的模型中可以学习商品的向量表示,获取用户行为序列中的高阶相似信息,解决了协同过滤方法的缺陷。但是还并不能解决冷启动问题。于是,在图表示学习中加入边信息。
其中边信息涉及到商品类别、价格、店铺等信息,这些信息之前都是推荐系统的第二步排序层的关键信息。使用这些关键的边信息融入模型训练之后得到商品的向量表示 W \operatorname{W} W。具体地, W v 0 \operatorname{W}^0_v Wv0表示节点 v v v没有融入边信息的向量表示, W v s \operatorname{W}^s_v Wvs表示节点 v v v融入第 s s s类边信息训练得到的向量表示。有 n n n类边信息便可得到 n + 1 n+1 n+1个向量表示, W v 0 , W v 1 , . . . , W v n ∈ R d \operatorname{W}^0_v,\operatorname{W}^1_v,...,\operatorname{W}^n_v \in \R^d Wv0,Wv1,...,Wvn∈Rd, d d d表示向量维度。最后,将这些向量表示平均得到最终的商品向量表示: H v = 1 n + 1 ∑ s = 0 n W v s H_v=\frac{1}{n+1}\sum_{s=0}^n\operatorname{W}^s_v Hv=n+11s=0∑nWvs
3、Enhanced Graph Embedding with Side Information(EGES)
上面的边信息融合方法并没有考虑边信息在实际应用情况中的贡献度,为了解决这个问题,在计算最终商品向量时引入边信息的权重:
H
v
=
∑
j
=
0
n
e
a
v
j
W
v
j
∑
j
=
0
n
e
a
v
j
H_v=\frac{\sum_{j=0}^n e^{a_v^j}\operatorname{W}_v^j}{\sum_{j=0}^n e^{a_v^j}}
Hv=∑j=0neavj∑j=0neavjWvj其中
a
v
j
a_v^j
avj表示节点
v
v
v的第
j
j
j类边信息的权重。如图所示:
下面为EGES模型的算法:
对于节点
v
v
v和它的上下文节点
u
u
u的训练,使用
Z
u
∈
R
d
\operatorname{Z}_u \in \R^d
Zu∈Rd表示它们的向量表示,
y
y
y表示标签。EGES的目标优化函数:
L
(
v
,
u
,
y
)
=
−
[
y
l
o
g
(
σ
(
H
v
T
Z
u
)
)
+
(
1
−
y
)
l
o
g
(
1
−
σ
(
H
v
T
Z
u
)
)
]
L(v,u,y)=-[ylog(\sigma(\operatorname{H}_v^T\operatorname{Z}_u))+(1-y)log(1-\sigma(\operatorname{H}_v^T\operatorname{Z}_u))]
L(v,u,y)=−[ylog(σ(HvTZu))+(1−y)log(1−σ(HvTZu))]它的梯度:
∂
L
∂
Z
u
=
(
σ
(
H
v
T
Z
u
)
−
y
)
H
v
\frac{\partial L}{\partial \operatorname{Z}_u}=(\sigma(\operatorname{H}_v^T\operatorname{Z}_u)-y)\operatorname{H}_v
∂Zu∂L=(σ(HvTZu)−y)Hv对于第
s
s
s类边信息:
∂
L
∂
a
v
s
=
∂
L
∂
H
v
∂
H
v
∂
a
v
s
\frac{\partial L}{\partial a_v^s}=\frac{\partial L}{\partial \operatorname{H}_v}\frac{\partial \operatorname{H}_v}{\partial a_v^s}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad
∂avs∂L=∂Hv∂L∂avs∂Hv
=
(
σ
(
H
v
T
Z
u
)
−
y
)
Z
u
(
∑
j
=
0
n
e
a
v
j
)
e
a
v
s
W
v
s
−
e
a
v
s
∑
j
=
0
n
e
a
v
j
W
v
j
(
∑
j
=
0
n
e
a
v
j
)
2
\quad\quad\quad\quad\quad\quad=(\sigma(\operatorname{H}_v^T\operatorname{Z}_u)-y)\operatorname{Z}_u\frac{(\sum_{j=0}^n e^{a_v^j})e^{a_v^s}\operatorname{W}^s_v-e^{a_v^s}\sum_{j=0}^n e^{a_v^j}\operatorname{W}^j_v}{(\sum_{j=0}^n e^{a_v^j})^2}
=(σ(HvTZu)−y)Zu(∑j=0neavj)2(∑j=0neavj)eavsWvs−eavs∑j=0neavjWvj
∂
L
∂
W
v
s
=
∂
L
∂
H
v
∂
H
v
∂
W
v
s
\frac{\partial L}{\partial \operatorname{W}^s_v}=\frac{\partial L}{\partial \operatorname{H}_v}\frac{\partial \operatorname{H}_v}{\partial \operatorname{W}^s_v}\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad
∂Wvs∂L=∂Hv∂L∂Wvs∂Hv
=
e
a
v
s
∑
j
=
0
n
e
a
v
j
(
σ
(
H
v
T
Z
u
)
−
y
)
Z
u
=\frac{e^{a_v^s}}{\sum_{j=0}^n e^{a_v^j}}(\sigma(\operatorname{H}_v^T\operatorname{Z}_u)-y)\operatorname{Z}_u\quad\quad\quad\quad\quad\quad
=∑j=0neavjeavs(σ(HvTZu)−y)Zu其整个模型算法如下:
总结
阿里这这篇论文解决了大规模数据的问题,冷启动的问题以及稀疏度的问题,它主要是靠随机游走获取节点序列,然后借鉴语言模型,相似的商品在同一向量空间的向量表示距离更接近,使用skip-gram模型训练节点序列。