推荐算法之用矩阵分解做协调过滤——LFM模型

隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法。它矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔。本文将对 LFM 原理进行详细阐述,给出其基本算法原理。此外,还将介绍使得隐语义模型声名大噪的算法FunkSVD和在其基础上改进较为成功的BiasSVD。最后,对LFM进行一个较为全面的总结。

1. 矩阵分解应用于推荐算法要解决的问题

在推荐系统中,我们经常可能面临的场景是:现有大量用户和物品,以及少部分用户对少部分物品的评分,我们需要使用现有的用户对少部分物品的评分去推测用户对物品集中其他物品的可能的评分,从而将预测中评分高的物品推荐给用户。例如下面的用户物品评分表:

用户\物品 物品 1 物品 2 物品 3 物品 4 物品 5
用户 1   3     2      
用户 2   1     2     6  
用户 3     3   4   6    
用户 4   1   2     5    
用户 5     4   2     3  

对于每个用户,我们希望较准确的预测出其对未评分物品的评分。将m个用户和n个物品的评分看做一个矩阵M,从而将矩阵分解应用到该场景,即可解决这一问题。而本文,将关注于矩阵分解用于到推荐的方法之一,即LFM算法的解决方案。

2. LFM

LFM算法的核心思想是通过隐含特征(Latent factor)联系用户和物品,该算法最早在文本挖掘领域中被提出用于找到文本的隐含语义,相关名词还有LDA和Topic Model等。

2.1 如何表示用户的偏好和物品(item)属性?

在被问到这个问题时,针对MovieLens(电影评分)数据集,你可能会说用户是否喜欢动作片,物品所属电影类型去回答。但用户对其他类型的电影的偏好程度呢?物品在其它类型所占的权重又是多少呢?就算针对现有的电影类型去表征用户偏好和物品,那么能否能够完全的表示出用户的偏好和物品属性呢?答案是不能,比如用户喜欢看成龙的电影这个偏好没法表示出来,电影由谁导演,主演是谁没法表示。但你要问我用哪些属性去表征呢?这个谁也无法给出一个很好的答案,粒度很难控制。

2.2 LFM 来救场

隐语义模型较好的解决了该问题,它从数据出发,通过基于用户行为统计的自动聚类,可指定出表征用户偏好和物品的向量维度,最终得到用户的偏好向量以及物品的表征向量。LFM通过以下公式计算用户u对物品i的偏好:
\[ preference(u, i)=p^T_u q_i=\sum_f^F{p_{u,k}q_{i,k}} \]
这个公式,\(p_{u,k}\)度量了用户u的偏好和第f个隐类的关系,\(q_{i,k}\)度量了物品i和第f个隐类的关系。

那么现在,我们期望用户的评分矩阵M这样分解:
\[ M_{m*n}=P^T_{m*k}Q_{k*n} \]
那么,我们如何将矩阵分解呢?这里采用了线性回归的思想,即尽可能的让用户的评分和我们预测的评分的残差尽可能小,也就是说,可以用均方差作为损失函数来寻找最终的PQ。考虑所有的用户和样本的组合,我们期望的最小化损失函数为:
\[ \sum_{i,j}{(m_{ij}-p_i^Tq_j)^2} \]
只要我们能够最小化上面的式子,并求出极值所对应的\(p_i\)\(q_j\),则我们最终可以得到矩阵PQ,那么对于任意矩阵M任意一个空白评分的位置,我们就可以通过\(p^T_i q_j\)计算预测评分。

2.3 FunkSVD用于推荐

上面是隐语义模型LFM的基本原理,但在实际业务中,为防止过拟合,我们常常会加入一个L2的正则化项,这也就诞生了我们的FunkSVD算法。其优化目标函数\(J(p,q)\)定义为:
\[ \underbrace{argmin}_{p_i,q_j}\sum_{i,j}{(m_{ij}-p^T_iq_j)^2+\lambda({\Arrowvert{p_i}\Arrowvert}^2_2+{\Arrowvert{q_i}\Arrowvert}^2_2)} \]
其中λ为正则化系数,需要调参。对于这个优化问题,我们一般通过梯度下降法来进行优化得到结果。

将上式分别对\(p_i\)\(q_j\)求导我们得到:
\[ \frac{\partial{J}}{\partial{p_i}}=-2(m_{ij}-p^T_iq_j)q_j+2\lambda{p_i} \]

\[ \frac{\partial{J}}{\partial{q_j}}=-2(m_{ij}-p^T_iq_j)p_i+2\lambda{q_j} \]

则梯度下降中迭代公式为:
\[ p_i = p_i +\alpha((m_{ij}-p^T_iq_j)q_j-\lambda{p_i}) \]

\[ q_j = q_j+\alpha((m_{ij}-p^T_iq_j)p_i-\lambda{q_j}) \]

通过迭代我们最终可以得到PQ,进而用于推荐。

为读者进一步理解,笔者实现了基于MovieLens数据集实现了该方法。代码详见github: FunkSVD算法实现

2.4 BiasSVD用于推荐

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxxz.html