贝叶斯个性化排序(BPR)

本文深入解析了Bayesian Personalized Ranking(BPR)算法,一种基于成对比较的推荐系统排序算法。文章详细阐述了BPR的基本概念,包括其如何通过用户反馈生成训练样本,以及贝叶斯假设下用户偏好的独立性。此外,还介绍了BPR的优化过程,包括最大后验估计的推导,以及如何使用梯度上升法求解模型参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

排序推荐算法历史很悠久,早在做信息检索的各种产品中就已经在使用了,排序推荐算法大体上可以分为三类

  • 第一类排序算法类别是点对方法(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‾=WHT\overline{X} =WH^TX=WHT 这里的k和funkSVD类似,也是自己定义的,一般远远小于∣U∣,∣I∣|U|,|I|U,I
由于BPR是基于用户维度的,所以对于任意一个用户u,对应的任意一个物品i我们期望有:x‾ui=wu∙hi=∑f=1kwufhif\overline{x}_{ui} = w_u \bullet h_i = \sum\limits_{f=1}^kw_{uf}h_{if}xui=wuhi=f=1kwufhif我们最终的目的是希望寻找合适的矩阵W,H,让X‾\overline{X}XXXX最相似。读到这里,也许你会说,这和funkSVD之类的矩阵分解模型没有什么区别啊? 的确,现在还看不出,下面我们来看看BPR的算法优化思路,就会慢慢理解和funkSVD有什么不同了。

BPR最优化算法推导

BPR 基于最大后验估计P(W,H∣&gt;u)P(W,H|&gt;_u)P(W,H>u)来求解模型参数W,HW,HW,H下面的公式中,θ\thetaθ表示参数W,HW,HW,H ,     &gt;u&gt;_u>u表示用户u对应的所有商品的全序关系,我们现在的优化目标是P(θ∣&gt;u)P(\theta|&gt;_u)P(θ>u),而这里便用到了贝叶斯公式,如下:P(θ∣&gt;u)=P(&gt;u∣θ)P(θ)P(&gt;u)P(\theta|&gt;_u) = \frac{P(&gt;_u|\theta)P(\theta)}{P(&gt;_u)}P(θ>u)=P(>u)P(>uθ)P(θ)

我们在前面已经假设了用户之间的偏好,用户对物品的偏好都是相互独立的,正因为所具有的独立性,我们才能使用贝叶斯公式进一步推导,也正因为我们已经假设了用户的排序和其他用户无关,因此,对于任意一个用户u来说,P(&gt;u)P(&gt;_u)P(>u)对所有的物品来说又是一样的,因此我们可以得到下面的公式P(θ∣&gt;u)∝P(&gt;u∣θ)P(θ)P(\theta|&gt;_u) \propto P(&gt;_u|\theta)P(\theta)P(θ>u)P(>uθ)P(θ)因此我们现在的优化目标就转到了对 P(θ∣&gt;u)∝P(&gt;u∣θ)P(θ)P(\theta|&gt;_u) \propto P(&gt;_u|\theta)P(\theta)P(θ>u)P(>uθ)P(θ)

我们可以将公式 P(θ∣&gt;u)∝P(&gt;u∣θ)P(θ)P(\theta|&gt;_u) \propto P(&gt;_u|\theta)P(\theta)P(θ>u)P(>uθ)P(θ)的优化分为两部分 ,第一部分和样本数据集D有关,第二部分和样本数据集D无关。

  1. P(&gt;u∣θ)P(&gt;_u|\theta)P(>uθ)
  2. P(θ)P(\theta)P(θ)

首先我们先看第一部分

对于第一部分,由于我们假设每个用户之间的偏好行为相互独立,同一用户对不同物品的偏序相互独立,所以有:∏u∈UP(&gt;u∣θ)=∏(u,i,j)∈(U×I×I)P(i&gt;uj∣θ)δ((u,i,j)∈D)(1−P(i&gt;uj∣θ))δ((u,j,i)̸∈D)\prod_{u \in U}P(&gt;_u|\theta) = \prod_{(u,i,j) \in (U \times I \times I)}P(i &gt;_u j|\theta)^{\delta((u,i,j) \in D)}(1-P(i &gt;_u j|\theta))^{\delta((u,j,i) \not\in D) }uUP(>uθ)=(u,i,j)(U×I×I)P(i>ujθ)δ((u,i,j)D)(1P(i>ujθ))δ((u,j,i)̸D)其中δ(b)={1if&ThickSpace;b&ThickSpace;is&ThickSpace;true0else\delta(b)= \begin{cases} 1&amp; {if\; b\; is \;true}\\ 0&amp; {else} \end{cases}δ(b)={10ifbistrueelse补充这里讲一下排序公式&gt;u&gt;_u>u的完全性,反对称性和传递性

1. 完整性:∀i,j∈I:i≠j⇒i&gt;uj&ThickSpace;∪&ThickSpace;j&gt;ui\forall i,j \in I: i \neq j \Rightarrow i &gt;_u j\; \cup\; j&gt;_u ii,jI:i̸=ji>ujj>ui
2. 反对成性∀i,j∈I:i&gt;uj&ThickSpace;∩&ThickSpace;j&gt;ui⇒i=j\forall i,j \in I: i &gt;_u j\; \cap\; j&gt;_u i \Rightarrow i=ji,jI:i>ujj>uii=j
3. 传递性∀i,j,k∈I:i&gt;uj&ThickSpace;∩&ThickSpace;j&gt;uk⇒i&gt;uk\forall i,j,k \in I: i &gt;_u j\; \cap\; j&gt;_u k \Rightarrow i&gt;_uki,j,kI:i>ujj>uki>uk

由于第一部分的样本数据集合D有关,根据上面讲到的完整性和反对称性,优化目标的第一部分可以简化为:∏u∈UP(&gt;u∣θ)=∏(u,i,j)∈DP(i&gt;uj∣θ)\prod_{u \in U}P(&gt;_u|\theta) = \prod_{(u,i,j) \in D}P(i &gt;_u j|\theta)uUP(>uθ)=(u,i,j)DP(i>ujθ)而对于P(i&gt;uj∣θ)P(i&gt;uj|θ)P(i>ujθ)这个概率,我们可以使用下面这个式子来代替:P(i&gt;uj∣θ)=σ(x‾uij(θ))P(i &gt;_u j|\theta) = \sigma(\overline{x}_{uij}(\theta))P(i>ujθ)=σ(xuij(θ))
这里的σ(x)\sigma(x)σ(x)是sigmoid函数。在这里我们不一定非要用sigmoid函数,还可以使用其他的函数,这里不一一列举。

我们现在继续分解,对于式子x‾uij(θ)\overline{x}_{uij}(\theta)xuij(θ)我们要满足当i&gt;uji &gt;_u ji>uj时,x‾uij(θ)&gt;0\overline{x}_{uij}(\theta) &gt; 0xuij(θ)>0,反之,当j&gt;uj&gt;_uj>u时,x‾uij(θ)&lt;0\overline{x}_{uij}(\theta) &lt; 0xuij(θ)<0,最简单的表示这个性质的方法就是(下面的式子我也不太明白,暂时记住就行)x‾uij(θ)=x‾ui(θ)−x‾uj(θ)\overline{x}_{uij}(\theta) = \overline{x}_{ui}(\theta) - \overline{x}_{uj}(\theta)xuij(θ)=xui(θ)xuj(θ)
x‾ui(θ),x‾uj(θ)\overline{x}_{ui}(\theta) , \overline{x}_{uj}(\theta)xui(θ),xuj(θ),就是我们的矩阵X¯¯¯¯对应位置的值。这里为了方便,我们不写θ,这样上式可以表示为:x‾uij=x‾ui−x‾uj\overline{x}_{uij} = \overline{x}_{ui} - \overline{x}_{uj}xuij=xuixuj

最终我们可以将第一部分的优化目标转化为:∏u∈UP(&gt;u∣θ)=∏(u,i,j)∈Dσ(x‾ui−x‾uj)\prod_{u \in U}P(&gt;_u|\theta) = \prod_{(u,i,j) \in D} \sigma(\overline{x}_{ui} - \overline{x}_{uj})uUP(>uθ)=(u,i,j)Dσ(xuixuj)

接下来我们对第二部分进行优化推导

这里原作者大胆的使用了贝叶斯假设,即这个概率分布符合正态分布,且对应的均值为0,协方差矩阵是λθI\lambda_{\theta}IλθI,即P(θ)∼N(0,λθI)P(\theta) \sim N(0, \lambda_{\theta}I)P(θ)N(0,λθI)为什么这么假设呢,这里认为是为了方便优化,在后面左右画室,需要计算lnP(θ)lnP(\theta)lnP(θ),对于上面假设的这个多维正态分布,其对数和∣∣θ∣∣2||θ||^2θ2成正比。即:lnP(θ)=λ∣∣θ∣∣2lnP(\theta) = \lambda||\theta||^2lnP(θ)=λθ2

最终最大对数后延估计函数ln&ThickSpace;P(θ∣&gt;u)∝ln&ThickSpace;P(&gt;u∣θ)P(θ)=ln&ThickSpace;∏(u,i,j)∈Dσ(x‾ui−x‾uj)+lnP(θ)=∑(u,i,j)∈Dlnσ(x‾ui−x‾uj)+λ∣∣θ∣∣2&ThickSpace;ln\;P(\theta|&gt;_u) \propto ln\;P(&gt;_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σ(xuixuj)+lnP(θ)=(u,i,j)Dlnσ(xuixuj)+λθ2用梯度上升法或者牛顿法等方法来优化求解模型参数。这里用梯度上升法,对θ求导,我们有:∂ln&ThickSpace;P(θ∣&gt;u)∂θ∝∑(u,i,j)∈D11+ex‾ui−x‾uj∂(x‾ui−x‾uj)∂θ+λθ\frac{\partial ln\;P(\theta|&gt;_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)D1+exuixuj1θ(xuixuj)+λθ
又由于x‾ui−x‾uj=∑f=1kwufhif−∑f=1kwufhjf\overline{x}_{ui} - \overline{x}_{uj} = \sum\limits_{f=1}^kw_{uf}h_{if} - \sum\limits_{f=1}^kw_{uf}h_{jf}xuixuj=f=1kwufhiff=1kwufhjf因此我们可以求出∂(x‾ui−x‾uj)∂θ={(hif−hjf)if&ThickSpace;θ=wufwufif&ThickSpace;θ=hif−wufif&ThickSpace;θ=hjf\frac{\partial (\overline{x}_{ui} - \overline{x}_{uj})}{\partial \theta} = \begin{cases} (h_{if}-h_{jf})&amp; {if\; \theta = w_{uf}}\\ w_{uf}&amp; {if\;\theta = h_{if}} \\ -w_{uf}&amp; {if\;\theta = h_{jf}}\end{cases}θ(xuixuj)=(hifhjf)wufwufifθ=wufifθ=hififθ=hjf

BPR算法流程

BPR的算法训练流程如下
输入:训练集D三元组,梯度步长α, 正则化参数λ,分解矩阵维度k。          
输出:模型参数,矩阵W,H
   1. 随机初始化矩阵W,H
   2. 迭代更新模型参数:wuf=wuf+α(∑(u,i,j)∈D11+ex‾ui−x‾uj(hif−hjf)+λwuf)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)D1+exuixuj1(hifhjf)+λwuf) hif=hif+α(∑(u,i,j)∈D11+ex‾ui−x‾ujwuf+λhif)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)D1+exuixuj1wuf+λhif) hjf=hjf+α(∑(u,i,j)∈D11+ex‾ui−x‾uj(−wuf)+λhjf)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)D1+exuixuj1(wuf)+λhjf)
   3. 如果W,H收敛,则算法结束,输出W,H,否则回到步骤2.

当我们拿到W,H后,就可以计算出每一个用户u对应的任意一个商品的排序分:x‾ui=wu∙hi\overline{x}_{ui} = w_u \bullet h_ixui=wuhi,最终选择排序分最高的若干商品输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值