基于用户的协同过滤(UserCF)

协同过滤,就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的物品的推荐过程。

举一个在食堂吃饭的例子

问题背景

假如现在有四种类型的菜,分别是:鸡肉、猪肉、西红柿、白菜
然后有5名同学,A、B、C、D、E,现在我问题是,我们的推荐系统是否为用户E推荐西红柿这道菜
通过以往的打饭和评价记录得知,每个人对这四道菜的评价,如下图:
image.png
其中绿色点赞的图标,表示用户喜欢这道菜;灰色点踩的图标,表示用户不喜欢这道菜。现在想要对用户E对西红柿的评价做出预测,即图中红色连线和问号所示。

共现矩阵

这样的一个关系组织图,是非常的混乱的,我们对该关系示意图进行整理,可得:

image.png
将原来的有向图转换成矩阵的形式(共现矩阵),其中用户是行坐标,菜作为列坐标。将用户的“点赞”和“点踩”行为,分别转换成“1”和“-1”的数值,如果没有行为,则置为“0”。

通过上一步,我们得到了共现矩阵,现在的问题就是预测问号的数值,然后再决定是否为用户E推荐西红柿。很自然的,我们就会想到,使用其他与用户E相似的用户对西红柿的评价,来评估用户E对西红柿的评价。

相似度计算

使用余弦相似度,计算公式为:
推荐系统的信息“膨胀”过程 - 图3
计算其他用户与用户E的相似度:

推荐系统的信息“膨胀”过程 - 图4

推荐系统的信息“膨胀”过程 - 图5

推荐系统的信息“膨胀”过程 - 图6

推荐系统的信息“膨胀”过程 - 图7

做出推荐

取Top-2相似的用户,则分别取到了BC两位同学。分别用BC两位对西红柿的评价,来计算用户E对西红柿的评价,因为两位与用户E的相似度都是 推荐系统的信息“膨胀”过程 - 图8, 归一化之后,B、C的权重占比都为0.5 ,两位对西红柿的评价都是,即为-1,所以加权求和得-1,所以可以判断,用户E大概率不喜欢西红柿,就不向用户E推荐西红柿这道菜了。

可继续优化

以上就是基于用户协同过滤推荐的简单思路。
如果细究的话,还有很多很多地方可以优化,比如相似度如何计算(余弦相似度、皮尔逊相关系数法),最终结果排序的优化。

主要存在问题

  • 当前的互联网环境下,用户数量往往是大于物品数量的,比如音乐软件的用户量往往是上亿级别的,而歌曲数量,尤其是高质量的歌曲数量是远低于这个数量级的(网易云宣传总量是500万)。基于用户相似度需要维护用户相似度的矩阵,以便于快速的找出Top-N相似的用户。相似度矩阵的保存于更新,都需要巨大的花销,在线存储系统普遍难以承受。
  • 用户的历史数据向量可能会非常的稀疏,有些系统中(酒店预订、大件商品购买)等,用户行为非常的少,找到相似用户的准确率比较低,UserCF的方法也就不适用了。

基于物品的协同过滤(ItemCF)

很多的推荐系统,都没用采用UserCF的方法,采用的方法是ItemCF的方法。

概括性的说:ItemCF是基于物品相似度来进行推荐,通过计算共现矩阵中物品列向量的相似度得到物品之间的相似度,再找到与用户的历史正反馈物品相似的物品,进行进一步的排序和推荐。

处理步骤

  1. 基于历史数据,构建以用户为行坐标,物品为列坐标的 推荐系统的信息“膨胀”过程 - 图9 维的共现矩阵
  2. 计算共现矩阵列向量之间的相似度,构建 推荐系统的信息“膨胀”过程 - 图10 维的物品相似度矩阵
  3. 获取用户历史行为数据中的正反馈物品列表
  4. 利用物品相似度矩阵,针对目标用户历史行为中的正反馈物品,找出相似的Top-K个物品,组成物品集合
  5. 对相似物品集合中的物品,利用相似度分值进行排序,生成最终的推荐列表

协同过滤方法的问题

协同过滤无法将两个物品相似度这一信息推广到其他物品的相似度计算中,只能两个物品之间计算相似度。这样,热门的物品,有着较多的用户对其产生行为,自然就与更多的物品产生相似性,而处于尾部的物品,由于特征向量稀疏,很少与其他物品产生相似性,导致很少被推荐。这就是推荐系统中的长尾问题。
比如下面共现矩阵中的A、B、C、D四个物品的向量,余弦相似度矩阵为:

推荐系统的信息“膨胀”过程 - 图11
每一行分别表示一个物品,ABCD四个物品,列表示用户

A、B、C三个物品之间的相似度均为0,而与A、B、C最相似的物品都是D,而相似的原因是因为D是一件热门商品,多数用户都曾对其有过行为,无法计算A、B、C之间的相似度是因为特征向量过于稀疏,缺少A、B、C的历史数据。

矩阵分解

矩阵分解方法是在共现矩阵的基础之上,加入隐向量的概念,可以:

  • 加强模型处理稀疏矩阵的能力
  • 将用户和物品映射在同一个表示空间中

举例:
矩阵分解.png
用户和物品的隐向量,是通过分解协同过滤生成的共现矩阵得到的。

基于用户矩阵 推荐系统的信息“膨胀”过程 - 图13 和物品矩阵 推荐系统的信息“膨胀”过程 - 图14,用户 u 对物品 i 的预估评分为:

推荐系统的信息“膨胀”过程 - 图15

其中 推荐系统的信息“膨胀”过程 - 图16是用户 u 在矩阵 推荐系统的信息“膨胀”过程 - 图17 中对应的行向量,推荐系统的信息“膨胀”过程 - 图18 是物品 i 在物品矩阵 推荐系统的信息“膨胀”过程 - 图19 中的对应的列向量。

矩阵分解方法

奇异值分解

假设矩阵 推荐系统的信息“膨胀”过程 - 图20 是一个 推荐系统的信息“膨胀”过程 - 图21 的矩阵,则一定存在一个分解 推荐系统的信息“膨胀”过程 - 图22,其中 推荐系统的信息“膨胀”过程 - 图23推荐系统的信息“膨胀”过程 - 图24 的正交矩阵,推荐系统的信息“膨胀”过程 - 图25推荐系统的信息“膨胀”过程 - 图26 的正交矩阵,推荐系统的信息“膨胀”过程 - 图27推荐系统的信息“膨胀”过程 - 图28 的对角阵。
取对角阵 推荐系统的信息“膨胀”过程 - 图29 中较大的 推荐系统的信息“膨胀”过程 - 图30 个元素作为隐含特征,删除 推荐系统的信息“膨胀”过程 - 图31 的其他维度以及 推荐系统的信息“膨胀”过程 - 图32推荐系统的信息“膨胀”过程 - 图33 中对应的维度,矩阵 推荐系统的信息“膨胀”过程 - 图34 被分解为推荐系统的信息“膨胀”过程 - 图35,至此完成了隐向量维度为推荐系统的信息“膨胀”过程 - 图36 的矩阵分解。

但是存在相应的问题:

  • 奇异值分解要求原始的共现矩阵是稠密的。而很多时候用户的行为数据较少,共现矩阵非常的稀疏;
  • 计算复杂度过高,达到了 推荐系统的信息“膨胀”过程 - 图37 的级别(推荐系统的信息“膨胀”过程 - 图38行,推荐系统的信息“膨胀”过程 - 图39列),当用户数量达到百万级别时,已经难以计算。


梯度下降法

在上一节讲过,用户对物品的预估评分为:
推荐系统的信息“膨胀”过程 - 图40

确定目标函数
**
则构建目标函数的目标,就是使得原始评分 推荐系统的信息“膨胀”过程 - 图41 与用户向量和物品向量之积 推荐系统的信息“膨胀”过程 - 图42 的差尽量小,这样才能最大的保存共现矩阵的原始信息。所以目标函数为:
推荐系统的信息“膨胀”过程 - 图43

推荐系统的信息“膨胀”过程 - 图44 是所有用户评分样本的集合,为了减小过拟合,加入正则化项后的目标函数为:
推荐系统的信息“膨胀”过程 - 图45

对目标函数求导

推荐系统的信息“膨胀”过程 - 图46求偏导:
推荐系统的信息“膨胀”过程 - 图47

推荐系统的信息“膨胀”过程 - 图48 求偏导:
推荐系统的信息“膨胀”过程 - 图49

参数更新

沿梯度的反方向更新参数:
推荐系统的信息“膨胀”过程 - 图50
推荐系统的信息“膨胀”过程 - 图51
其中,推荐系统的信息“膨胀”过程 - 图52 为学习率。

终止条件

当迭代次数超过上限 n 或者损失低于阈值 推荐系统的信息“膨胀”过程 - 图53 时,结束训练。

在完成矩阵分解之后,即可得到所有用户和物品的隐向量。在对某用户进行推荐时,可利用该用户的隐向量与所有物品的隐向量进行逐一的内积运算,得出该用户对所有物品的评分预测,再对评分进行排序,得到最终的推荐列表。

矩阵分解与协同过滤的对比理解

协同过滤,如果两个用户没有相同的历史行为,两个物品没有相同的用户购买,那么这两个用户和两个物品的相似度将为0(因为协同过滤只能利用用户和物品自己的信息进行相似度计算,这就使得协同过滤不具备泛化利用全局信息的能力)

矩阵分解,加入了隐向量的概念,隐向量的生成过程是对共现矩阵进行全局拟合的过程,因此,隐向量是利用全局信息(所有用户与物品的交互行为)生成的,有着更强的泛化能力。使用隐向量,任意的用户和物品之间都可以得到预测分值。

对比
矩阵分解比协同过滤,有着更强的泛化能力,能在一定程度上解决数据稀疏性问题;可以降低矩阵维度,降低算法的空间复杂度;具有更好的扩展性和灵活性,矩阵分解最终产出的是用户和物品的隐向量,这其实与深度学习中的Embedding思想不谋而合,因此矩阵分解方法也非常的便于与其他的特征进行组合与拼接,并便于与深度学习网络进行无缝结合。

问题
矩阵分解方法和协同过滤一样,同样没有考虑用户、物品的上下文信息(用户身份、物品属性等)以及情境信息(不同时间、不同地点、不同任务、不同人的陪伴等)。所以这样的方法,还是对信息没有进行充分的使用。

逻辑回归

融合更多的信息

逻辑回归是一种能够融合多种特征的推荐模型。

相比协同过滤和矩阵分解,仅利用用户和物品的相互行为信息进行推荐,逻辑回归模型能够综合利用用户、物品、上下文、情境等多种不同的特征,据此来生成推荐结果。

点击率预估问题

逻辑回归将推荐问题看成了一个分类问题,通过预测正样本的概率对物品进行排序。
正样本可以是用户的:

  • 点击,点击某个商品,某条新闻
  • 观看,观看某个电影
  • 购买,购买了某个商品
  • 收听,收听了某个音乐

正样本,均是推荐系统希望用户产生的“正反馈”行为。因此,逻辑回归将模型推荐问题,转换成了一个点击率(Click Through Rate, CTR)预估问题。

数学形式

逻辑回归可以融合多种不同的特性数据。

逻辑回归模型的推断过程如下:

  1. 将特征向量 推荐系统的信息“膨胀”过程 - 图54作为模型的输入
  2. 通过为各特征赋予相应的权重 推荐系统的信息“膨胀”过程 - 图55, 来表示各特征的重要性差异,将各特征进行加权求和,即为 推荐系统的信息“膨胀”过程 - 图56
  3. 推荐系统的信息“膨胀”过程 - 图57 输入sigmoid 函数,使之映射到 0~1 的区间,得到最终的“点击率”

示意图:

image.png
需要确定的参数只有特征向量相应的权重 推荐系统的信息“膨胀”过程 - 图59.

优缺点

优点

  • 有数学推导过程,理论支撑好
  • 可解释性强
  • 适合工程化

缺点

  • 表达能力不强。物品表示过于简单
  • 只是对特征进行简单加权,无法进行特征交叉、特征筛选,易造成信息的干扰、损失

特征组合方法

手动组合

通过人工选择特征,进行组合,再通过分析手段筛选特征,但这样的方法没有普适性,而且人的经验在数据量过于庞大之后,就显得过于浅显,花费了大量的时间也难以找到最优的特征组合方式。

但这也是一种方法,在特定场景下,是可以考虑的。

POLY2模型

对所有的特征进行两两交叉,并对所有的特征组合赋予权重,通过暴力组合特征,在一定程度上解决特征组合的问题。数学形式如下:
推荐系统的信息“膨胀”过程 - 图60

问题:

  • 无选择的进行特征交叉,原来已经稀疏的特征,会更加的稀疏,进而导致权重参数的训练难以收敛(上式中,只有当 推荐系统的信息“膨胀”过程 - 图61推荐系统的信息“膨胀”过程 - 图62都不为0时,才能训练更新推荐系统的信息“膨胀”过程 - 图63参数)
  • 权重参数的数量从 推荐系统的信息“膨胀”过程 - 图64 的上升到 推荐系统的信息“膨胀”过程 - 图65 级别,增加了训练的复杂度

FM(Factorization Machines)-因子分解机

与POLY2模型相比,FM主要是用两个向量的内积 推荐系统的信息“膨胀”过程 - 图66,取代单一的权重参数 推荐系统的信息“膨胀”过程 - 图67
FM为每一个特征学习一个隐权重向量。在特征交叉时,使用两个特征的隐向量的内积,作为交叉特征的权重。在FM中,特征交叉部分的数学形式如下:
推荐系统的信息“膨胀”过程 - 图68

FM 引入隐向量的做法,与矩阵分解用隐向量代表用户和物品的做法异曲同工。可以说,FM是将矩阵分解隐向量的思想进行了进一步的扩展,从单纯的用户、物品隐向量扩展到了所有的特征上。

优势:

  • 降低模型训练的复杂度。将 POLY2 模型 推荐系统的信息“膨胀”过程 - 图69 级别的权重参数数量减少到 推荐系统的信息“膨胀”过程 - 图70 (推荐系统的信息“膨胀”过程 - 图71 为隐向量维度,推荐系统的信息“膨胀”过程 - 图72)。使用梯度下降法进行FM训练的过程中,FM的训练复杂度也被降低到了推荐系统的信息“膨胀”过程 - 图73 级别,极大地降低了训练开销。
  • 解决数据稀疏性问题。

是工业界的主流推荐模型之一。

FFM模型

与FM模型相比,FFM模型引入了特征域感知的概念,使模型的表达能力更强。其数学形式的二阶部分如下:

推荐系统的信息“膨胀”过程 - 图74

FM 的区别在于隐向量由原来的 推荐系统的信息“膨胀”过程 - 图75 变成了 推荐系统的信息“膨胀”过程 - 图76,这意味着每个特征对应的不是唯一一个隐向量,而是一组隐向量。当 推荐系统的信息“膨胀”过程 - 图77特征与推荐系统的信息“膨胀”过程 - 图78 特征进行交叉时,推荐系统的信息“膨胀”过程 - 图79特征会从推荐系统的信息“膨胀”过程 - 图80的这一组隐向量中挑出特征 推荐系统的信息“膨胀”过程 - 图81 的域 推荐系统的信息“膨胀”过程 - 图82 对应的隐向量 推荐系统的信息“膨胀”过程 - 图83 进行交叉。

这个域具体到底是什么呢,简单说,“域”就表示特征域。
举例来说,用户的性别特征中有“男、女、未知”三类,这三类组成一个特征域,电影的类型特征中有“爱情、战争”等特征,也组成一个特征域。

在原来进行特征交叉的时候,是直接将性别特征与电影类型进行组合,在加入域的概念之后,就可以分别进行“男性与爱情电影”,“男性与战争电影”,“女性与爱情电影”,“女性与战争电影”这样的特征组合了,增强了模型的表达能力,推荐的结果会更加的精确。但是 FFM 模型的计算复杂度就升高了,成为了 推荐系统的信息“膨胀”过程 - 图84 级别,远远大于 推荐系统的信息“膨胀”过程 - 图85 的数量级。