1.前言
在很多推荐场景中,我们都是基于现有的用户和商品之间的一些数据,得到用户对所有商品的评分,选择高分的商品推荐给用户,这是funkSVD之类算法的做法,使用起来也很有效。但是在有些推荐场景中,我们是为了在千万级别的商品中推荐个位数的商品给用户,此时,我们更关心的是用户来说,哪些极少数商品在用户心中有更高的优先级,也就是排序更靠前。也就是说,我们需要一个排序算法,这个算法可以把每个用户对应的所有商品按喜好排序。BPR就是这样的一个我们需要的排序算法。
2.问题引入
假设U是用户集合,I是项目集合。在本模型中,隐式反馈 S ⊆ U × I S \subseteq U \times I S⊆U×I 是可用的。比如购买行为,点击流等等。我们的目标是提供给用户一个个性化的推荐排序 > u ⊂ I 2 >_u \subset I^2 >u⊂I2,其中 > u >_u >u必须满足如下性质:
- 完 整 性 : ∀ i , j ∈ I : i ≠ j ⇒ i > u j ∪ j > u i 完整性:∀i,j∈I:i≠j⇒i>_{u}j∪j>_{u}i 完整性:∀i,j∈I:i=j⇒i>uj∪j>ui
- 反 对 称 性 : ∀ i , j ∈ I : i > u j ∩ j > u i ⇒ i = j 反对称性:∀i,j∈I:i>_{u}j∩j>_{u}i⇒i=j 反对称性:∀i,j∈I:i>uj∩j>ui⇒i=j
- 传 递 性 : ∀ i , j , k ∈ I : i > u j ∩ j > u k ⇒ i > u k 传递性:∀i,j,k∈I:i>_{u}j∩j>_{u}k⇒i>_{u}k 传递性:∀i,j,k∈I:i>uj∩j>uk⇒i>uk
同时,BPR也用了类似矩阵分解的模型,对于用户集
U
U
U和物品集
I
I
I对应的
U
×
I
U×I
U×I的预测排序矩阵,我们期望得到两个分解后的用户矩阵
W
(
∣
U
∣
×
k
)
W(|U|×k)
W(∣U∣×k)和物品矩阵
H
(
∣
I
∣
×
k
)
H(|I|×k)
H(∣I∣×k),满足:
X
‾
=
W
H
T
\overline{X}=WH^{T}
X=WHT
对于任意一个用户u,对应的任意一个物品i,我们预测得出的用户对该物品的偏好计算如下:
x
‾
=
w
u
⋅
h
i
=
∑
f
=
1
k
w
u
f
h
i
f
\overline{x}=w_{u}·h_{i}=\sum^{k}_{f=1}w_{uf}h_{if}
x=wu⋅hi=f=1∑kwufhif
最终我们的目标,是希望寻找合适的矩阵
W
W
W,
H
H
H,让
X
‾
\overline{X}
X和
X
X
X最相似。
3.BPR的算法原理
BPR 基于最大后验估计
P
(
W
,
H
∣
>
u
)
P(W,H|>u)
P(W,H∣>u)来求解模型参数
W
W
W,
H
H
H,这里我们用
θ
θ
θ来表示参数
W
W
W和
H
H
H,
>
u
>_{u}
>u代表用户
u
u
u对应的所有商品的全序关系,则优化目标是
P
(
θ
∣
>
u
)
P(θ|>_{u})
P(θ∣>u)。根据贝叶斯公式,我们有:
P
(
θ
∣
>
u
)
=
P
(
>
u
∣
θ
)
P
(
θ
)
P
(
>
u
)
P(θ|>_{u})=\frac{P(>_{u}|θ)P(θ)}{P(>_{u})}
P(θ∣>u)=P(>u)P(>u∣θ)P(θ)
由于我们求解假设了用户的排序和其他用户无关,那么对于任意一个用户u来说,P(>u)对所有的物品一样,所以有:
P
(
θ
∣
>
u
)
∝
P
(
>
u
∣
θ
)
P
(
θ
)
P(θ|>_{u})∝P(>_{u}|θ)P(θ)
P(θ∣>u)∝P(>u∣θ)P(θ)
公式中
P
(
θ
∣
>
u
)
P(θ|>_{u})
P(θ∣>u)是后验,
P
(
>
u
∣
θ
)
P(>_{u}|θ)
P(>u∣θ)是似然,
P
(
θ
)
P(θ)
P(θ)是先验;其中theta为所求模型,具体包括:表示用户的隐含因子矩阵P,及表达物品的隐含因子矩阵Q。
这个优化目标转化为两部分。第一部分和样本数据集D有关,第二部分和样本数据集D无关
第一部分:
对于第一部分,由于我们假设每个用户之间的偏好行为相互独立,同一用户对不同物品的偏序相互独立,所以有:
∏
u
∈
U
P
(
>
u
∣
θ
)
=
∏
(
u
,
i
,
j
)
∈
(
U
×
I
×
I
)
P
(
i
>
u
j
∣
θ
)
δ
(
(
u
,
i
,
j
)
∈
D
)
(
1
−
P
(
i
>
u
j
∣
θ
)
)
δ
(
(
u
,
j
,
i
)
∉
D
)
\prod_{u∈U}P(>_{u}|θ)=\prod_{(u,i,j)∈(U×I×I)}P(i>_{u}j|θ)^{δ((u,i,j)∈D)}(1−P(i>_{u}j|θ))^{δ((u,j,i)∉D)}
u∈U∏P(>u∣θ)=(u,i,j)∈(U×I×I)∏P(i>uj∣θ)δ((u,i,j)∈D)(1−P(i>uj∣θ))δ((u,j,i)∈/D)
其中,
δ
(
b
)
=
{
1
if b is true
0
else
δ(b)= \begin{cases} 1& \text{if b is true}\\ 0& \text{else} \end{cases}
δ(b)={10if b is trueelse
根据上面说到的完整性和反对称性,优化目标的第一部分可以简化为:
∏
u
∈
U
P
(
>
u
∣
θ
)
=
∏
(
u
,
i
,
j
)
∈
(
U
×
I
×
I
)
P
(
i
>
u
j
∣
θ
)
\prod_{u∈U}P(>_{u}|θ)=\prod_{(u,i,j)∈(U×I×I)}P(i>_{u}j|θ)
u∈U∏P(>u∣θ)=(u,i,j)∈(U×I×I)∏P(i>uj∣θ)
而对于
P
(
i
>
u
j
∣
θ
)
P(i>_{u}j|θ)
P(i>uj∣θ)这个概率,我们可以使用下面这个式子来代替:
P
(
i
>
u
j
∣
θ
)
=
σ
(
x
‾
u
i
j
(
θ
)
)
P(i>_{u}j|θ)=σ(\overline{x}_{uij}(θ))
P(i>uj∣θ)=σ(xuij(θ))
其中
σ
\sigma
σ 是logistic sigmoid函数,为了满足BPR的完整性,反对称性和传递性并且方便优化计算:
σ
(
x
)
=
1
1
+
e
−
x
σ(x)=\frac{1}{1+e^{−x}}
σ(x)=1+e−x1
现在我们的重点就转换到了优化
x
‾
u
i
j
(
θ
)
\overline{x}_{uij}(θ)
xuij(θ)上,而
x
‾
u
i
j
(
θ
)
\overline{x}_{uij}(θ)
xuij(θ)可以看做用户
u
u
u对
i
i
i和
j
j
j偏好程度的差异,我们当然希望
i
i
i和
j
j
j的差异越大越好,这种差异如何体现,最简单的就是差值:
x
‾
u
i
j
(
θ
)
=
x
‾
u
i
(
θ
)
−
x
‾
u
j
(
θ
)
\overline{x}_{uij}(θ)=\overline{x}_{ui}(θ)−\overline{x}_{uj}(θ)
xuij(θ)=xui(θ)−xuj(θ)
而
x
‾
u
i
(
θ
)
\overline{x}_{ui}(θ)
xui(θ),
x
‾
u
j
(
θ
)
\overline{x}_{uj}(θ)
xuj(θ),就是我们的矩阵
x
‾
\overline{x}
x 对应位置的值。这里为了方便,我们不写θ,这样上式可以表示为:
x
‾
u
i
j
=
x
‾
u
i
−
x
‾
u
j
\overline{x}_{uij}=\overline{x}_{ui}−\overline{x}_{uj}
xuij=xui−xuj
最终,我们的第一部分优化目标转化为:
∏
u
∈
U
P
(
>
u
∣
θ
)
=
∏
(
u
,
i
,
j
)
∈
D
σ
(
x
‾
u
i
−
x
‾
u
j
)
\prod_{u∈U}P(>_{u}|θ)=\prod_{(u,i,j)∈D}σ(\overline{x}_{ui}-\overline{x}_{uj})
u∈U∏P(>u∣θ)=(u,i,j)∈D∏σ(xui−xuj)
第二部分
假设这个概率分布符合正太分布,且对应的均值是0,协方差矩阵是λθI,即
P
(
θ
)
∼
N
(
0
,
λ
θ
I
)
P(θ)∼N(0,λ_{θ}I)
P(θ)∼N(0,λθI)
对于上面假设的这个多维正态分布,其对数和
∣
∣
θ
∣
∣
2
||θ||^{2}
∣∣θ∣∣2成正比。即:
l
n
P
(
θ
)
=
λ
θ
∣
∣
θ
∣
∣
2
lnP(θ)=λ_{θ}||θ||^{2}
lnP(θ)=λθ∣∣θ∣∣2
总结
最终对于我们的最大对数后验估计函数:
l
n
P
(
θ
∣
>
u
)
lnP(θ|>_{u})
lnP(θ∣>u)
∝ l n P ( > u ∣ θ ) P ( θ ) ∝lnP(>_{u}|θ)P(θ) ∝lnP(>u∣θ)P(θ)
= l n ∏ ( u , i , j ) ∈ D σ ( x ‾ u i − x ‾ u j ) + l n P ( θ ) =ln\prod_{(u,i,j)∈D}σ(\overline{x}_{ui}−\overline{x}_{uj})+lnP(θ) =ln∏(u,i,j)∈Dσ(xui−xuj)+lnP(θ)
= ∑ ( u , i , j ) ∈ D ( l n σ ( x ‾ u i − x ‾ u j ) − λ θ ∣ ∣ θ ∣ ∣ 2 ) =∑_{(u,i,j)∈D}(lnσ(\overline{x}_{ui}−\overline{x}_{uj})-λ_{θ}||θ||^{2}) =∑(u,i,j)∈D(lnσ(xui−xuj)−λθ∣∣θ∣∣2)
= ∑ ( u , i , j ) ∈ D ( l n σ ( x ‾ u i − x ‾ u j ) − λ θ ∣ ∣ p u ∣ ∣ 2 − λ θ ∣ ∣ q i ∣ ∣ 2 − λ θ ∣ ∣ q j ∣ ∣ 2 ) =∑_{(u,i,j)∈D}(lnσ(\overline{x}_{ui}−\overline{x}_{uj})-λ_{θ}||p_{u}||^{2}-λ_{θ}||q_{i}||^{2}-λ_{θ}||q_{j}||^{2}) =∑(u,i,j)∈D(lnσ(xui−xuj)−λθ∣∣pu∣∣2−λθ∣∣qi∣∣2−λθ∣∣qj∣∣2)
=
∑
(
u
,
i
,
j
)
∈
D
(
l
n
σ
(
p
u
⋅
q
i
−
p
u
⋅
q
j
)
−
λ
θ
∣
∣
p
u
∣
∣
2
−
λ
θ
∣
∣
q
i
∣
∣
2
−
λ
θ
∣
∣
q
j
∣
∣
2
)
=∑_{(u,i,j)∈D}(lnσ(p_{u}·q_{i}−p_{u}·q_{j})-λ_{θ}||p_{u}||^{2}-λ_{θ}||q_{i}||^{2}-λ_{θ}||q_{j}||^{2})
=∑(u,i,j)∈D(lnσ(pu⋅qi−pu⋅qj)−λθ∣∣pu∣∣2−λθ∣∣qi∣∣2−λθ∣∣qj∣∣2)
其中
λ
θ
λ_{θ}
λθ 为正则系数。对应的最小化问题变为:
a
r
g
m
i
n
∑
(
u
,
i
,
j
)
∈
D
(
λ
θ
∣
∣
p
u
∣
∣
2
+
λ
θ
∣
∣
q
i
∣
∣
2
+
λ
θ
∣
∣
q
j
∣
∣
2
−
l
n
σ
(
p
u
⋅
q
i
−
p
u
⋅
q
j
)
)
arg min ∑_{(u,i,j)∈D}(λ_{θ}||p_{u}||^{2}+λ_{θ}||q_{i}||^{2}+λ_{θ}||q_{j}||^{2}-lnσ(p_{u}·q_{i}−p_{u}·q_{j}))
argmin(u,i,j)∈D∑(λθ∣∣pu∣∣2+λθ∣∣qi∣∣2+λθ∣∣qj∣∣2−lnσ(pu⋅qi−pu⋅qj))
采用SGD求解上述最小化问题,分别针对
p
u
p_{u}
pu、
q
i
q_{i}
qi、
q
j
q_{j}
qj求偏导如下:
∂ f ∂ p u = 1 1 + e p u ⋅ q i − p u ⋅ q j ( q j − q i ) + λ p u \frac{∂f}{∂p_{u}}=\frac{1}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}(q_{j}-q_{i})+λp_{u} ∂pu∂f=1+epu⋅qi−pu⋅qj1(qj−qi)+λpu
∂ f ∂ q i = − p u 1 + e p u ⋅ q i − p u ⋅ q j + λ q i \frac{∂f}{∂q_{i}}=\frac{-p_{u}}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}+λq_{i} ∂qi∂f=1+epu⋅qi−pu⋅qj−pu+λqi
∂ f ∂ q j = p u 1 + e p u ⋅ q i − p u ⋅ q j + λ q j \frac{∂f}{∂q_{j}}=\frac{p_{u}}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}+λq_{j} ∂qj∂f=1+epu⋅qi−pu⋅qjpu+λqj
模型迭代求解的公式如下:
p
u
=
p
u
−
α
(
1
1
+
e
p
u
⋅
q
i
−
p
u
⋅
q
j
(
q
j
−
q
i
)
+
λ
p
u
)
p_{u}=p_{u}-α(\frac{1}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}(q_{j}-q_{i})+λp_{u})
pu=pu−α(1+epu⋅qi−pu⋅qj1(qj−qi)+λpu)
q i = q i − α ( − p u 1 + e p u ⋅ q i − p u ⋅ q j + λ q i ) q_{i}=q_{i}-α(\frac{-p_{u}}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}+λq_{i}) qi=qi−α(1+epu⋅qi−pu⋅qj−pu+λqi)
q j = q j − α ( p u 1 + e p u ⋅ q i − p u ⋅ q j + λ q j ) q_{j}=q_{j}-α(\frac{p_{u}}{1+e^{p_{u}·q_{i}−p_{u}·q_{j}}}+λq_{j}) qj=qj−α(1+epu⋅qi−pu⋅qjpu+λqj)
其中 α 为学习速率。
4.算法流程
输入:训练集
D
D
D三元组,梯度步长
α
α
α, 正则化参数
λ
λ
λ,分解矩阵维度
k
k
k。
输出:模型参数,矩阵
W
W
W,
H
H
H
1. 随机初始化矩阵
W
W
W,
H
H
H
2. 迭代更新模型参数:
w
u
f
=
w
u
f
+
α
(
∑
(
u
,
i
,
j
)
∈
D
1
1
+
e
x
‾
u
i
−
x
‾
u
j
(
h
i
f
−
h
j
f
)
+
λ
w
u
f
)
w_{uf}=w_{uf}+α(∑_{(u,i,j)∈D}\frac{1}{1+e^{\overline{x}_{ui}−\overline{x}_{uj}}}(h_{if}−h_{jf})+λw_{uf})
wuf=wuf+α((u,i,j)∈D∑1+exui−xuj1(hif−hjf)+λwuf)
h
i
f
=
h
i
f
+
α
(
∑
(
u
,
i
,
j
)
∈
D
1
1
+
e
x
‾
u
i
−
x
‾
u
j
w
u
f
+
λ
h
i
f
)
h_{if}=h_{if}+α(∑_{(u,i,j)∈D}\frac{1}{1+e^{\overline{x}_{ui}−\overline{x}_{uj}}}w_{uf}+λh_{if})
hif=hif+α((u,i,j)∈D∑1+exui−xuj1wuf+λhif)
h
j
f
=
h
j
f
+
α
(
∑
(
u
,
i
,
j
)
∈
D
1
1
+
e
x
‾
u
i
−
x
‾
u
j
(
−
w
u
f
)
+
λ
h
j
f
)
h_{jf}=h_{jf}+α(∑_{(u,i,j)∈D}\frac{1}{1+e^{\overline{x}_{ui}−\overline{x}_{uj}}}(−w_{uf})+λh_{jf})
hjf=hjf+α((u,i,j)∈D∑1+exui−xuj1(−wuf)+λhjf)
3. 如果
W
W
W,
H
H
H收敛,则算法结束,输出
W
W
W,
H
H
H,否则回到步骤2.
当我们拿到
W
W
W,
H
H
H后,就可以计算出每一个用户u对应的任意一个商品的排序分:
x
‾
u
i
=
w
u
∙
h
i
\overline{x}_{ui}=w_{u}∙h_{i}
xui=wu∙hi,最终选择排序分最高的若干商品输出。
参考文献
1.https://www.datalearner.com/paper_note/content/300025
2.https://www.cnblogs.com/pinard/p/9128682.html
3.https://www.jianshu.com/p/ba1936ee0b69
4.https://blog.csdn.net/sigmeta/article/details/80517828