目录
- 矩阵分解的不足
- 贝叶斯个性化排序
- AUC
- 构造样本
- 目标函数
- 训练方法
- 总结
矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈,还是 处理隐式反馈都让人颇有微词,这一点是为什么呢?
矩阵分解的不足
前面讲过的两种矩阵分解,本质都是在预测用户对一个物品的偏好程度,哪怕不是预测评分,只是预测隐式反馈,也是这个事实。
得到矩阵分解结果后,常常在实际使用时,又是用这个预测结果来排序。原来的目标是让模型的预测误差最小化,到最后还是只想要一个好点的排序。
这种针对单个用户对单个物品的偏好程度进行预测,得到结果后再排序的问题,在排序学习中的叫做:point-wise,其中point意思就是:只单独考虑每个物品,每个物品 像是空间中孤立的点一样。与之相对应的,还有直接预测物品两两之间相对排序的问题,叫做pair-wise ,pair顾名思义就是成对成双。
前面将的矩阵分解都属于point-wise模型。这类模型的尴尬是:只能收集到正样本,没有负样本,于是认为缺失值就是负样本,再以预测误差为评判标准去逼近这些样本。逼近正样本没有问题,但同时逼近的负样本只是缺失值而已,并不能确认用户到底是不喜欢还是喜欢。虽然这些模型采取了一些措施来规避这个问题,比如负样本采样,但尴尬还是存在的,为了排序而绕路也是事实。
既然如此,能不能直面问题,采用pair-wise 来看待矩阵分解呢?当然可以。实际上,更直接的推荐模型应该是:能够较好地为用户排列出更好的物品相对顺序,而非更精确的评分。
这个问题已经有专业的从业者们提出了方法:贝叶斯个性化排序,简称BPR模型。下面,我们就一探究竟。
贝叶斯个性化排序
在前面的专栏文章中,已提到均方根误差,用于评价模型预测准确度的。现在要关注的是相对排序,用什么指标比较好呢?AUC,全称是Area Under Curve,意思是曲面下的面积,这里的曲线是ROC曲线。
AUC
AUC 这个值在数学上等价于:模型把关心的那一类样本排在其他样本前面的概率。最大是1,完美结果,而0.5是书籍排列,0就是完美的全部排错。
这个非常适合来评价模型的排序效果,比如说,得到一个推荐模型后,按照它计算的分数,能不能把用户真正想消费的物品排在前面。这个模型上线前是可以用日志完全计算出来的。
AUC 怎么计算呢?一般步骤如下:
1、用模型给样本计算推荐分,比如样本都是用户和物品这样一对一对的,同时还包含了有无反馈的标识;
2、得到打过分的样本,每条样本保留两个信息,第一个是分数,第二个是0或者1,1标识消费过,是正样本,0标识没有,负样本;
3、按照分数对样本重新排序,降序排列;
4、给每一个样本赋一个排序值,第一位r1=n,第二位r2=n-1,以此类推;其中要注意,如果几个样本分数一样,需要将其排序值调整为他们的平均值;
5、最终按照下面的这个公式计算就可以得到AUC值;
A U C = ∑ i ∈ ( 样 本 ) T i − M ∗ ( M + 1 ) 2 M ∗ N AUC =\frac{\sum_{i∈(样本)}{T_i-\frac{M*(M +1)}{2}}}{M*N} AUC=M∗N∑i∈(样本)Ti−2M∗(M+1)
这个公式:
第一部分:分母是我们关心的那类样本,也就是正样本,有M个,以及其他的样本有N个,这两类样本相对排序总共的可能性有M*N种;
第二部分:分子是这样计算的:第一名的排序值是r_1,它在排序上不但比过了所有的负样本,而且比过了自己以外的正样本。
正样本和正样本是同一类,所以要排查,于是就有N-M 种组合,以此类推,排序值为rm的就贡献了rm-1,把这些加起来就是分子;
关于AUC,越接近1越好是肯定的,但是并不是越接近0就越差,最差的是接近0.5,如果AUC很接近0的话,只需要把模型预测的结果加个负号就能让AUC接近1;
BPR模型,它提出了一个优化准则和学习框架,那到底BPR做了什么事情呢?主要有三点:
1.一个样本构造方法;
2.一个模型目标函数;
3.一个模型学习框架;
构造样本
前面介绍的矩阵分解,在训练时候处理的样本是:用户、物品、反馈,这样的三元组形式;
其中反馈又包含真实反馈和缺失值,缺失值充当负样本。BPR则不同,提出要关心的是物品之间对于用户的相对排序,于是构造的样本是:用户、物品1、物品2、两个物品相对排序,这样的四元组形式,其中两个物品的相对排序,取值是:
1、如果物品1是消费过的,而物品2不是,那么相对顺序取值为1,是正样本;
2、如果物品1和物品2刚好相反,则是负样本;
3、样本中不包含其他情况:物品1和物品2都是消费过的,或者都是没消费过的。
学习的顺序是反应用户偏好的相对顺序,而在使用时,面对的是所有用户还没消费过的物品,这些物品仍然可以在这样的模型下取得相对顺序,这就比三元组point-wise 样本要直观得多。
目标函数
现在,每条样本包含的是两个物品,样本预测目标是两个物品的相对排序。BPR完成矩阵分解,依然需要像交替最小二乘那样的思想。
先假设矩阵分解结果已经有了,于是计算出用户对于每个物品的推荐分数,只不过这个推荐分数可能并不满足均方根误差最小,而是满足物品相对排序最佳。
得到了用户和物品的推荐分数后,就可以计算四元组的样本中,物品1和物品2的分数差,这个分数可能是正数,也可能是负数,还可能是0;
希望的情况是:如果物品1和物品2相对排序为1,那么希望两者分数之差是个正数,而且越大越好;如果物品1和物品2的相对排序时0,则希望分数之差是负数,且越小越好;
用个符号来表示这个差: X u 12 X_{u12} Xu12,表示的是对于用户u,物品1和物品2的矩阵分解预测分数差。然后再用sigmoid函数把这个分数差压缩到0到1之间。
θ = 1 1 + e ( − X u 12 ) θ=\frac{1}{1+e^{(-X_{u12})}} θ=1+e(−Xu12)1
用这种方式预测了物品1排在物品2前面的似然概率,所以最大化交叉熵就是目标函数了。目标函数通常还要防止过拟合,加上正则项,正则项其实认为模型参数有个先验概率,这也是BPR这个名字中有’贝叶斯’的来历。BPR认为模型的先验概率符合正态分布,对应到正则化就是说L2正则。
所有样本都计算:模型参数先验概率p theta ,和似然概率的乘积,最大化这个目标函数就能够得到分解后的矩阵参数其中theta就是分解后的矩阵参数。
这个目标函数化简和变形后,和把AUC当成目标函数是非常相似的,正因为如此,BPR模型宣称该模型是为AUC而生。
训练方法
有了目标函数之后,就要有训练方法。梯度下降可以,梯度下降又分为批量梯度和随机梯度两个选择,前者收敛慢,后者训练快但不稳定。
因此BPR使用了一个介于两者之间的训练方法,结合重复抽样的梯度下降。具体如下:
1、从全量样本中有放回地随机抽取一部分样本;
2、用这部分样本,采用随机梯度下降优化目标函数,更新模型参数;
3、重复步骤1,直到满足停止条件。
这样,就得到了一个更符合推荐排序要求的矩阵分解模型了;
总结
今天是矩阵分解三篇的最后一篇,传统的矩阵分解,无论是隐式反馈还是显示反馈,都是希望更加准确地预测用户对单个物品的偏好,而实际上,如果能够预测用户对物品之间的相对偏好,则更加符合实际需求的直觉。
BPR就是这样一整套针对排序的推荐算法,它事实上提出了一个优化准则和一个学习框架,至于其中优化的对象是不是矩阵分解并不是它的重点。但我在这里结合矩阵分解对其进行了讲解,同时还介绍了排序时最常用的评价指标AUC及其计算方法。