分享

协同过滤进阶之SVD家族

 520jefferson 2020-12-27

        哈喽,大家好,今天的文章给大家带来协同过滤的进阶内容,由于原计划的内容过多,这部分我拆成了两篇来写,今天是第一篇,先介绍在Netflix比赛中常用的矩阵分解的方法。这部分内容在推荐系统的评分预测中效果很好,来进入今天的内容吧~




SVD
       首先我们来介绍一下奇异值分解(SVD),SVD模型其实就是根据已有的数据,比如用户对不同物品的打分,来分析出用户对各个因子的喜欢程度,以及物品包含各个因子的程度。其实如果对机器学习有点基础的朋友,就可以很清晰的理解这个思路,就是将数据映射到一个目标的维度上。然后通过用户和物品在这个映射空间的向量来做内积,进而实现预测未知的评分。
        为了帮助理解,我们在这里举个栗子:用户小明喜欢电影 A,我们完成分解后发现,小明其实喜欢的是喜剧,周星驰这些属性,而电影 A 也可以映射到喜剧,周星驰这些属性上去,那么我们就相当于将小明和电影 A 分别映射到喜剧,周星驰这些属性上,这就是我们提到的各个因子。是不是清晰很多了呢~


    接下来我们用式子介绍一下这里的思路,放心啦,我会尽量放慢节奏,让你充分理解哟:
    这里的 r_ui 表示的预测评分,q_i 表示了物品在目标维度的映射,p_u 当然就是用户在目标维度的映射了。这里我们认为这两个向量的内积就捕获了目标用户u和物品i的评分信息。


    这个时候我们就需要考虑这样一种情况,如果所有的评分信息的平均分是3分,这时候一个比较严格的用户小明,他普遍给所有电影给低分,他的评分记录的平均分是2分,那么他给的高分在预测的时候就需要考虑进去,这个我们称之为用户偏置。同理,如果一部电影,比如今年的《中国机长》大家给的评分都比较高,假设《中国机长》平均分是4.5分,这就是物品偏置。这个时候小明还没有看过《中国机长》,我们要预测他可能给的打分,那么除了上面直接内积得到的分数外,我们还需要给他加上一个3+(-1)+1.5,也就是3.5分。


    那么在实际中我们的模型需要考虑到这些因素,所以上面的式子(1)就需要改进:

    上面新加的三个参数分别是所有评分的平均值,物品 i 的偏置,用户 u 的偏置。这个时候为了避免过拟合我们需要再加上正则化:

    接下来的训练就变得非常简单了,我们直接使用应用非常广泛的随机梯度下降法来对参数进行优化。上面的式子(3)也就是大家经常听说的SVD方法。这里关于正则化,随机梯度下降这些机器学习中常见的技术,大家应该都听说过,如果有不熟悉的可以自行查阅相关资料进行了解,这些如果展开讲我们的篇幅可就太长了,O(∩_∩)O哈哈~



SVD++
    前面我们探讨了SVD这种加入了偏置项的模型,但是没有考虑用户的历史行为对用户预测的影响,而SVD++则将用户历史评分的物品信息添加到模型中。具体的思路就是考虑隐式反馈对模型的帮助,比如我们可以通过用户曾经评分过的物品来判断用户对某些因子的喜好程度。比如一个用户可以从他的评分中看出他可能对喜剧比较感兴趣,很明显如果一个用户看了很多喜剧属性的电影,我们可以轻松得出这个结论。那么为了实现这个目标,就是要添加一个物品因子集合,也就是说对每个物品 i 要关联一个它独有的因子向量 y_i,然后这个新的向量需要添加到用户的特征上去。先看看模型吧:


        我们可以看到,式4与式2相比,在 p_u  的部分多加了一项,这一项的意思我们这里来解释一下。上面说了 y_j 表示对物品 j 的因子向量,那么这里的求和指的就是对所有用户 u 评分过的物品 j 的因子向量进行求和。这个步骤相当于把所有用户过去评分过的物品做一个统计,看看该用户对哪些因子更感兴趣。前面对 R(u) 的模做一个 -1/2 次幂,本质上就是一个做一个规范化。


        除此之外,可以用类似的思路将其它隐式反馈也引入到模型当中,比如某个用户看了这部电影的介绍,但是没有选择看这部电影,那么就相当于公式 4 中的 j 的取值范围为用户看了介绍没有看内容的电影。诸如此类的隐式反馈可以直接在公式 4 中往进加,而且这些信息的相对重要性将由模型自己学到。



时间敏感的因子模型
         通过前面的描述,我们已经可以详细的捕获用户的兴趣偏好,很好的预测用户对物品的评分了。但是这个时候再想进一步优化我们的模型,考虑一下时间的问题。常言道,让时间消磨一切,人总是会随着时间发生改变的,一个以前喜欢的属性,不一定未来还喜欢。
         所以我们可以对模型进行改进,让上面的项成为可以随着时间变化的因子。
         1)比如用户偏置 b_u(t) 就可以表示为用户随着时间的偏置变化,比如一个用户以前普遍给 4,5 分,随着时间变化他越来越严格,开始平均给 3 分,那么这个 b_u(t) 就可以用来捕获这种变化;
         2)再比如物品偏置 b_i(t) 就可以表示物品随着时间的变化,比如一部电影以前很流行,大家给的评分也很高,随着时间慢慢变得不符合现在的风格,大家的评分可能会变低,此时的物品偏置函数就可以跟着调节;
         3)还有就是用户爱好 p_u(t) 用来表示用户的兴趣发生了变化,用户以前喜欢一个演员,后来可能不喜欢,以前喜欢喜剧,后来慢慢变得喜欢爱情片,这种都是随着时间的爱好变化。
         按照上述规律,我们还应该有物品特征,但是普遍来看,物品的特征本质上很少发生变化,所以我们这里就不讨论它的时序影响。


        上面的这些随着时间变化的函数,现有工作也都做了很多研究,比如如何划分时间单位,如何设置时间函数的形式,有用线性拟合来模拟时间带来的影响的,也有用曲线进行拟合,利用核函数来控制时间的影响的。这里参考上述思路,我们就可以得到 timeSVD++ 的预测规则:
        看见上面这个公式不要害怕,我们仔细将它和公式 4 进行对比就可以发现,其实只是把对应的常量偏置替换为了一个时间函数而已



总结
      上面我们介绍了矩阵分解的一些进阶思路,基于矩阵分解的方法最大的优势就是它同时可以描述出物品和用户两方面的特征,这一点帮助其在评分预测的项目中要优于其他协同过滤的方法(基于邻域的方法内心OS:你闭嘴~~);另外一方面,矩阵分解的方法可以有效的节约内存,也相对容易训练。因此包括SVD++ 在内的这些矩阵分解方法也是 Netflix 比赛中的常见方法之一。


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

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

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

感谢支持,比心

欢迎加入推荐系统交流群

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多