-->

深度学习推荐系统实战_20_15_协同过滤最经典的推荐模型我们应该掌握什么

你好,我是王哲啊,今天我们要开启推荐模型篇的学习。

那我想和你聊一聊我们应该掌握的经典的推荐模型有哪些?我们应该如何实现它们?那推荐模型篇是咱们整个课程中最重要的一个模块。

因为推荐模型直接决定了最终物品排序的结果,它的好坏也直接影响着推荐效果的优劣。

而且从某种意义上来讲,推荐系统的整体架构都是围绕着推荐模型搭建的,都是为了用于支持推荐模型的上线、训练、评估和服务等等。

因此,我一直把推荐模型称作推荐系统这个皇冠上的明珠。

而提起推荐模型,我们就不能不提协同过滤算法。

它可能是推荐系统自诞生以来最经典的算法,且没有之一。

那虽然我们的课程主题是深度学习推荐系统,但协同过滤以及它后续延伸出来的各类模型,都与深度学习模型有着千丝万缕的联系。

因此,在进入深度学习模型之前,掌握协同过滤以及它的延伸模型是非常有必要的那今天我们就来给你讲一讲经典协同过滤和它的延伸模型、矩阵分解的原理以及相关的spark实现。

那我在特征工程篇中曾经提到过,用户行为数据是推荐系统中最常用也是最关键的数据,用户的潜在兴趣。

用户对物品的评价好坏都反映在用户的行为历史中。

而协同过滤算法就是一种完全依赖用户和物品之间行为关系的推荐算法。

我们从他的名字协同过滤中也可以窥探到达,背后的原息,就是协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息。

这么说可能还是太抽象了。

接下来我们就一起看一个电商场景下的例子。

通过分析这个例子,你就能搞清楚协同过滤算法的推荐过程了。

这个电商推荐系统从得到原始数据到生成,最终的推荐分数全过程,一共分为六个步骤。

下面我们一一来讲,你可以结合我在文稿中给出的示意图来听一听。

那首先我们可以看到电商网站的商品库里边一共有四个商品,一个游戏机、一本小说、一本杂志以及一台电视机。

那假设现在有一名用户x访问了这个电商网站,电商网站的推荐系统,需要决定是否推荐电视机给用户。

X为了进行这项预测推荐系统可以利用的数据,有用户x对其他商品的历史评价数据,以及其他用户对这些商品的评价数据。

那我在图一b中用绿色的点赞标志表示好评,用红色彩的标志表示差评。

那这样一来,用户商品和评价数录就构成了带有标识的有向图。

接下来为了方便计算,我们把有向图转换成矩阵的形式,这个矩阵表示了物品共同出现的情况,因此也被称为贡献矩阵。

那其中用户是作为矩阵的行坐标物品作为列坐标。

我们再把点赞和彩的用户行为数据转换为矩阵中相应的元素值。

那这里我们将点赞的值设为一,将彩的值设为负一,没有数据值为零。

需要你注意的是,如果用户对物品有具体的评分,那贡献矩阵中的元素值可以取具体的评分值,而没有数据时的默认评分可以取评分的均值。

那你发现了吗?生成贡献矩阵之后,推荐问题就转换成了预测矩阵中问号元素的值。

这样的问题。

那由于在协同过滤算法中推荐的原理是让用户考虑与自己兴趣相似的用户的意见。

那因此预测的第一步就是找到与用户x兴趣最相似的n个用户。

然后综合相似用户对电视机的评价,得出用户x对电视机评价的预测。

从贡献矩阵中,我们可以知道,用户b和用户c有一个用户x的行向量近似,因此被选为套盆近似用户。

接着在图一e中,我们可以看到用户b和用户c对电视机的评价均是负面的。

因为相似用户对电视机的评价是负面的那是我们可以预测用户x对电视机的评价也是负面的那在实际的推荐过程中,推荐系统不会向用户x推荐电视机这一物品。

那到这里协同过滤的算法流程我们就说完了。

也许你已经发现了这个过程中有两点不严谨的地方,一是用户近似度到底怎么定义。

二是最后我们预测用户x对电视机的评价也是负面的,二个负面程度也应该有一个分数来衡量。

但这个推荐分数应该怎么计算呢?那首先我们来解决计算用户相似度的问题。

那计算相似度其实并不是什么难事。

因为在贡献矩阵中,每个用户对应的行向量,其实就可以被当做一个用户的embedding向量,相信你早已熟悉embedding相似度的计算方法了。

那我们这里就依葫芦画瓢,就可以知道基于贡献矩阵的用户相似度计算方法了。

最经典的方法就是利用余弦相似度了,它衡量了用户向量i和用户向量j之间向量夹角的大小夹角越小,余弦相似度越大,两个用户越相似。

那它的定义就是啊向量i和向量j的内积除以向量i和向量j模的乘积除了最常用的余弦相似度外,相似度的定义,还有皮尔逊相关系数、欧式距离等等。

咱们课程主要使用的是余弦相似度,因此掌握它就可以了。

接下来我们再来看一看推荐分数的计算。

那在获得top n个相似用户之后,利用top n用户生成最终的用户u对物品p的评分来一个比较直接的过程。

那这里我们假设的是目标用户与其相似用户的喜好是相似的那根据这个假设,我们可以利用相似用户的已有评价,那目标用户的偏好进行预测。

最常用的方式是利用用户相似度和相似用户评价的加权平均值来一得目标用户的评价预测。

那具体的公式你可以看一下文稿。

在获得用户u对不同物品的评价预测后,最终的推荐列表,我们根据评价预测得分进行排序就可以了。

那到这里我们就完成了协同过滤的全部推荐过程。

那虽然说协同过滤是目前公认的最经典的推荐算法,但我们还是可以轻松的找出它的缺点。

那就是贡献矩阵往往是非常技术的,在用户行为历史非常少的情况下,寻找相似用户的过程。

并不准确。

于是,著名的视频流媒体公司netf lix对协同过滤算法进行了改进,提出了矩阵分解。

算法找到了模型处理稀疏矩阵的能力。

我们还是用一个直观的例子来理解一下什么叫做矩阵分解。

那这次我从netf lix的矩阵分解论文中截取了两张示意图。

你可以看一下文稿。

那接下来我们利用这个示意图来比较一下协同过滤和矩阵分解的原理。

我们先来看图二a那协同过滤算法,找到用户可能喜欢的视频的方式很直观,那就是利用用户的观看历史,找到跟目标用户。

Joy看过同样视频的相似用户,然后找到这些相似用户喜欢看的其他视频,推荐给目标用户。

Joy而矩阵分解算法,是期望为每一个用户和视频生成一个隐向量,把用户和视频定位到隐向量的表示空间上。

我离相近的用户和视频表明兴趣特点接近。

那在推荐过程中,我们就应该把距离相近的视频推荐给目标用户。

那例如如果希望为图二b中的用户,dave啊推荐视频,我们可以找到离dave的用户向量最接近的两个视频向量。

他们分别是oceans eleven和the line king.我们可以根据向量距离由近到远的顺序生成dave的推荐列表。

啊,这个时候你肯定觉得矩阵分解不就是相当于一种embedding方法吗?啊,没错啊,矩阵分解的主要过程就是先分解协同过滤生成的贡献。

矩阵啊成用户和物品的隐向量啊,就类似是embedding向量,再通过用户和物品隐向量的相似性进行推荐。

那这个过程的关键就在于怎么分解这个贡献。

矩阵了。

那从形式上看,矩阵分解的过程是非常直观的,就是把一个NM乘以n的贡献矩阵分解成一个m乘以k的用户矩阵和k乘以n的物品矩阵相乘的形式。

那有了用户矩阵和物品矩阵,用户向量和物品向量就非常好提取了。

那用户影向量就是用户矩阵相应的行向量,而物品引向量就是物品矩阵相应的列向量。

那关键问题就剩下一个了,也就是我们该通过什么方法把贡献矩阵分解开呢?那最常用的方法就是梯度下降。

那梯度下降原理我们在第三节课就学习过,简单来说就是通过求偏导的形式来更新权重。

梯度更新的公式,你可以参考文稿中的公式。

那为了实现梯度下降,最重要的一步是定义损失函数。

L那定义好损失函数,我们才能够通过求导的方式找到梯度方向。

那矩阵分解的用失函数的定义,你也可以参考一下文稿。

那在这个目标函数里边,RUI是贡献矩阵里面,用户u对物品i的评分。

Qi是物品向量,PU是用户向量。

通过目标函数的定义,我们可以看到我们要求的物品向量和用户向量,是希望让物品向量和用户向量之积跟原始的评分之差的平方尽量小。

那简单来说就是我们希望用户矩阵和物品矩阵的乘积尽量接近原来的贡献矩阵。

那在通过训练得到用户引像量和物品引像量之后,在服务器内部的推荐过程跟我们之前讲过的embedding推荐是一样的。

你也已经在spark rex里面实践过了,是这方面的专家了。

我就不再多说啊,基础知识学完了,接下来又到了show me的code的时间了。

那这里我们继续使用spark实现矩阵分解算法。

我把关键的代码放在了文稿里,你可以参键的代码来听我的讲解。

那结合代码我们可以看到,由于spark ML lib已经把我们封装好的模型,所以矩阵分解算法实现起来非常简单,还是通过三步来完成的。

分别是定义模型啊,使用feed函数训练模型,最后提取物品的用户向量。

但是有一点我们需要注意,就是在模型中我们需要指定训练样本中用户ID对应的列啊uer ID int和物品ID对应的列movie ID int.并且这两个ID列对应的数据类型需要是int类型的那其实对于矩阵分解算法得出的结果,你完全可以把它当做embedding来处理。

那具体怎么做呢?在讲retiisce的时候,我们就已经实现过物品embedding和用户embedding的存储。

线上预估的过程。

我们通过上面代码已经可以得出矩阵分解后的用户和物品已向量了。

那你能不能仿照它的embedding实现它的spl, resists中动手实现一下它的线上部署过程呢?那这样你就可以看到矩阵分解模型的实际效果了。

嗯,好了,今天的课程讲完了,我们一起来做个总结。

那这节课我们一起学习了协同过滤算法以及它的后续算法矩阵分解。

作为最经典的推荐算法,我们应该好好的掌握并且实践它。

啊。

总结来说,协同过滤是一种协同大家的反馈评价和意见。

对海量的信息进行过滤,并从中筛选出用户感兴趣信息的一种推荐算法。

它的实现过程主要有三步。

先根据用户行为历史创建贡献矩阵,然后根据贡献矩阵,查找相似用户,再根据相似用户喜欢的物品,推推荐目标用户喜欢的物品啊,但是协通过率处理稀疏矩阵的能力比较差,因此矩阵分解算法就被提出了它通过分解贡献矩阵,生成用户向量矩阵和物品向量矩阵,进而得到用户影向量和物品影向量。

你可以完全把最后的结果当做用户embedding和物品embedding来处理。

啊,针对这节课的重要知识点,我把它们都列在了一张表格里。

你可以在文稿中啊回顾一下啊,最后我们来看两道思考题啊。

第一题是基于矩阵过滤算法,你能找到进行相似物品推荐的方法吗?啊,第二题是在movie lengs数据集中,不同用户对物品打分的标准其实不尽相同。

比如说有的人可能爱打高分评价的影片得分都在四分以上。

那有的人爱打低分,大部分影片都在三分以上。

你觉得这样的偏好对于推荐结果有影响吗?我们能不能在算法中消除这种偏好呢?好了,关于矩阵分解算法的实现,你学会了吗?欢迎把你的疑问和思考分享到留言区,也欢迎你能把这节课转发出去,我们下节课见。