矩阵分解在推荐系统中的地位非常崇高,恐怕本专栏介绍的其他算法模型都不能轻易地撼动它。

它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈,还是处理隐式反馈都让人颇有微词,这一点是为什么呢?

矩阵分解的不足

前面我讲过的两种矩阵分解,本质上都是在预测用户对一个物品的偏好程度,哪怕不是预测评分,只是预测隐式反馈,也难逃这个事实,因为算法展现出来的目标函数就出卖了这一切。

得到这样的矩阵分解结果后,常常在实际使用时,又是用这个预测结果来排序。所以,从业者们口口声声宣称想要模型的预测误差最小化,结果绕了一大圈最后还是只想要一个好点的排序,让人不禁感叹:人心总是难测。

这种针对单个用户对单个物品的偏好程度进行预测,得到结果后再排序的问题,在排序学习中的行话叫做 point-wise,其中 point 意思就是:只单独考虑每个物品,每个物品像是空间中孤立的点一样。

与之相对的,还有直接预测物品两两之间相对顺序的问题,就叫做 pair-wise,pair,顾名思义就是成对成双,也许恐怕这类模型对单身的人士不是很友好。

前面讲的矩阵分解都属于 point-wise 模型。这类模型的尴尬是:只能收集到正样本,没有负样本,于是认为缺失值就是负样本,再以预测误差为评判标准去使劲逼近这些样本。逼近正样本没问题,但是同时逼近的负样本只是缺失值而已,还不知道真正呈现在用户面前,到底是不喜欢还是喜欢呢?

虽然这些模型采取了一些措施来规避这个问题,比如负样本采样,但是尴尬还是存在的,为了排序而绕路也是事实。

既然如此,能不能直面问题,采用 pair-wise 来看待矩阵分解呢?当然能,不然我也不会写出这一篇专栏文章了。

其实人在面对选择时,总是倾向矮子中选高个子,而不是真的在意身高到底是不是 180,因此,更直接的推荐模型应该是:能够较好地为用户排列出更好的物品相对顺序,而非更精确的评分。

这个问题已经有可爱的从业者们提出了方法,就是本文的主角:贝叶斯个性化排序,简称 BPR 模型。下面,我就带你一探这个模型的究竟。

贝叶斯个性化排序

在前面的专栏文章中,有一个词叫做均方根误差,被我提过多次,用于评价模型预测精准程度的。那么现在要关注的是相对排序,用什么指标比较好呢?答案是 AUC,AUC 全称是 Area Under Curve,意思是曲线下的面积,这里的曲线就是 ROC 曲线。

AUC

但是,我不打算继续解释什么是 ROC 曲线了,那是它的原始定义,而我想跟你悄悄说的是另一件事,AUC 这个值在数学上等价于:模型把关心的那一类样本排在其他样本前面的概率。最大是 1,完美结果,而 0.5 就是随机排列,0 就是完美地全部排错。

听到这个等价的 AUC 解释,你是不是眼前一亮?这个非常适合用来评价模型的排序效果,比如说,得到一个推荐模型后,按照它计算的分数,能不能把用户真正想消费的物品排在前面?这在模型上线前是可以用日志完全计算出来的。

AUC 怎么计算呢?一般步骤如下。

  1. 用模型给样本计算推荐分数,比如样本都是用户和物品这样一对一对的,同时还包含了有无反馈的标识;
  2. 得到打过分的样本,每条样本保留两个信息,第一个是分数,第二个是 0 或者 1,1 表示用户消费过,是正样本,0 表示没有,是负样本;
  3. 按照分数对样本重新排序,降序排列;
  4. 给每一个样本赋一个排序值,第一位 r1 = n,第二位 r2 = n-1,以此类推;其中要注意,如果几个样本分数一样,需要将其排序值调整为他们的平均值;
  5. 最终按照下面这个公式计算就可以得到 AUC 值。

我在文稿中放了这个公式,你可以点击查看。

AUC=∑i∈(样本)ri−M×(M+1)2M×NAUC=∑i∈(样本)ri−M×(M+1)2M×N