协同过滤究极进化-各种协同过滤进阶思路

今天我们继续进行协同过滤方法的进阶之路。上篇文章我们介绍了基于学习的方法中常见的SVD系列,今天我们继续讨论基于邻域的模型的进阶。基于邻域的方法我们在本系列的第 2 篇文章进行了介绍,不熟悉的朋友可以先复习一下。
基于邻域的模型还有哪些地方可以改进?
其实在很多推荐系统的入门教程中我们都学习了基于邻域的模型,无非是通过找相似用户推荐物品,或者找相似物品推荐给用户。
我们经常听说基于邻域的协同过滤在工业界也有很多应用,有时候刚开始学习推荐系统的同学会觉得深度模型一把梭才是王道

~那么今天我们来深入了解一下基于邻域的协同过滤还有哪些不知道的地方。

1)相似度度量
说起相似度,做machine learning 的同学肯定觉得很熟悉,余弦相似度,欧氏距离,皮尔逊相关系数等。本文以皮尔逊相关系数为例,开始扩展我们的思路:
其实我们可以进一步收缩这里的相关性:
这里可以证明的是,假设真实的相关性 p_ij 服从正态分布的话,s_ij 就是通过后验均值估计到的真实相关性。
不想看公式的朋友请看过来:反正 s_ij 就是表示了物品 i 和 j 的相似性~懂了吧
2)基于相似度的插值
前面得到的相似度,在基于邻域的协同过滤中有双重用途:第一,相似度可以识别出和目标物品最相似的一些物品;第二,相似度可以作为插值。
那么什么是插值呢?我们放一个简单的例子:
我们简单介绍一下上面的公式,不用担心复杂,理解公式的思路就可以很简单的明白它的含义。
先看一下前面,这里的 b_ui 就是一个基准的预测器,那么后面的 S 这个集合就是相似度的第一个作用,表示了用户 u 评价过,且和物品 i 最相似的 k 个物品的集合,也就是说要利用相似度来判断其它物品和目标物品的相似程度,然后来生成这个集合 S。
另外一个方面,我们可以看到分子中有相似度 s_ij 的存在,这其实就是一个插值权重的作用,用相似度作为一个权重值。
总体性的看一下,前面是基准预测器,后面是一个调优,相当于判断在基准预测器上,用户对目标近邻物品评分误差的一个补偿。可能有点绕,大家多读几遍理解一下~
这种方法有两个优秀的特性:第一,可解释性。插值权重可以告诉用户,我们为什么给你推荐了这个物品,是因为有一些和这个物品很相似的物品被你评分过。第二,新评分。因为一个新评分加入到系统中来时,我们不需要去重新训练模型,物品原有之间的相似性不会被破坏。
3)联合派生插值权重
上述的方法还是有一些有意思的 bad case 的,我们列举几例比较常见的情况:
  1. 相似度函数多变,假如一个物品的几个近邻可以有效的预测这个物品在用户 u 那里的评分,如果我们想把权重全部赋给这几个近邻,但是皮尔逊相关系数这种有界相似度就难以做到;

  2. 没有考虑近邻间物品的相关性,比如系列的电影之间互相影响;

  3. 定义的插值和为1,可能导致过拟合,因为有些物品的相关近邻不够,但是上述方法不能做到忽略这些无关近邻。

我们在这里简单介绍一个思路,一个可以克服上述困难的基于邻域的方法。首先近邻依然通过相似度来确定,但是最优插值并不需要考虑相似度的值。这里定义一个简单的示例:
这里用 z 表示了真实值和基准预测器之间的误差,将 \theta 看作插值权重,上述的式子可以用最小二乘法来解,本质上可以看作一个解线性方程组的过程。
细心的朋友可能已经发现,上述解成立的前提是方程组的系数矩阵是非奇异的,但是在实际情况中由于推荐系统的评分记录相当稀疏,所以这个前提很难成立,所以对于系数矩阵也有一些优化方法,这里就不展开讲啦,要不然篇幅太长,大家感兴趣的可以留言,我单独出一篇文章来分析~
4)小结
这里我们介绍了基于邻域的协同过滤算法,这也是构建一个推荐系统最流行的方式之一,插值的巧妙之处在于用已知的评分来估计未知的评分。
一般来说文章到这里就结束了,但是我们号称一篇让你在协同过滤究极进化的文章,还得再多整点儿活~
增强的基于领域的模型
基于领域的模型最大的特点就是根据相似的用户或物品来进行推荐,考虑的是近邻的偏好。在上篇文章的SVD家族中,我们可以看到基于分解的方法考虑的是全局的信息。
一般来说,基于邻域可以有效的保证推荐的可解释性,新颖性,但是基于分解的方法在评分预估中精确度会更高,那么我们就来看看怎么让基于邻域的模型有这个全局的优点。
1)全局化的领域模型
我们可以先扔出来一个模型来慢慢的剖析它:
前面三项我们可以直接看出来就是隐语义分解,这里作为一个基准预测器。然后是一个规范化函数,我们主要看这个求和函数内部的内容。w_ij 在这里的功能类似于前面的插值权重,主要是为了学习到两个物品 i 和 j 之间的相似度。c_ij 就是一个很有意思的补偿量了,描述了哪些物品被共同评分过,而不用关心具体的评分。
上面这个模型是一个凸优化问题,我们可以用最小二乘法来进行优化,也可以用随机梯度下降寻找最优解。
2)添加因式分解
借鉴SVD的思路,我们可以在这里将这些关系进行因式分解,不同的地方在于,SVD是将评分进行分解,在这里将物品-物品关系进行因式分解。我们将 w_ij 分解为 q_i 和 x_j 的点积,类似的将 c_ij 分解为 q_i 和 y_j 的点积。最终的式子就是这样子:
这里可以将求和函数中的 q_i 的转置提到外面来,我们就不继续解释啦~
这里的形式某种意义上和某些隐语义模型很像,而且在性能上和SVD也旗鼓相当,但是这种因子分解的邻域模型却保留了基于邻域方法的优势:可解释性和立即反映新评分的能力。
3)基于邻域模型的动态时序
我们在学习SVD的时候提到过,基于全局优化的分解模型可以添加捕获时序信息的能力,那么在应用了因子分解后的邻域模型有没有这种能力呢?答案当然是有了,要不然我说它干嘛~(O(∩_∩)O哈哈~)
这里我们简单介绍一种应用指数衰减来描述时间效应的方法:
按照惯例,可以加上正则化后做随机梯度下降对这些参数进行学习。
把时间效应整合到模型中,与矩阵分解的思路非常相似,而且结果也证明可以有很好的效果。已有文献中有一个有趣的论断:与设计更复杂的学习算法相比,考虑数据中的时间效应能够对预测准确度有更大的影响。
总结
今天的文章给大家介绍了协同过滤可以继续优化的一些方向,可以说学懂本文,基于邻域的协同过滤方法基本上就掌握的差不多了。
其实我们还可以证明,只要设计的好,SVD,基于物品的协同过滤,基于用户的协同过滤,这三者是等价的,由于篇幅受限,在这里省略证明,感兴趣的同学可以下去继续学习,或者我立一个2020年的第一个flag:如果这篇文章在看达到20,写一篇万字长文超级细节的展开来讲本节的内容~

由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方'AINLP',进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入推荐系统交流群
(0)

相关推荐