BPR 贝叶斯个性化排序

显式反馈:用户对物品的评分,如电影评分
隐式反馈:用户对物品的交互行为,如浏览,购买等,现实中绝大部分数据属于隐式反馈,可以从日志中获取。
BPR是基于用户的隐式反馈,为用户提供物品的推荐,并且是直接对排序进行优化。

定义

U U U代表所有的用户user集合;

I I I代表所有的物品item集合;

S S S代表所有用户的隐式反馈, S ⊆ U × I S \subseteq U \times I SU×I. 如下图所示,只要用户对某个物品产生过行为,就标记为 + + +, 所有 + + +样本构成了 S S S。那些未观察到的数据(即用户没有产生行为的数据)标记为 ? ? ?.

BPR 贝叶斯个性化排序_第1张图片

i > u j i>_uj i>uj表示用户u在物品i和物品j之间更偏向于物品i

I u + = { i ∈ I : ( u , i ) ∈ S } I_u^+=\{i \in I: (u,i) \in S\} Iu+={iI:(u,i)S} 代表了用户u产生过行为的物品集合

U i + = { u ∈ U : ( u , i ) ∈ S } U_i^+=\{u \in U: (u,i) \in S\} Ui+={uU:(u,i)S} 代表了对物品i产生过行为的用户集合

传统解决方式

在使用隐式反馈的情况下,我们会发现观察到的数据均为正例(因为用户对物品交互过才会被观察到),而那些没有被观察到的数据(即用户还没有产生行为的物品),分为两种情况,一种是用户确实对该物品没有兴趣(负类),另一种则是缺失值(即用户以后可能会产生行为的物品)。

传统的个性化推荐通常是计算出用户u对物品i的个性化分数 x ^ u i \hat{x}_{ui} x^ui,然后根据个性化分数进行排序。为了得到训练数据,通常是将所有观察到的隐式反馈 ( u , i ) ∈ S (u,i) \in S (u,i)S作为正类,其余所有数据作为负类,如下图所示,左图为观察到的数据,右图为填充后的训练数据:

BPR 贝叶斯个性化排序_第2张图片

在填零的情况下,我们的优化目标变成了希望在预测时观测到的数据预测为1,其余的均为0. 于是产生的问题是,我们希望模型在以后预测的缺失值,在训练时却都被认为是负类数据。因此,如果这个模型训练的足够好,那么最终得到的结果就是这些未观察的样本最后的预测值都是0。

BPR的解决方式

BPR采用了pairwise的方式。

如 下图,基于观察到的数据S构建数据集 D S D_S DS: 对用户u来说,如果对物品i产生过行为(即 ( u , i ) ∈ S (u,i) \in S (u,i)S), 而没有对物品j产生过行为,则得到了一个偏好对 ( u , i , j ) (u,i,j) (u,i,j)。如对用户 u 1 u_1 u1来说,对物品 i 2 i_2 i2产生过行为,而没有对物品 i 1 i_1 i1产生过行为,则得到了用户 u 1 u_1 u1的一个偏好对 ( u 1 , i 2 , i 1 ) (u_1, i_2, i_1) (u1,i2,i1), 或者表示为 i 2 > u 1 i 1 i_2>_{u1}i_1 i2>u1i1. **如果一个用户对两个物品同时产生过行为,或者同时没有产生过行为,则无法构建偏好对。**接着,对每个用户,就可以构建 I × I I \times I I×I的偏好矩阵。所有用户的偏好对构成了训练集 D S : U × I × I D_S: U \times I \times I DS:U×I×I

D S = { ( u , i , j ) ∣ i ∈ I u + ∧ j ∈ I \ I u + } D_S=\{(u,i,j)|i \in I_u^+ \land j \in I \backslash I_u^+\} DS={(u,i,j)iIu+jI\Iu+}

注意,对每个三元组样本 ( u , i , j ) (u,i,j) (u,i,j), i必然是产生过行为的物品,j必然是未被产生过行为的物品,因此 D S D_S DS只包括下图右边分解后为 + + +的数据,不包含 − - 的数据。

BPR 贝叶斯个性化排序_第3张图片

BPR-OPT

BPR基于最大后验概率, 对每一个用户u而言,后验概率正比于似然概率乘上先验概率:

p ( θ ∣ > u ) ∝ p ( > u ∣ θ ) p ( θ ) p(\theta|>_u) \propto p(>_u|\theta)p(\theta) p(θ>u)p(>uθ)p(θ)

其中, > u >_u >u表示了用户u对所有物品的偏好关系。下面从分解后的似然概率和先验概率做出解释。

似然概率

独立性假设:

  1. 所有用户之间的行为相互独立
  2. 同一用户任意一对物品的偏序关系相互独立

于是可以将似然概率表示为(这里跳过了包含负例部分的分解,原论文这部分关于负例的表示让我有些疑惑,有兴趣的可以参见下这篇博客的讨论部分):

Π u ∈ U p ( > u ∣ θ ) = Π ( u , i , j ) ∈ D S p ( i > u j ∣ θ ) \Pi_{u\in U}p(>_u|\theta)=\Pi_{(u,i,j) \in D_S}p(i>_uj|\theta) ΠuUp(>uθ)=Π(u,i,j)DSp(i>ujθ)

即分解为每一个正样本的概率之积,即我们希望对每一个正样本 ( u , i , j ) ∈ D S (u,i,j) \in D_S (u,i,j)DS, p ( i > u j ∣ θ ) p(i>_uj|\theta) p(i>ujθ)最大。这里不考虑负样本。

这里定义:

p ( i > u j ∣ θ ) : = σ ( x ^ u i j ( θ ) ) p(i>_uj|\theta):=\sigma(\hat{x}_{uij}(\theta)) p(i>ujθ):=σ(x^uij(θ))

其中 σ \sigma σ是sigmoid函数, σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1

x ^ u i j ( θ ) \hat{x}_{uij}(\theta) x^uij(θ)是个实值函数,返回的是用户u, 物品i, 物品j之间的关系。这个函数可以通过矩阵分解或者KNN等方法实现。

先验概率

这里假设了参数的先验概率服从正态分布

p ( θ ) ∼ N ( 0 , λ θ I ) p(\theta) \sim N(0, \lambda_\theta I) p(θ)N(0,λθI)

对于正态分布,其对数和 ∣ ∣ θ ∣ ∣ 2 ||\theta||^2 θ2成正比。因此计算 l n p ( θ ) lnp(\theta) lnp(θ)时,得到:

l n p ( θ ) = λ ∣ ∣ θ ∣ ∣ 2 lnp(\theta)=\lambda||\theta||^2 lnp(θ)=λθ2

后验概率

得到似然概率和先验概率后,最终得到后验概率。取对数得到优化目标。

BPR 贝叶斯个性化排序_第4张图片

先验概率相当于正则项,由于假设了高斯分布,因此变为L2正则。

梯度下降

由于优化函数可微,因此采用梯度下降法。

BPR 贝叶斯个性化排序_第5张图片

采用随机梯度下降:

1542719926063

基于矩阵分解的BPR

矩阵分解的作用主要就是为了得到上述的实值函数 x ^ u i j ( θ ) \hat{x}_{uij}(\theta) x^uij(θ).

对于用户集 U U U和物品集 I I I对应的 U × I U \times I U×I的预测的排序矩阵 X ^ \hat{X} X^, 我们期望分解得到用户矩阵 W ( ∣ U ∣ × k ) W (|U|\times k) W(U×k)和物品矩阵 H ( ∣ I ∣ × k ) H (|I| \times k) H(I×k), 满足:

X ^ = W H T \hat{X}=WH^T X^=WHT

这里的k是自己定义的,对于用户矩阵W, 我们实际上就是为每一个用户u学出一个k维向量 w u w_u wu作为该用户的隐向量,同理,对于物品矩阵H, 我们实际上就是为每一个物品i学出一个k维向量 h i h_i hi作为该物品的隐向量。

因此,这里的 ( W , H ) (W, H) (W,H)实际上就是我们需要求出的参数 θ \theta θ. 为方便,下面式子不再写 θ \theta θ

当得到W和H矩阵后,对于任意一个用户u,对应的任意一个物品i, 得到的实值向量即为两个隐向量之积:

x ^ u i = w u ⋅ h i = ∑ f = 1 k w u f h i f \hat{x}_{ui}=w_u \cdot h_i=\sum_{f=1}^kw_{uf}h_{if} x^ui=wuhi=f=1kwufhif

x ^ u i \hat{x}_{ui} x^ui的物理意义可以理解为是预测出的用户u对物品i的评分。

但是BPR中是三元组形式的 x ^ u i j \hat{x}_{uij} x^uij,因此BPR将三元组形式分解为二元组的形式,定义为:

x ^ u i j = x ^ u i − x ^ u j \hat{x}_{uij}=\hat{x}_{ui}-\hat{x}_{uj} x^uij=x^uix^uj

同时,上面这个式子满足了:当 i > u j i>_uj i>uj时, x ^ u i j > 0 \hat{x}_{uij}>0 x^uij>0;当 j > u i j>_ui j>ui时, x ^ u i j < 0 \hat{x}_{uij}<0 x^uij<0.

代入后验概率模型,得到:

l n p ( θ ∣ > u ) = ∑ ( u , i , j ) ∈ D S l n σ ( x ^ u i − x ^ u j ) + λ ∣ ∣ θ ∣ ∣ 2 lnp(\theta|>_u)=\sum_{(u,i,j)\in D_S}ln\sigma(\hat{x}_{ui}-\hat{x}_{uj})+\lambda||\theta||^2 lnp(θ>u)=(u,i,j)DSlnσ(x^uix^uj)+λθ2

根据上节梯度下降更新梯度,得到:

θ ← θ + α ( 1 1 + e x ^ u i − x ^ u j ⋅ ∂ ∂ θ ( x ^ u i − x ^ u j ) + λ θ ) \theta \leftarrow \theta + \alpha(\frac{1}{1+e^{\hat{x}_{ui}-\hat{x}_{uj}}} \cdot \frac{\partial}{\partial \theta}(\hat{x}_{ui}-\hat{x}_{uj})+\lambda\theta) θθ+α(1+ex^uix^uj1θ(x^uix^uj)+λθ)

其中:

x ^ u i − x ^ u j = ∑ f = 1 k w u f h i f − ∑ f = 1 k w u f h j f \hat{x}_{ui}-\hat{x}_{uj}=\sum_{f=1}^kw_{uf}h_{if}-\sum_{f=1}^kw_{uf}h_{jf} x^uix^uj=f=1kwufhiff=1kwufhjf

于是,可以得到:

BPR 贝叶斯个性化排序_第6张图片

接下来就可以更新参数了。

当然,除了采用矩阵分解的方式实现,也可以使用KNN的方式去实现 x ^ u i j \hat{x}_{uij} x^uij, 具体可参见论文。

尽管BPR采用的仍然是矩阵分解的方式,但传统的矩阵分解主要是去尝试拟合 x ^ u i \hat{x}_{ui} x^ui, BPR的优化角度是直接对排序进行优化,相当于对差值 x ^ u i − x ^ u j \hat{x}_{ui}-\hat{x}_{uj} x^uix^uj进行分类,因此更加有效。

参考:

Rendle, et.al., BPR: Bayesian Personalized Ranking from Implicit Feedback

刘建平博客:https://www.cnblogs.com/pinard/p/9128682.html#commentform

其他:

在上传这篇博客到hexo时,由于公式太多,导致了网上公式渲染出现问题,非常感谢在Hexo中渲染MathJax数学公式提出的方法.

你可能感兴趣的:(机器学习,推荐系统)