在推荐系统中的经典矩阵分解技术中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐。今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personalized Ranking, 以下简称BPR),它也用到了矩阵分解,但是和funkSVD家族却有很多不同之处。下面我们来详细讨论。
排序推荐算法历史很悠久,早在做信息检索的各种产品中就已经在使用了。最早的第一类排序算法类别是点对方法(Pointwise Approach),这类算法将排序问题被转化为分类、回归之类的问题,并使用现有分类、回归等方法进行实现。第二类排序算法是成对方法(Pairwise Approach),在序列方法中,排序被转化为对序列分类或对序列回归。所谓的pair就是成对的排序,比如(a,b)一组表明a比b排的靠前。我们要讲到的BPR就属于这一类。第三类排序算法是列表方法(Listwise Approach),它采用更加直接的方法对排序问题进行了处理。它在学习和预测过程中都将排序列表作为一个样本。排序的组结构被保持。
在很多推荐场景中,我们都是基于现有的用户和商品之间的一些数据,得到用户对所有商品的评分,选择高分的商品推荐给用户,这是funkSVD之类算法的做法,使用起来也很有效。但是在有些推荐场景中,我们是为了在千万级别的商品中推荐个位数的商品给用户,此时,我们更关心的是用户来说,哪些极少数商品在用户心中有更高的优先级,也就是排序更靠前。也就是说,我们需要一个排序算法,这个算法可以把每个用户对应的所有商品按喜好排序。BPR就是这样的一个我们需要的排序算法。
在推荐系统中,分为召回和排序两个阶段。贝叶斯个性化排序属于成对方法(Pairwise Approach)。
在BPR算法中,我们将任意用户u对应的物品进行标记,如果用户u在同时有物品i和j的时候点击了i,那么我们就得到了一个三元组,它表示对用户u来说,i的排序要比j靠前。如果对于用户u来说我们有m组这样的反馈,那么我们就可以得到m组用户u对应的训练样本。
既然是基于贝叶斯,那么这里有两个假设:
- 每个用户之间的偏好行为相互独立,即用户u在商品i和j之间的偏好和其他用户无关。
- 同一用户对不同物品的偏序相互独立,也就是用户u在商品i和j之间的偏好和其他的商品无关。
为了便于表述,我们用>u符号表示用户u的偏好,上面的可以表示为:
在BPR中,这个排序关系符号>u满足完全性,反对称性和传递性,即对于用户集U和物品集I:
同时,BPR也用了和funkSVD类似的矩阵分解模型,这里BPR对于用户集U和物品集I的对应的的预测排序矩阵我们期望得到两个分解后的用户矩阵和物品矩阵满足
这里的k和funkSVD类似,也是自己定义的,一般远远小于
由于BPR是基于用户维度的,所以对于任意一个用户u,对应的任意一个物品i我们期望有:
最终我们的目标,是希望寻找合适的矩阵,让最相似。读到这里,也许你会说,这和funkSVD之类的矩阵分解模型没有什么区别啊? 的确,现在还看不出,下面我们来看看BPR的算法优化思路,就会慢慢理解和funkSVD有什么不同了。
BPR算法采用的是最大化后验概率来估计参数(关于什么是最大化后验概率,可移步我的另外一篇文章:最大化后验概率)。由来求解模型参数W,H。这里我们用θ来表示参数W,H,代表用户u对应的所有商品的全序关系,则优化目标是 根据贝叶斯公式,我们有:
由于我们求解假设了用户的排序和其他用户无关,那么对于任意一个用户u来说,对所有的物品一样,所以有:
这个优化目标转化为两部分。第一部分和样本数据集D有关,第二部分和样本数据集D无关。
对于第一部分,由于我们假设每个用户之间的偏好行为相互独立,同一用户对不同物品的偏序相互独立,所以有:
其中,
当数据属于D时,第一部分可以简化为:
当数据不属于D时,第一部分可以简化为:
而我们所取的数据都是属于D的,所以优化目标的第一部分可以简化为:
而对于,这个概率,我们可以使用下面这个式子来代替:
其中,σ(x)是sigmoid函数。这里你也许会问,为什么可以用这个sigmoid函数来代替呢? 其实这里的代替可以选择其他的函数,不过式子需要满足BPR的完整性,反对称性和传递性。原论文作者这么做除了是满足这三个性质外,另一个原因是为了方便优化计算。
详细了解sigmoid函数请看:激活函数
对于这个式子,我们要满足当时,反之当时,最简单的表示这个性质的方法就是
注意上面的这个式子也不是唯一的,只要可以满足上面提到的以及对应的相反条件即可。这里我们仍然按原论文的式子来。
我们将上面讲的第一部分化简总结起来就是:
最终,我们的第一部分优化目标转化为:
对于第二部分P(θ),原作者大胆使用了贝叶斯假设,即这个概率分布符合正太分布,且对应的均值是0,协方差矩阵是,即
所以对于,代入概率密度函数:
原作者为什么这么假设呢?个人觉得还是为了优化方便,因为后面我们做优化时,需要计算。
对于上面假设的这个多维正态分布,我们可以发现其对数和成正比,所以可近似等于:
注:因为θ来表示参数矩阵W,H,所以我们可以把理解为矩阵平方求和。详细了解,可自行百度——L2范数。
所以,最终的后验概率估计函数为:
这个式子可以用梯度上升法或者牛顿法等方法来优化求解模型参数。如果用梯度上升法,对θ求导,我们有:
由于
这样我们可以求出:
下面简要总结下BPR的算法训练流程:
输入:训练集D三元组,梯度步长α, 正则化参数λ,分解矩阵维度k。
输出:模型参数,矩阵W,H
1. 随机初始化矩阵W,H
2. 迭代更新模型参数:
3. 如果W,H收敛,则算法结束,输出W,H,否则回到步骤2.
当我们拿到W,H后,就可以计算出每一个用户u对应的任意一个商品的排序分:最终选择排序分最高的若干商品输出。
回顾Bayesian Personalized Ranking 算法,有以下三点值得回味:
之所以这样设计,笔者以为有两点:一是方便取对数、二是能与正则化联系起来。
2. 用户 u 相比于 j 更喜欢 i 通过借助用户 u 对 i 的喜欢程度与对 j 的喜欢程度的差进行度量。这当然是最直观的表示方法,当然也可以加以改进。
3. 万物皆可embedding !通过对用户以及物品分别构造embedding向量,从而完成用户对物品喜好程度的计算。
参考资料:
1.https://www.cnblogs.com/pinard/p/9128682.html
2.https://www.cnblogs.com/wkang/p/10217172.html