前言
排序推荐算法历史很悠久,早在做信息检索的各种产品中就已经在使用了,排序推荐算法大体上可以分为三类
- 第一类排序算法类别是点对方法(Pointwise Approach),这类算法将排序问题被转化为分类、回归之类的问题,并使用现有分类、回归等方法进行实现
- 第二类排序算法是成对方法(Pairwise Approach),在序列方法中,排序被转化为对序列分类或对序列回归。所谓的pair就是成对的排序,比如(a,b)一组表明a比b排的靠前。BPR就属于这一类。
- 第三类排序算法是列表方法(Listwise Approach),它采用更加直接的方法对排序问题进行了处理。它在学习和预测过程中都将排序列表作为一个样本。排序的组结构被保持。
BPR
基本概念
BPR算法将任意用户u对应的物品进行标记,如果用户u在同时有物品i和j的之后点击了i,那么我们得到了一个三元组 <u,i,j> 这个三元组表示对用户u来说,i的排序要比j靠前,如果对于用户u来说我们有m组这样的反馈,那么我们就可以得到m组用户u对应的训练样本。
贝叶斯排序,听他的名字我们便知道和贝叶斯肯定有关系,我们现在需要两个假设:
1. 一是每个用户之间的偏好行为相互独立,即用户u在商品i和j之间的偏好和其他用户无关。
2. 二是同一用户对不同物品的偏序相互独立,也就是用户u在商品i和j之间的偏好和其他的商品无关。
下面我们为了描述方便使用符号>u来描述用户u的偏好,上面的<u,i,j>可以表示为:i>uj
BPR中,我们用到的类似于矩阵分解的思想,对于用户集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 这里的k和funkSVD类似,也是自己定义的,一般远远小于 ∣ U ∣ , ∣ I ∣ |U|,|I| ∣U∣,∣I∣。
由于BPR是基于用户维度的,所以对于任意一个用户u,对应的任意一个物品i我们期望有: x ‾ u i = w u ∙ h i = ∑ f = 1 k w u f h i f \overline{x}_{ui} = w_u \bullet h_i = \sum\limits_{f=1}^kw_{uf}h_{if} xui=wu∙hi=f=1∑kwufhif我们最终的目的是希望寻找合适的矩阵W,H,让 X ‾ \overline{X} X和 X X X最相似。读到这里,也许你会说,这和funkSVD之类的矩阵分解模型没有什么区别啊? 的确,现在还看不出,下面我们来看看BPR的算法优化思路,就会慢慢理解和funkSVD有什么不同了。
BPR最优化算法推导
BPR 基于最大后验估计 P ( W , H ∣ > u ) P(W,H|>_u) P(W,H∣>u)来求解模型参数 W , H W,H W,H下面的公式中, θ \theta θ表示参数 W , H W,H W,H , > u >_u >u表示用户u对应的所有商品的全序关系,我们现在的优化目标是 P ( θ ∣ > u ) P(\theta|>_u) P(θ∣>u),而这里便用到了贝叶斯公式,如下: P ( θ ∣ > u ) = P ( > u ∣ θ ) P ( θ ) P ( > u ) P(\theta|>_u) = \frac{P(>_u|\theta)P(\theta)}{P(>_u)} P(θ∣>u)=P(>u)P(>u∣θ)P(θ)
我们在前面已经假设了用户之间的偏好,用户对物品的偏好都是相互独立的,正因为所具有的独立性,我们才能使用贝叶斯公式进一步推导,也正因为我们已经假设了用户的排序和其他用户无关,因此,对于任意一个用户u来说, P ( > u ) P(>_u) P(>u)对所有的物品来说又是一样的,因此我们可以得到下面的公式 P ( θ ∣ > u ) ∝ P ( > u ∣ θ ) P ( θ ) P(\theta|>_u) \propto P(>_u|\theta)P(\theta) P(θ∣>u)∝P(>u∣θ)P(θ)因此我们现在的优化目标就转到了对 P ( θ ∣ > u ) ∝ P ( > u ∣ θ ) P ( θ ) P(\theta|>_u) \propto P(>_u|\theta)P(\theta) P(θ∣>u)∝P(>u∣θ)P(θ)
我们可以将公式 P ( θ ∣ > u ) ∝ P ( > u ∣ θ ) P ( θ ) P(\theta|>_u) \propto P(>_u|\theta)P(\theta) P(θ∣>u)∝P(>u∣θ)P(θ)的优化分为两部分 ,第一部分和样本数据集D有关,第二部分和样本数据集D无关。
- 对 P ( > u ∣ θ ) P(>_u|\theta) P(>u∣θ)
- 对 P ( θ ) P(\theta) P(θ)
首先我们先看第一部分
对于第一部分,由于我们假设每个用户之间的偏好行为相互独立,同一用户对不同物品的偏序相互独立,所以有: ∏ 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 \in U}P(>_u|\theta) = \prod_{(u,i,j) \in (U \times I \times I)}P(i >_u j|\theta)^{\delta((u,i,j) \in D)}(1-P(i >_u j|\theta))^{\delta((u,j,i) \not\in 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 i f    b    i s    t r u e 0 e l s e \delta(b)= \begin{cases} 1& {if\; b\; is \;true}\\ 0& {else} \end{cases} δ(b)={10ifbistrueelse补充这里讲一下排序公式 > u >_u >u的完全性,反对称性和传递性
1. 完整性: ∀ i , j ∈ I : i ≠ j ⇒ i > u j    ∪    j > u i \forall i,j \in I: i \neq j \Rightarrow i >_u j\; \cup\; j>_u i ∀i,j∈I:i̸=j⇒i>uj∪j>ui
2. 反对成性 ∀ i , j ∈ I : i > u j    ∩    j > u i ⇒ i = j \forall i,j \in I: i >_u j\; \cap\; j>_u i \Rightarrow i=j ∀i,j∈I:i>uj∩j>ui⇒i=j
3. 传递性 ∀ i , j , k ∈ I : i > u j    ∩    j > u k ⇒ i > u k \forall i,j,k \in I: i >_u j\; \cap\; j>_u k \Rightarrow i>_uk ∀i,j,k∈I:i>uj∩j>uk⇒i>uk
由于第一部分的样本数据集合D有关,根据上面讲到的完整性和反对称性,优化目标的第一部分可以简化为: ∏ u ∈ U P ( > u ∣ θ ) = ∏ ( u , i , j ) ∈ D P ( i > u j ∣ θ ) \prod_{u \in U}P(>_u|\theta) = \prod_{(u,i,j) \in D}P(i >_u j|\theta) u∈U∏P(>u∣θ)=(u,i,j)∈D∏P(i>uj∣θ)而对于 P ( i > u j ∣ θ ) P(i>uj|θ) P(i>uj∣θ)这个概率,我们可以使用下面这个式子来代替: P ( i > u j ∣ θ ) = σ ( x ‾ u i j ( θ ) ) P(i >_u j|\theta) = \sigma(\overline{x}_{uij}(\theta)) P(i>uj∣θ)=σ(xuij(θ))
这里的 σ ( x ) \sigma(x) σ(x)是sigmoid函数。在这里我们不一定非要用sigmoid函数,还可以使用其他的函数,这里不一一列举。
我们现在继续分解,对于式子 x ‾ u i j ( θ ) \overline{x}_{uij}(\theta) xuij(θ)我们要满足当 i > u j i >_u j i>uj时, x ‾ u i j ( θ ) > 0 \overline{x}_{uij}(\theta) > 0 xuij(θ)>0,反之,当 j > u j>_u j>u时, x ‾ u i j ( θ ) < 0 \overline{x}_{uij}(\theta) < 0 xuij(θ)<0,最简单的表示这个性质的方法就是(下面的式子我也不太明白,暂时记住就行) x ‾ u i j ( θ ) = x ‾ u i ( θ ) − x ‾ u j ( θ ) \overline{x}_{uij}(\theta) = \overline{x}_{ui}(\theta) - \overline{x}_{uj}(\theta) xuij(θ)=xui(θ)−xuj(θ)
而 x ‾ u i ( θ ) , x ‾ u j ( θ ) \overline{x}_{ui}(\theta) , \overline{x}_{uj}(\theta) xui(θ),xuj(θ),就是我们的矩阵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 \in U}P(>_u|\theta) = \prod_{(u,i,j) \in D} \sigma(\overline{x}_{ui} - \overline{x}_{uj}) u∈U∏P(>u∣θ)=(u,i,j)∈D∏σ(xui−xuj)
接下来我们对第二部分进行优化推导
这里原作者大胆的使用了贝叶斯假设,即这个概率分布符合正态分布,且对应的均值为0,协方差矩阵是 λ θ I \lambda_{\theta}I λθI,即 P ( θ ) ∼ N ( 0 , λ θ I ) P(\theta) \sim N(0, \lambda_{\theta}I) P(θ)∼N(0,λθI)为什么这么假设呢,这里认为是为了方便优化,在后面左右画室,需要计算 l n P ( θ ) lnP(\theta) lnP(θ),对于上面假设的这个多维正态分布,其对数和 ∣ ∣ θ ∣ ∣ 2 ||θ||^2 ∣∣θ∣∣2成正比。即: l n P ( θ ) = λ ∣ ∣ θ ∣ ∣ 2 lnP(\theta) = \lambda||\theta||^2 lnP(θ)=λ∣∣θ∣∣2
最终最大对数后延估计函数 l n    P ( θ ∣ > u ) ∝ l n    P ( > u ∣ θ ) P ( θ ) = l n    ∏ ( u , i , j ) ∈ D σ ( x ‾ u i − x ‾ u j ) + l n P ( θ ) = ∑ ( u , i , j ) ∈ D l n σ ( x ‾ u i − x ‾ u j ) + λ ∣ ∣ θ ∣ ∣ 2    ln\;P(\theta|>_u) \propto ln\;P(>_u|\theta)P(\theta) = ln\;\prod\limits_{(u,i,j) \in D} \sigma(\overline{x}_{ui} - \overline{x}_{uj}) + ln P(\theta) = \sum\limits_{(u,i,j) \in D}ln\sigma(\overline{x}_{ui} - \overline{x}_{uj}) + \lambda||\theta||^2\; lnP(θ∣>u)∝lnP(>u∣θ)P(θ)=ln(u,i,j)∈D∏σ(xui−xuj)+lnP(θ)=(u,i,j)∈D∑lnσ(xui−xuj)+λ∣∣θ∣∣2用梯度上升法或者牛顿法等方法来优化求解模型参数。这里用梯度上升法,对θ求导,我们有: ∂ l n    P ( θ ∣ > u ) ∂ θ ∝ ∑ ( u , i , j ) ∈ D 1 1 + e x ‾ u i − x ‾ u j ∂ ( x ‾ u i − x ‾ u j ) ∂ θ + λ θ \frac{\partial ln\;P(\theta|>_u)}{\partial \theta} \propto \sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}\frac{\partial (\overline{x}_{ui} - \overline{x}_{uj})}{\partial \theta} + \lambda \theta ∂θ∂lnP(θ∣>u)∝(u,i,j)∈D∑1+exui−xuj1∂θ∂(xui−xuj)+λθ
又由于 x ‾ u i − x ‾ u j = ∑ f = 1 k w u f h i f − ∑ f = 1 k w u f h j f \overline{x}_{ui} - \overline{x}_{uj} = \sum\limits_{f=1}^kw_{uf}h_{if} - \sum\limits_{f=1}^kw_{uf}h_{jf} xui−xuj=f=1∑kwufhif−f=1∑kwufhjf因此我们可以求出 ∂ ( x ‾ u i − x ‾ u j ) ∂ θ = { ( h i f − h j f ) i f    θ = w u f w u f i f    θ = h i f − w u f i f    θ = h j f \frac{\partial (\overline{x}_{ui} - \overline{x}_{uj})}{\partial \theta} = \begin{cases} (h_{if}-h_{jf})& {if\; \theta = w_{uf}}\\ w_{uf}& {if\;\theta = h_{if}} \\ -w_{uf}& {if\;\theta = h_{jf}}\end{cases} ∂θ∂(xui−xuj)=⎩⎪⎨⎪⎧(hif−hjf)wuf−wufifθ=wufifθ=hififθ=hjf
BPR算法流程
BPR的算法训练流程如下
输入:训练集D三元组,梯度步长α, 正则化参数λ,分解矩阵维度k。
输出:模型参数,矩阵W,H
1. 随机初始化矩阵W,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} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}(h_{if}-h_{jf}) + \lambda 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} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}w_{uf} + \lambda 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} + \alpha(\sum\limits_{(u,i,j) \in D} \frac{1}{1+e^{\overline{x}_{ui} - \overline{x}_{uj}}}(-w_{uf}) + \lambda h_{jf}) hjf=hjf+α((u,i,j)∈D∑1+exui−xuj1(−wuf)+λhjf)
3. 如果W,H收敛,则算法结束,输出W,H,否则回到步骤2.
当我们拿到W,H后,就可以计算出每一个用户u对应的任意一个商品的排序分: x ‾ u i = w u ∙ h i \overline{x}_{ui} = w_u \bullet h_i xui=wu∙hi,最终选择排序分最高的若干商品输出。