基于用户的协同过滤(UserCF)
协同过滤,就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的物品的推荐过程。
问题背景
假如现在有四种类型的菜,分别是:鸡肉、猪肉、西红柿、白菜
然后有5名同学,A、B、C、D、E,现在我问题是,我们的推荐系统是否为用户E推荐西红柿这道菜
通过以往的打饭和评价记录得知,每个人对这四道菜的评价,如下图:
其中绿色点赞的图标,表示用户喜欢这道菜;灰色点踩的图标,表示用户不喜欢这道菜。现在想要对用户E对西红柿的评价做出预测,即图中红色连线和问号所示。
共现矩阵
这样的一个关系组织图,是非常的混乱的,我们对该关系示意图进行整理,可得:
将原来的有向图转换成矩阵的形式(共现矩阵),其中用户是行坐标,菜作为列坐标。将用户的“点赞”和“点踩”行为,分别转换成“1”和“-1”的数值,如果没有行为,则置为“0”。
通过上一步,我们得到了共现矩阵,现在的问题就是预测问号的数值,然后再决定是否为用户E推荐西红柿。很自然的,我们就会想到,使用其他与用户E相似的用户对西红柿的评价,来评估用户E对西红柿的评价。
相似度计算
使用余弦相似度,计算公式为:
计算其他用户与用户E的相似度:
做出推荐
取Top-2相似的用户,则分别取到了B
、C
两位同学。分别用B
、C
两位对西红柿的评价,来计算用户E
对西红柿的评价,因为两位与用户E的相似度都是 , 归一化之后,B、C的权重占比都为0.5
,两位对西红柿的评价都是踩
,即为-1
,所以加权求和得-1
,所以可以判断,用户E
大概率不喜欢西红柿,就不向用户E
推荐西红柿这道菜了。
可继续优化
以上就是基于用户协同过滤推荐的简单思路。
如果细究的话,还有很多很多地方可以优化,比如相似度如何计算(余弦相似度、皮尔逊相关系数法),最终结果排序的优化。
主要存在问题
- 当前的互联网环境下,用户数量往往是大于物品数量的,比如音乐软件的用户量往往是上亿级别的,而歌曲数量,尤其是高质量的歌曲数量是远低于这个数量级的(网易云宣传总量是500万)。基于用户相似度需要维护用户相似度的矩阵,以便于快速的找出Top-N相似的用户。相似度矩阵的保存于更新,都需要巨大的花销,在线存储系统普遍难以承受。
- 用户的历史数据向量可能会非常的稀疏,有些系统中(酒店预订、大件商品购买)等,用户行为非常的少,找到相似用户的准确率比较低,UserCF的方法也就不适用了。
基于物品的协同过滤(ItemCF)
很多的推荐系统,都没用采用UserCF的方法,采用的方法是ItemCF的方法。
概括性的说:ItemCF是基于物品相似度来进行推荐,通过计算共现矩阵中物品列向量的相似度得到物品之间的相似度,再找到与用户的历史正反馈物品相似的物品,进行进一步的排序和推荐。
处理步骤
- 基于历史数据,构建以用户为行坐标,物品为列坐标的 维的共现矩阵
- 计算共现矩阵列向量之间的相似度,构建 维的物品相似度矩阵
- 获取用户历史行为数据中的正反馈物品列表
- 利用物品相似度矩阵,针对目标用户历史行为中的正反馈物品,找出相似的Top-K个物品,组成物品集合
- 对相似物品集合中的物品,利用相似度分值进行排序,生成最终的推荐列表
协同过滤方法的问题
协同过滤无法将两个物品相似度这一信息推广到其他物品的相似度计算中,只能两个物品之间计算相似度。这样,热门的物品,有着较多的用户对其产生行为,自然就与更多的物品产生相似性,而处于尾部的物品,由于特征向量稀疏,很少与其他物品产生相似性,导致很少被推荐。这就是推荐系统中的长尾问题。
比如下面共现矩阵中的A、B、C、D四个物品的向量,余弦相似度矩阵为:
每一行分别表示一个物品,ABCD四个物品,列表示用户
A、B、C三个物品之间的相似度均为0,而与A、B、C最相似的物品都是D,而相似的原因是因为D是一件热门商品,多数用户都曾对其有过行为,无法计算A、B、C之间的相似度是因为特征向量过于稀疏,缺少A、B、C的历史数据。
矩阵分解
矩阵分解方法是在共现矩阵的基础之上,加入隐向量的概念,可以:
- 加强模型处理稀疏矩阵的能力
- 将用户和物品映射在同一个表示空间中
举例:
用户和物品的隐向量,是通过分解协同过滤生成的共现矩阵得到的。
基于用户矩阵 和物品矩阵 ,用户 u
对物品 i
的预估评分为:
其中 是用户 u
在矩阵 中对应的行向量, 是物品 i
在物品矩阵 中的对应的列向量。
矩阵分解方法
奇异值分解
假设矩阵 是一个 的矩阵,则一定存在一个分解 ,其中 是 的正交矩阵, 是 的正交矩阵, 是 的对角阵。
取对角阵 中较大的 个元素作为隐含特征,删除 的其他维度以及 和 中对应的维度,矩阵 被分解为,至此完成了隐向量维度为 的矩阵分解。
但是存在相应的问题:
- 奇异值分解要求原始的共现矩阵是稠密的。而很多时候用户的行为数据较少,共现矩阵非常的稀疏;
- 计算复杂度过高,达到了 的级别(行,列),当用户数量达到百万级别时,已经难以计算。
梯度下降法
在上一节讲过,用户对物品的预估评分为:
确定目标函数
**
则构建目标函数的目标,就是使得原始评分 与用户向量和物品向量之积 的差尽量小,这样才能最大的保存共现矩阵的原始信息。所以目标函数为:
是所有用户评分样本的集合,为了减小过拟合,加入正则化项后的目标函数为:
对目标函数求导
对 求偏导:
对 求偏导:
参数更新
沿梯度的反方向更新参数:
其中, 为学习率。
终止条件
当迭代次数超过上限 n
或者损失低于阈值 时,结束训练。
在完成矩阵分解之后,即可得到所有用户和物品的隐向量。在对某用户进行推荐时,可利用该用户的隐向量与所有物品的隐向量进行逐一的内积运算,得出该用户对所有物品的评分预测,再对评分进行排序,得到最终的推荐列表。
矩阵分解与协同过滤的对比理解
协同过滤,如果两个用户没有相同的历史行为,两个物品没有相同的用户购买,那么这两个用户和两个物品的相似度将为0(因为协同过滤只能利用用户和物品自己的信息进行相似度计算,这就使得协同过滤不具备泛化利用全局信息的能力)
矩阵分解,加入了隐向量的概念,隐向量的生成过程是对共现矩阵进行全局拟合的过程,因此,隐向量是利用全局信息(所有用户与物品的交互行为)生成的,有着更强的泛化能力。使用隐向量,任意的用户和物品之间都可以得到预测分值。
对比
矩阵分解比协同过滤,有着更强的泛化能力,能在一定程度上解决数据稀疏性问题;可以降低矩阵维度,降低算法的空间复杂度;具有更好的扩展性和灵活性,矩阵分解最终产出的是用户和物品的隐向量,这其实与深度学习中的Embedding思想不谋而合,因此矩阵分解方法也非常的便于与其他的特征进行组合与拼接,并便于与深度学习网络进行无缝结合。
问题
矩阵分解方法和协同过滤一样,同样没有考虑用户、物品的上下文信息(用户身份、物品属性等)以及情境信息(不同时间、不同地点、不同任务、不同人的陪伴等)。所以这样的方法,还是对信息没有进行充分的使用。
逻辑回归
融合更多的信息
逻辑回归是一种能够融合多种特征的推荐模型。
相比协同过滤和矩阵分解,仅利用用户和物品的相互行为信息进行推荐,逻辑回归模型能够综合利用用户、物品、上下文、情境等多种不同的特征,据此来生成推荐结果。
点击率预估问题
逻辑回归将推荐问题看成了一个分类问题,通过预测正样本的概率对物品进行排序。
正样本可以是用户的:
- 点击,点击某个商品,某条新闻
- 观看,观看某个电影
- 购买,购买了某个商品
- 收听,收听了某个音乐
- …
正样本,均是推荐系统希望用户产生的“正反馈”行为。因此,逻辑回归将模型推荐问题,转换成了一个点击率(Click Through Rate, CTR)预估问题。
数学形式
逻辑回归可以融合多种不同的特性数据。
逻辑回归模型的推断过程如下:
- 将特征向量 作为模型的输入
- 通过为各特征赋予相应的权重 , 来表示各特征的重要性差异,将各特征进行加权求和,即为
- 将 输入
sigmoid
函数,使之映射到 0~1 的区间,得到最终的“点击率”
示意图:
需要确定的参数只有特征向量相应的权重 .
优缺点
优点
- 有数学推导过程,理论支撑好
- 可解释性强
- 适合工程化
缺点
- 表达能力不强。物品表示过于简单
- 只是对特征进行简单加权,无法进行特征交叉、特征筛选,易造成信息的干扰、损失
特征组合方法
手动组合
通过人工选择特征,进行组合,再通过分析手段筛选特征,但这样的方法没有普适性,而且人的经验在数据量过于庞大之后,就显得过于浅显,花费了大量的时间也难以找到最优的特征组合方式。
但这也是一种方法,在特定场景下,是可以考虑的。
POLY2模型
对所有的特征进行两两交叉,并对所有的特征组合赋予权重,通过暴力组合特征,在一定程度上解决特征组合的问题。数学形式如下:
问题:
- 无选择的进行特征交叉,原来已经稀疏的特征,会更加的稀疏,进而导致权重参数的训练难以收敛(上式中,只有当 、都不为0时,才能训练更新参数)
- 权重参数的数量从 的上升到 级别,增加了训练的复杂度
FM(Factorization Machines)-因子分解机
与POLY2模型相比,FM主要是用两个向量的内积 ,取代单一的权重参数 。
FM为每一个特征学习一个隐权重向量。在特征交叉时,使用两个特征的隐向量的内积,作为交叉特征的权重。在FM中,特征交叉部分的数学形式如下:
FM 引入隐向量的做法,与矩阵分解用隐向量代表用户和物品的做法异曲同工。可以说,FM是将矩阵分解隐向量的思想进行了进一步的扩展,从单纯的用户、物品隐向量扩展到了所有的特征上。
优势:
- 降低模型训练的复杂度。将 POLY2 模型 级别的权重参数数量减少到 ( 为隐向量维度,)。使用梯度下降法进行FM训练的过程中,FM的训练复杂度也被降低到了 级别,极大地降低了训练开销。
- 解决数据稀疏性问题。
是工业界的主流推荐模型之一。
FFM模型
与FM模型相比,FFM模型引入了特征域感知的概念,使模型的表达能力更强。其数学形式的二阶部分如下:
与 FM 的区别在于隐向量由原来的 变成了 ,这意味着每个特征对应的不是唯一一个隐向量,而是一组隐向量。当 特征与 特征进行交叉时,特征会从的这一组隐向量中挑出特征 的域 对应的隐向量 进行交叉。
这个域具体到底是什么呢,简单说,“域”就表示特征域。
举例来说,用户的性别特征中有“男、女、未知”三类,这三类组成一个特征域,电影的类型特征中有“爱情、战争”等特征,也组成一个特征域。
在原来进行特征交叉的时候,是直接将性别特征与电影类型进行组合,在加入域的概念之后,就可以分别进行“男性与爱情电影”,“男性与战争电影”,“女性与爱情电影”,“女性与战争电影”这样的特征组合了,增强了模型的表达能力,推荐的结果会更加的精确。但是 FFM 模型的计算复杂度就升高了,成为了 级别,远远大于 的数量级。