在很多推荐场景中,我们都是基于现有的用户和商品之间的一些数据,得到用户对所有商品的评分,选择高分的商品推荐给用户,这是funkSVD之类算法的做法,使用起来也很有效。但是在有些推荐场景中,我们是为了在千万级别的商品中推荐个位数的商品给用户,此时,我们更关心的是用户来说,哪些极少数商品在用户心中有更高的优先级,也就是排序更靠前。也就是说,我们需要一个排序算法,这个算法可以把每个用户对应的所有商品按喜好排序。BPR就是这样的一个我们需要的排序算法。
假设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最相似。
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)
其中 α 为学习速率。
输入:训练集 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