推荐系统三十六式
刑无刀
“贝壳找房”资深算法专家,8 年推荐系统工程师
43607 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
开篇词 (1讲)
原理篇 · 深度学习 (2讲)
原理篇 · 其他应用算法 (3讲)
推荐系统三十六式
15
15
1.0x
00:00/00:00
登录|注册

10 | 那些在Netflix Prize中大放异彩的推荐算法

考虑时间因素
增加历史行为
增加偏置信息
基础的SVD算法
SVD
矩阵分解
Netflix Prize
参考文章

该思维导图由 AI 生成,仅供参考

早在前几篇务虚的文章中,我就和你聊过了推荐系统中的经典问题,其中有一类就是评分预测。
让我摸着自己的良心说,评分预测问题只是很典型,其实并不大众,毕竟在实际的应用中,评分数据很难收集到,属于典型的精英问题;与之相对的另一类问题行为预测,才是平民级推荐问题,处处可见。

缘起

评分预测问题之所以“虽然小众却十分重要”,这一点得益于十多年前 Netflix Prize 的那一百万美元的悬赏效应。
公元 2006 年 10 月 2 号,对于很多人来说,这只是平凡了无新意的一天,但对于推荐系统从业者来说,这是不得了的一天,美国著名的光盘租赁商 Netflix 突然广发英雄帖,放下“豪”言,这个就是土豪的“豪”,凡是能在他们现有推荐系统基础上,把均方根误差降低 10% 的大侠,可以瓜分 100 万美元。消息一出,群贤毕至。
Netflix 放出的比赛数据,正是评分数据,推荐系统的问题模式也是评分预测,也就是为什么说,评价标准是均方根误差了。
这一评分预测问题在一百万美元的加持下,催生出无数推荐算法横空出世,其中最为著名的就是一系列矩阵分解模型,而最最著名的模型就是 SVD 以及其各种变体。这些模型后来也经受了时间检验,在实际应用中得到了不同程度的开枝散叶。
今天我就来和你细聊一下矩阵分解,SVD 及其最有名的变种算法。

矩阵分解

为什么要矩阵分解

聪明的你也许会问,好好的近邻模型,一会儿基于用户,一会儿基于物品,感觉也能很酷炫地解决问题呀,为什么还要来矩阵分解呢?
刨除不这么做就拿不到那一百万的不重要因素之外,矩阵分解确实可以解决一些近邻模型无法解决的问题。
我们都是读书人,从不在背后说模型的坏话,这里可以非常坦诚地说几点近邻模型的问题:
物品之间存在相关性,信息量并不随着向量维度增加而线性增加;
矩阵元素稀疏,计算结果不稳定,增减一个向量维度,导致近邻结果差异很大的情况存在。
上述两个问题,在矩阵分解中可以得到解决。矩阵分解,直观上说来简单,就是把原来的大矩阵,近似分解成两个小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。
具体说来就是,假设用户物品的评分矩阵 A 是 m 乘以 n 维,即一共有 m 个用户,n 个物品。我们选一个很小的数 k,这个 k 比 m 和 n 都小很多,比如小两个数量级这样,通过一套算法得到两个矩阵 U 和 V,矩阵 U 的维度是 m 乘以 k,矩阵 V 的维度是 n 乘以 k。
这两个矩阵有什么要求呢?要求就是通过下面这个公式复原矩阵 A,你可以点击文稿查看公式。
类似这样的计算过程就是矩阵分解,还有一个更常见的名字叫做 SVD;但是,SVD 和矩阵分解不能划等号,因为除了 SVD 还有一些别的矩阵分解方法。

1 基础的 SVD 算法

值得一说的是,SVD 全称奇异值分解,属于线性代数的知识 ; 然而在推荐算法中实际上使用的并不是正统的奇异值分解,而是一个伪奇异值分解(具体伪在哪不是本文的重点)。
今天我介绍的 SVD 是由 Netflix Prize 中取得骄人成绩的 Yehuda Koren 提出的矩阵分解推荐算法。
按照顺序,首先介绍基础的 SVD 算法,然后是考虑偏置信息,接着是超越评分矩阵增加多种输入,最后是增加时间因素。好,一个一个来。
前面已经从直观上大致说了矩阵分解是怎么回事,这里再从物理意义上解释一遍。矩阵分解,就是把用户和物品都映射到一个 k 维空间中,这个 k 维空间不是我们直接看得到的,也不一定具有非常好的可解释性,每一个维度也没有名字,所以常常叫做隐因子,代表藏在直观的矩阵数据下面的。
每一个物品都得到一个向量 q,每一个用户也得到一个向量 p。对于物品,与它对应的向量 q 中的元素,有正有负,代表着这个物品背后暗藏的一些用户关注的因素。
对于用户,与它对应的向量 p 中的元素,也有正有负,代表这个用户在若干因素上的偏好。物品被关注的因素,和用户偏好的因素,它们的数量和意义是一致的,就是我们在矩阵分解之处人为指定的 k。
举个例子,用户 u 的向量是 pu,物品 i 的向量是 qi,那么,要计算物品 i 推荐给用户 u 的推荐分数,直接计算点积即可:
看上去很简单,难在哪呢?难在如何得到每一个用户,每一个物品的 k 维向量。这是一个机器学习问题。按照机器学习框架,一般就是考虑两个核心要素:
损失函数;
优化算法。
SVD 的损失函数是这样定义的:
理解 SVD 的参数学习过程并不是必须的,如果你不是算法工程师的话不必深究这个过程。
由于这个公式略复杂,如果你正在听音频,就需要自己看一下图片。这个损失函数由两部分构成,加号前一部分控制着模型的偏差,加号后一部分控制着模型的方差。
前一部分就是:用分解后的矩阵预测分数,要和实际的用户评分之间误差越小越好。
后一部分就是:得到的隐因子向量要越简单越好,以控制这个模型的方差,换句话说,让它在真正执行推荐任务时发挥要稳定。这部分的概念对应机器学习中的过拟合,有兴趣可以深入了解。
整个 SVD 的学习过程就是:
准备好用户物品的评分矩阵,每一条评分数据看做一条训练样本;
给分解后的 U 矩阵和 V 矩阵随机初始化元素值;
用 U 和 V 计算预测后的分数;
计算预测的分数和实际的分数误差;
按照梯度下降的方向更新 U 和 V 中的元素值;
重复步骤 3 到 5,直到达到停止条件。
过程中提到的梯度下降是优化算法的一种,想深入了解可以参见任何一本机器学习的专著。
得到分解后的矩阵之后,实质上就是得到了每个用户和每个物品的隐因子向量,拿着这个向量再做推荐计算就简单了,哪里不会点哪里,意思就是拿着物品和用户两个向量,计算点积就是推荐分数了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Netflix Prize中的推荐算法SVD在推荐系统领域取得了巨大成功。该算法通过矩阵分解解决了评分预测问题,将原始评分矩阵近似分解为两个小矩阵的乘积,得到用户和物品的隐向量。SVD算法的核心在于损失函数的定义和优化算法的选择,通过梯度下降等优化算法对隐向量进行学习和更新,最终得到分解后的矩阵,即用户和物品的隐向量,用于推荐计算。 在SVD算法的基础上,出现了多种改进方案。首先是考虑偏置信息的SVD变种,将用户和物品的评分偏置纳入模型,进一步提高了预测准确性。其次是SVD++,结合用户的隐式反馈行为和属性,进一步完善了模型。最后是考虑时间因素,对评分按照时间加权或划分区间,以适应用户的善变特点。 这些改进方案使SVD算法在Netflix Prize比赛中取得了骄人成绩,成为推荐系统领域的经典算法之一。其优势在于解决了近邻模型存在的相关性和稀疏性问题,提高了推荐的准确性和稳定性。这些技术特点使得SVD算法及其改进方案成为推荐系统领域的重要研究方向,为推荐系统的发展提供了重要的启示和借鉴。 总之,SVD算法及其改进方案在推荐系统领域具有重要意义,为解决评分预测问题提供了有效的技术手段,同时也为推荐系统的发展指明了方向。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《推荐系统三十六式》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • Dan
    請問老師隱性因子k的個數通常如何決定?

    作者回复: 用K-fold确定。

    2018-04-04
    11
  • 戏入蝶衣
    在最基础的svd模型里,如果不添加用户和物品的评分bias,会有什么影响?

    作者回复: 一般实际工作中也常常不分离出bias。

    2019-05-07
    3
  • 愚公移山
    老师,在SVD++分解中,用户的隐式反馈数据和用户属于是怎样加入到用户物品评分矩阵中的呢?损失函数应该需要这部分数据做监督训练的

    作者回复: 就是认为每个隐式反馈对象和每个属性都是一个特征,都对应一个隐因子向量。也就是公式中的xi和ya。

    2018-03-27
    2
  • 185
    根据我的理解,损失函数对行为数据是有用的,例如购买物品的数量、观看或者收听的时长、每天打开app的次数等都是和评分类似的数据。 我理解的对吗?

    作者回复: 可以这样处理,但又略有不同,下一篇会讲。

    2018-03-26
    2
  • nebula
    请问SVD分解,针对新用户、新物品,怎么做更新呢

    作者回复: SGD(随机梯度下降)本身就是可以在线更新的。

    2018-10-25
    1
  • Skye
    老师,我想问一下,SVD++对于隐式反馈数据,损失函数拟合的rui值是0吗?还有用户行为向量x和用户属性y这个迭代初始值是什么,加上这两个向量,可是损失函数拟合的还是评分,这两个向量好像有点捉摸不透,意义在哪,能否细讲一下

    作者回复: 其实就是,每个隐式反馈对象ID都是特征,这些特征背后都有一个k维的隐因子向量。所有这些隐因子向量都是未知参数,同等地位被优化,所以都是随机初始化。

    2018-03-26
    1
  • leoplodchang
    老师你好,我想请问下,在假如历史行为的那个章节中,你给出了r的公式,那么损失函数的公式是什么样的呢?直接将r套入么?损失函数的后一部分是什么样的呢?

    作者回复: 是的。损失函数还是均方根误差。

    2018-10-15
  • Skye
    行为次数可以作为评分,使用损失函数,但是基础的SVD模型缺少负样本,用户没有行为的记录不作为样本计算在内,在隐式反馈场景应该不行。SVD++加入了隐式反馈信息,在这个场景效果就好了。老师,这样理解对吗?

    作者回复: 不对。这里讲的全是评分预测,所以没有负样本。

    2018-03-26
  • jt120
    行为和评分,只是y不同,公式一样

    作者回复: 后面两篇会讲。

    2018-03-26
  • 写点啥呢
    请问老师,前面提到的SVD后利用有监督机器学习来得到用户和物品的隐因子向量,那么训练样本是如何获取的呢?有一点疑惑,训练样本已经是用户和物品之间的关系反应,还需要做机器学习么?

    作者回复: 训练样本是一部分用户对一部分物品的关系,要预测的是那部分还没有关系的。

    2018-03-26
收起评论
大纲
固定大纲
缘起
矩阵分解
为什么要矩阵分解
1 基础的 SVD 算法
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部