Skip to content
The Second Culture
Go back
贝叶斯个性化排序

Bayesian Personalized Ranking 是基于隐式反馈数据的非常通用的个性化模型,一般实现使用的是 matrix factorization 机制,利用随机梯度下降来求解。

假设用来表达训练集的三元组为 (u,i,j)(u,i,j),只需要找到“最优化”的用户的 f 维向量表征 wufw_{uf},positive item i 的 f 维向量表征 hifh_{if},negative item j 的 f 维向量表征 hjfh_{jf},则建模完毕。

它有以下几点优势:

1. 模型推导

考虑我们优化的目标(θ\theta 是我们求解的任意参数,比如矩阵分解的潜向量,>u>_u 代表了 user 对其他所有 item 的排序关系),它可以用贝叶斯公式表示为

P(θ>u)=P(>uθ)P(θ)P(>u)P(\theta|>_u) = \frac{P(>_u|\theta)P(\theta)}{P(>_u)}

假设所有的用户行为都是独立的,因此有

P(θ>u)P(>uθ)P(θ)P(\theta|>_u) \propto P(>_u|\theta)P(\theta)

因此优化目标拆解成了两部分,先看第一部分,可以表示为

uUP(>uθ)=(u,i,j)DP(i>ujθ)\prod_{u \in U}P(>_u|\theta) = \prod_{(u,i,j) \in D}P(i >_u j|\theta)

定义user uu 和 item ii 的内积为 user 对 item 的偏好 xuix_{ui}。 对于 P(i>ujθ)P(i >_u j|\theta) 这个概率,直观解释就是 xuix_{ui} 是否大于 xujx_{uj},大于零则表示:对于用户 uu 来说,iijj 更偏好 ii

xuij=xuixujx_{uij} = x_{ui} - x_{uj}

但这里有个问题,这个如果直接减的话,是 non-continuous, non-differential, 所以我们需要变换一下,把 xuixujx_{ui} - x_{uj} 的结果用 sigmod 函数变换一下(概率化),可以写成这样

P(i>ujθ)=σ(xuij(θ))P(i >_u j|\theta) = \sigma(x_{uij}(\theta))

因此第一部分的优化目标就可以变成这个样子了:

uUP(>uθ)=(u,i,j)Dσ(xuixuj)\prod_{u \in U}P(>_u|\theta) = \prod_{(u,i,j) \in D} \sigma(x_{ui} - x_{uj})

对于第二部分的 P(θ)P(\theta),我们将它简化为均值为0,协方差矩阵为 λθI\lambda_{\theta}I,即

P(θ)N(0,λθI)P(\theta) \sim N(0, \lambda_{\theta}I)

因此对数后验估计函数可以表示为:

lnP(θ>u)lnP(>uθ)P(θ)=ln(u,i,j)Dσ(xuij)+lnP(θ)=(u,i,j)Dlnσ(xuij)+λθ2  \ln P(\theta|>_u) \propto \ln P(>_u|\theta)P(\theta) = \ln \prod\limits_{(u,i,j) \in D} \sigma(x_{uij}) + ln P(\theta) = \sum\limits_{(u,i,j) \in D}\ln\sigma(x_{uij}) + \lambda||\theta||^2\;

上式的对于 θ\theta 的一阶导为:

=(u,i,j)lnσ(xuij)θλθθ2θ(u,i,j)exuij1+exuijxuijθλθθ\begin{align*} &= \prod\limits_{(u,i,j)} \frac{\partial \ln \sigma(x_{uij})}{\partial \theta} - \lambda_{\theta} \frac{\partial ||\theta||^2}{\partial \theta} \\ &\propto \prod\limits_{(u,i,j)} \frac{e^{-x_{uij}}}{1 + e^{x_{uij}}} \frac{\partial x_{uij}}{\partial \theta} - \lambda_{\theta}\theta \end{align*}

在这里有

xuij=xuixuj=f=1kwufhiff=1kwufhjfx_{uij} = x_{ui} - x_{uj} = \sum\limits_{f=1}^kw_{uf}h_{if} - \sum\limits_{f=1}^kw_{uf}h_{jf}

因此很容易得到:

(xuixuj)θ={(hifhjf)if  θ=wufwufif  θ=hifwufif  θ=hjf\frac{\partial (x_{ui} - 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}

也就是说,对于矩阵分解算法的参数 θ\theta 来说,user 的 f 维隐向量 wufw_{uf},以及 item 的 f 维隐向量 hif,hjfh_{if}, h_{jf} 非常容易通过梯度上升法来求解。

2. 实现细节

摘抄一部分 C++ 代码

prob = sum(U(user_id, _) * (I(liked_id, _) - I(disliked_id, _)));
prob = 1 / (1 + exp(prob));
temp = U(user_id, i);
U(user_id, i) +=  alpha * (prob * (I(liked_id, i) - I(disliked_id, i)) - lamb*temp);
I(liked_id, i) += alpha * (prob * temp - rlamb * I(liked_id, i));
I(disliked_id, i) += alpha * (-prob * temp - lamb * I(disliked_id, i));

可以很清晰的看到所有的运算基于 σ(xuij)\sigma(x_{uij}) 以及 wuf,hif,hjfw_{uf}, h_{if}, h_{jf} 以及常数项 alpha, lambda。

negative item j 是通过抽样方式来确定的,实际在计算的过程中只考虑 positive item i,因为 negative item 很多,所以会在所有的 item 里随机抽一个,即便是抽到了 positive item 从概率上来讲也不会对计算速度和精度有太大影响,但速度会加快很多。(想象一下电商推荐场景,不点击的长尾商品很多)

在 51Talk 老师推荐的实际应用场景又有不同,我们只针对有评分(positive)的老师进行训练,来更新用户和老师的向量,实际效果更佳优异。


Share this post on:

Previous Post
数据科学的关键事件
Next Post
写轮眼(sharingan)奇淫技巧