推荐模型篇-1

目录标题

      • 推荐模型的重要性
        • 经典协同过滤和它的衍生模型矩阵分解的原理
            • 协同过滤算法的基本原理
            • 矩阵分解算法的原理
            • 用 Spark MLlib 已封装好的模型实现矩阵分解算法
            • 总结
        • 深度学习对推荐系统的影响
            • 一张深度学习模型 5 年内的发展过程图
            • 总结

推荐模型的重要性

  • 推荐模型在推荐系统中直接决定了最终物品排序的结果,它的好坏也直接影响着推荐效果的优劣。
  • 推荐系统的整体架构都是围绕着推荐模型搭建的,用于支持推荐模型的上线、训练、评估、服务。
  • 推荐模型可称作“推荐系统这个皇冠上的明珠”

经典协同过滤和它的衍生模型矩阵分解的原理

提起推荐模型,我们就不能不提协同过滤算法。它可能是推荐系统自诞生以来最经典的算法,且没有之一

协同过滤算法的基本原理

“用户行为数据是推荐系统最常用,也是最关键的数据。用户的潜在兴趣、用户对物品的评价好坏都反映在用户的行为历史中”

而协同过滤算法,就是一种完全依赖用户和物品之间行为关系的推荐算法。我们从它的名字“协同过滤”中,也可以窥探到它背后的原理,就是 “协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”

举一个电商场景下的例子:

这个电商推荐系统从得到原始数据到生成最终推荐分数,全过程一共可以总结为 6 个步骤:

  • 首先,我们可以看到,电商网站的商品库里一共有 4 件商品:一个游戏机、一本小说、一本杂志,以及一台电视机。假设,现在有一名用户 X 访问了这个电商网站,电商网站的推荐系统需要决定是否推荐电视机给用户 X。
  • 为了进行这项预测,推荐系统可以利用的数据有用户 X 对其他商品的历史评价数据,以及其他用户对这些商品的历史评价数据。上图 1(b) 中用绿色“点赞”的标志表示好评,用红色“踩”的标志表示了差评。这样一来,用户、商品和评价记录就构成了带有标识的有向图。
  • 为了方便计算,我们将有向图转换成矩阵的形式。这个矩阵表示了物品共同出现的情况,因此被称为“共现矩阵”。其中,用户作为矩阵行坐标,物品作为列坐标,我们再把“点赞”和“踩”的用户行为数据转换为矩阵中相应的元素值。这里,我们将“点赞”的值设为 1,将“踩”的值设为 -1,“没有数据”置为 0(如果用户对物品有具体的评分,那么共现矩阵中的元素值可以取具体的评分值,没有数据时的默认评分也可以取评分的均值)。
  • 生成共现矩阵之后,推荐问题就转换成了预测矩阵中问号元素(图 1(d) 所示)的值的问题。由于在“协同”过滤算法中,推荐的原理是让用户考虑与自己兴趣相似用户的意见。因此,我们预测的第一步就是找到与用户 X 兴趣最相似的 n(Top n 用户,这里的 n 是一个超参数)个用户,然后综合相似用户对“电视机”的评价,得出用户 X 对“电视机”评价的预测。
  • 从共现矩阵中我们可以知道,用户 B 和用户 C 由于跟用户 X 的行向量近似,被选为 Top n(这里假设 n 取 2)相似用户,接着在图 1(e) 中我们可以看到,用户 B 和用户 C 对“电视机”的评价均是负面的。因为相似用户对“电视机”的评价是负面的,所以我们可以预测出用户 X 对“电视机”的评价也是负面的。在实际的推荐过程中,推荐系统不会向用户 X 推荐“电视机”这一物品。

问题:
一是用户相似度到底该怎么定义?

计算用户相似度 在共现矩阵中,每个用户对应的行向量其实就可以当作一个用户的 Embedding 向量。相信你早已经熟悉 Embedding 相似度的计算方法,那我们这里依葫芦画瓢就可以知道基于共现矩阵的用户相似度计算方法啦。

最经典的方法就是利用余弦相似度了,它衡量了用户向量 i 和用户向量 j 之间的向量夹角大小。夹角越小,余弦相似度越大,两个用户越相似,它的定义如下:
在这里插入图片描述
除了最常用的余弦相似度之外,相似度的定义还有皮尔逊相关系数、欧式距离等等。

二是最后我们预测用户 X 对“电视机”的评价也是负面的,这个负面程度应该有一个分数来衡量,但这个推荐分数该怎么计算呢?

推荐分数的计算 在获得 Top n 个相似用户之后,利用 Top n 用户生成最终的用户 u 对物品 p 的评分是一个比较直接的过程。这里,我们假设的是“目标用户与其相似用户的喜好是相似的”,根据这个假设,我们可以利用相似用户的已有评价对目标用户的偏好进行预测。最常用的方式是,利用用户相似度和相似用户评价的加权平均值,来获得目标用户的评价预测,公式如下所示。
在这里插入图片描述
权重 wu,s​ 是用户 u 和用户 s 的相似度
Rs,p​ 是用户 s 对物品 p 的评分

在获得用户 u 对不同物品的评价预测后,最终的推荐列表根据评价预测得分进行排序即可得到。到这里,我们就完成了协同过滤的全部推荐过程。

缺点:
共现矩阵往往非常稀疏,在用户历史行为很少的情况下,寻找相似用户的过程并不准确。
于是,著名的视频流媒体公司 Netflix 对协同过滤算法进行了改进,提出了矩阵分解算法,加强了模型处理稀疏矩阵的能力。

矩阵分解算法的原理

从下面的图来比较协同过滤和矩阵分解的原理:

  • 上图 2(a) 所示,协同过滤算法找到用户可能喜欢的视频的方式很直观,就是利用用户的观看历史,找到跟目标用户 Joe 看过同样视频的相似用户,然后找到这些相似用户喜欢看的其他视频,推荐给目标用户 Joe。
  • 矩阵分解算法则是期望为每一个用户和视频生成一个隐向量,将用户和视频定位到隐向量的表示空间上(上图 2(b) 所示),距离相近的用户和视频表明兴趣特点接近,在推荐过程中,我们就应该把距离相近的视频推荐给目标用户。

例如,如果希望为图 2(b) 中的用户 Dave 推荐视频,我们可以找到离 Dave 的用户向量最近的两个视频向量,它们分别是《Ocean’s 11》和《The Lion King》,然后我们可以根据向量距离由近到远的顺序生成 Dave 的推荐列表。

那这个过程的关键就在于如何分解这个共现矩阵了。从形式上看,矩阵分解的过程是直观的,就是把一个 mxn 的共现矩阵,分解成一个 mxk 的用户矩阵和 kxn 的物品矩阵相乘的形式(如下图 )。
推荐模型篇-1_第1张图片
有了用户矩阵和物品矩阵,用户隐向量和物品隐向量就非常好提取了。用户隐向量就是用户矩阵相应的行向量,而物品隐向量就是物品矩阵相应的列向量。

问题:
该通过什么方法把共现矩阵分解开呢?

最常用的方法就是梯度下降。梯度下降的原理简单来说就是通过求取偏导的形式来更新权重。梯度更新的公式是 (wt+1=wt−α∗∂L​/∂`w)。为了实现梯度下降,最重要的一步是定义损失函数 L,定义好损失函数我们才能够通过求导的方式找到梯度方向,这里我们就给出矩阵分解损失函数的定义如下。
推荐模型篇-1_第2张图片
这个目标函数里面:
rui​ 是共现矩阵里面用户 u 对物品 i 的评分
qi​ 是物品向量,pu​ 是用户向量
通过目标函数的定义我们可以看到,我们要求的物品向量和用户向量,是希望让物品向量和用户向量之积跟原始的评分之差的平方尽量小。简单来说就是,我们希望用户矩阵和物品矩阵的乘积尽量接近原来的共现矩阵。

用 Spark MLlib 已封装好的模型实现矩阵分解算法
  • 定义模型
  • 使用 fit 函数训练模型
  • 提取物品和用户向量
  • 但是有一点需要注意,就是在模型中,我们需要在模型中指定训练样本中用户 ID 对应的列 userIdInt 和物品 ID 对应的列 movieIdInt,并且两个 ID 列对应的数据类型需要是 int 类型的。
    推荐模型篇-1_第3张图片

矩阵分解算法得出的结果,完全可以把它当作 Embedding 来处理。具体怎么做呢?在讲 Redis 的时候,我们就已经实现过物品 Embedding 和用户 Embedding 的存储和线上预估的过程了,你可以直接参考它。

总结

推荐模型篇-1_第4张图片

深度学习对推荐系统的影响

  • 深度学习极大地增强了推荐模型的拟合能力

在矩阵分解模型的结构中,用户 One-hot 向量和物品 One-hot 向量分居两侧,它们会先通过隐向量层转换成用户和物品隐向量,再通过点积的方式交叉生成最终的打分预测。但是,点积这种特征向量交叉的方式毕竟过于简单了,在数据模式比较复杂的情况下,往往存在欠拟合的情况。而深度学习就能大大加强模型的拟合能力,比如在 NeuralCF(神经网络协同过滤)模型中,点积层被替换为多层神经网络,理论上多层神经网络具备拟合任意函数的能力,所以我们通过增加神经网络层的方式就能解决模型欠拟合的问题了。
推荐模型篇-1_第5张图片

  • 深度学习模型可以利用模型结构模拟用户兴趣的变迁、用户注意力机制等不同的用户行为过程

正是因为深度模型拥有这样的灵活性,让它能够更轻松地模拟人们的思考过程和行为过程,让推荐模型像一个无所不知的超级大脑一样,把用户猜得更透。
推荐模型篇-1_第6张图片
这其中典型的例子就是阿里巴巴的模型 DIN(深度兴趣网络)和 DIEN(深度兴趣进化网络)。它们通过在模型结构中引入注意力机制和模拟兴趣进化的序列模型,来更好地模拟用户的行为。

图 左 的 DIN 模型,它在神经网络中增加了一个叫做“激活单元“的结构,这个单元就是为了模拟人类的注意力机制。
举个例子来说,我们在购买电子产品,比如说笔记本电脑的时候,更容易拿之前购买电脑的经验,或者其他电子产品的经验来指导当前的购买行为,很少会借鉴购买衣服和鞋子的经验。这就是一个典型的注意力机制,我们只会注意到相关度更高的历史购买行为,而 DIN 模型就是模拟了人类的注意力特点。
图右的DIEN 模型就更厉害了,它不仅引入了注意力机制,还模拟了用户兴趣随时间的演化过程。
图中那些彩色的层,这一层层的序列结构模拟的正是用户兴趣变迁的历史,通过模拟变迁的历史,DIEN 模型可以更好地预测下一步用户会喜欢什么。

一张深度学习模型 5 年内的发展过程图

图中的每一个节点都是一个重要的模型结构,节点之间的连线也揭示了不用模型间的联系

演化图最中心部分,是深度学习最基础的结构,我们叫它“多层神经网络”或者“多层感知机”,简称 MLP(MultiLayer Perceptron)。多层感知机它就像一个黑盒,会对输入的特征进行深度地组合交叉,然后输出对兴趣值的预测。其他的深度推荐模型全都是在多层感知机的基础上,进行结构上的改进而生成的,所以“多层感知机”是整个演化图的核心

从多层感知机向上,还有一个重点模型我们需要知道,那就是** Deep Crossing**。Deep Crossing 实际上是一类经典深度学习模型的代表,相比于 MLP,Deep Crossing 在原始特征和 MLP 之间加入了 Embedding 层。这样一来,输入的稀疏特征先转换成稠密 Embedding 向量,再参与到 MLP 中进行训练,这就解决了 MLP 不善于处理稀疏特征的问题。可以说,Embedding+MLP 的结构是最经典,也是应用最广的深度学习推荐模型结构

从 MLP 向下,是 Google 提出的推荐模型 Wide&Deep。它把深层的 MLP 和单层的神经网络结合起来,希望同时让网络具备很好的“记忆性”和“泛化性”。

Wide&Deep 提出以来,凭借着“易实现”“易落地”“易改造”的特点,获得了业界的广泛应用。围绕着 Wide&Deep 还衍生出了诸多变种,比如,通过改造 Wide 部分提出的 Deep&Cross 和 DeepFM,通过改造 Deep 部分提出的 AFM、NFM 等等。总之,Wide&Deep 是业界又一得到广泛应用的深度推荐模型。

除此之外,还可以看到经典的深度学习模型跟其他机器学习子领域的交叉。这里,举 3 个比较著名的例子:

  • 第 1 个是深度学习和注意力机制的结合,诞生了阿里的深度兴趣网络 DIN,浙大和新加坡国立提出的 AFM 等等;
  • 第 2 个是把序列模型引入 MLP+Embedding 的经典结构,诞生了阿里的深度兴趣进化网络 DIEN;
  • 第 3 个是把深度学习和强化学习结合在一起,诞生了微软的深度强化学习网络 DRN,以及包括美团、阿里在内的非常有价值的业界应用。

模型的演化有什么规律可循吗?模型改进的四个方向:

  • 一是改变神经网络的复杂程度。
  • 二是改变特征交叉方式。
  • 三是把多种模型组合应用。
  • 四是让深度推荐模型和其他领域进行交叉。
总结

推荐模型篇-1_第7张图片

你可能感兴趣的:(推荐系统实战,机器学习,tensorflow,深度学习,神经网络)