0%

推荐系统实践

推荐系统主要是用来解决信息过载的问题。疏通生产者和消费者之间的沟通障碍。一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,从而实现双赢。

搜索引擎满足了用户有明确目的时主动查找的需求,而推荐系统满足了用户在没有明确目的时帮助用户发现感兴趣内容的需求。推荐与搜索互补。同时推荐系统能更好的挖掘和处理长尾部分。

推荐系统评测

推荐系统主要有3种测评推荐效果的实验方法:离线实验,用户调查,在线实验

  1. 离线实验,主要有如下步骤构成

    1. 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集
    2. 将数据集按照一定的规则分成训练集和测试集
    3. 在训练集上训练用户兴趣模型,在测试集上进行预测
    4. 通过事先定义的离线指标评测算法在测试集上的预测结果
  2. 用户调查

  3. 在线实验,线上AB测试。

评测指标

  1. 用户满意度
    用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
    用户调查获取用户满意度主要通过调查问卷方式。
    在线系统中,用户满意度主要通过一些对用户行为的统计得到。比如满意或者不满意按钮。更一般的情况是通过点击率、用户停留时间、转化率等指标度量用户的满意度。
  2. 预测准确度
    预测准确度是最重要的推荐系统离线评测指标,度量一个推荐系统或者推荐算法预测用户行为的能力。计算该指标需要一个离线的数据集,分为训练集和测试集。最后通过在训练集上建立用户的行为和兴趣模型预测测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
    1. 评分预测
      评分预测的准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
    2. TopN推荐
      在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐即是TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量

      有时候,为了全面测评TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召回率曲线(precision/recall curve)
  3. 覆盖率
    覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。
    可以用信息论中的指标来定义覆盖率。
    1. 信息熵
    2. 基尼系数
  4. 多样性
  5. 新颖性
  6. 惊喜度
  7. 信任度
  8. 实时性
  9. 健壮性
    用于衡量一个推荐系统抗击作弊的能力。
    实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还可以借助以下方法
    1. 设计推荐系统时尽量选择代价比较高的用户行为,或者设计有差别的的权重,比如购买行为 > 浏览行为
    2. 使用数据前,进行攻击检测,对数据进行清理
  10. 商业目标

离线实验的优化目标是:最大化预测准确度,使得 覆盖率 > A, 多样性 > B, 新颖性 > C

评测维度
一般来说,分为三种: 用户维度、物品维度、时间维度。

在推荐系统评测报告中包含不同维度下的系统评测指标,可以帮助我们全面的了解推荐系统性能。找到一个看上去比较弱的算法的优势,发现一个看上去比较强的算法的弱点。

利用用户行为数据

我们需要通过算法自动发掘用户行为数据,从用户的行为中推测出用户的兴趣,从而给用户推荐满足他们的兴趣的产品或内容。

协同过滤算法
基于用户行为分析的推荐算法是个性化推荐系统的重要算法,即协同过滤算法。

用户行为数据最简单的存在形式就是日志。

用户行为在个性化推荐系统中一般分为两种——显性反馈行为、隐性反馈行为。

显性反馈如评分、点赞、踩等行为,隐性反馈如页面浏览行为。

用户行为按照反馈方向也可以分为——正反馈、负反馈。

一个简单的用户行为统一表示sample

user id 产生行为的用户的唯一标识
item id 产生行为的对象的唯一标识
behavior type 行为的种类(如购买 或者 浏览)
context 产生行为的上下文,包括时间、地点等等
behavior weight 行为的权重(如观看视频的行为,权重可以使观看时长;如果是打分行为,权重可以是分数))
behavior content 行为的内容(如果是评论行为,即是评论的文本;如果是打标签行为,即是标签)
  1. 用户活跃度和物品流行度的分布。
    互联网上的很多数据分布满足Power Law 分布,互联网领域成为长尾分布 f(x)=αxkf(x) = \alpha x^k
    用户行为数据也蕴含这种规律。令fu(k)f_u(k)为对kk个物品产生过行为的用户数,令fi(k)f_i(k)为被kk个用户产生过行为的物品数。那么fu(k)f_u(k)fi(k)f_i(k)都满足长尾分布。fi(k)=αikβifu(k)=αukβuf_i(k)=\alpha_ik^{\beta_i}\\f_u(k) =\alpha_uk^{\beta_u}

  2. 用户活跃度和物品流行度的关系。
    新用户倾向于浏览热门的物品,老用户会开始逐渐浏览冷门的物品。用户月活跃,越倾向于浏览冷门的物品。
    仅仅基于用户行为数据设计的推荐算法,一般称为协同过滤算法。比如"基于邻域的方法"、“隐语义模型”、“基于图的随机游走算法”。最著名应用广泛的是"基于邻域的方法"

    基于邻域的方法主要包括

    1. 基于用户的协同过滤算法
    2. 基于物品的协同过滤算法
  3. 实验设计和算法评测
    实验设计略,即常见的分割数据集训练集,多次试验取平均值。
    评测指标
    对用户uu推荐NN个物品(记为R(u)R(u)),令用户uu在测试集上喜欢的物品集合为T(u)T(u),然后可以通过 准确率/召回率 评测推荐算法的精度: Recall=uR(u)T(u)uT(u)Precision=uR(u)T(u)uR(u)\displaystyle Recall = \frac{\sum_u|R(u)\cap T(u)|}{\sum_u|T(u)|} \\ \displaystyle Precision = \frac{\sum_u|R(u)\cap T(u)|}{\sum_u|R(u)|}

    召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表里
    准确率描述最终的推荐列表中有多少比例是发生过的用户-物品评分记录

    除了评测算法的精度,还需要关注算法的覆盖率。覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将中长尾的物品推荐给用户。最简单的覆盖率定义: Coverage=UuUR(u)I\displaystyle Coverage = \frac{|U_{u\in U}R(u)|}{|I|}
    最后,我们还需要评测推荐的新颖度,这里用推荐列表中物品的平均流行度度量推荐结果的新颖度。

    计算平均流行度时对每个物品的流行度取对数,因为物品的流行度满足长尾分布,对数变换后,流行度的平均值更稳定。

  4. 基于邻域的算法

    1. 基于用户的协同过滤算法。

      1. 基础算法。主要包括2个步骤
        1. 找到和目标用户兴趣相似的用户集合
        2. 找到这个集合中的用户喜欢的,且目标用户没有听过的物品推荐给目标用户。

      步骤1的关键就是计算两个用户的兴趣相似度。协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)N(u)表示用户u有过正反馈的物品集合,令N(v)N(v)为用户v有过正反馈的物品集合。那么可以通过如下的Jaccard公式简单的计算u和v的兴趣相似度wuv=N(u)N(v)N(u)N(v)\displaystyle w_{uv} = \frac{|N(u)\cap N(v)|}{|N(u)\cup N(v)|}, 或者使用余弦相似度计算 wuv=N(u)N(v)N(u)N(v)\displaystyle w_{uv} = \frac{|N(u)\cap N(v)|}{\sqrt{|N(u)|| N(v)|}}
      事实上,很多用户相互之间没有对同样的物品产生过行为,即 N(u)N(v)=0|N(u)\cap N(v)| = 0。为了优化算法,我们可以反过来,优先计算 N(u)N(v)0|N(u)\cap N(v)| \ne 0的用户对(u,v)。为此,建立物品到用户的倒查表,对于每个物品都保存对该物品产生过行为的用户列表。令稀疏矩阵C[u][v]=N(u)N(v)C[u][v] = |N(u)\cap N(v)|,假设用户u,v同时属于某个倒查表中K的物品对应的用户列表,就有C[u][v]=KC[u][v] = K
      得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。度量UserCF算法中用户u对物品i的感兴趣程度公式:p(u,i)=vS(u,K)N(i)wuvrvi\displaystyle p(u,i) = \sum_{v\in S(u,K)\cap N(i)}w_{uv}r_{vi}, S(u,K)S(u,K)包含和用户u兴趣最接近的K个用户,N(i)N(i)是对物品ii有过行为的用户集合,wuvw_{uv}是用户u、v的兴趣相似度,rvir_{vi}代表用户v对物品i的兴趣。

      2. 用户相似度计算的改进。余弦相似度过于简单和粗糙。考虑跟进用户行为计算用户的兴趣相似度wuv=iN(u)N(v)1log1+N(i)N(u)N(v)\displaystyle w_{uv} = \frac{\sum_{i\in N(u)\cap N(v)} \frac{1}{log1 + |N(i)|}}{\sqrt{|N(u)||N(v)|}}, 通过1log1+N(i)\displaystyle \frac{1}{log 1 + |N(i)|}惩罚用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。
      3. 实际在线系统使用UserCF的情况
      相比于基于物品的协同过滤算法(ItemCF),UserCF在目前的实际应用中使用并不多。

    2. 基于物品的协同过滤算法
      基于物品的协同过滤算法是目前业界应用最多的算法。
      UserCF算法随着用户数目增加,计算用户兴趣相似度矩阵越来越难,运算时间复杂度和空间复杂度的增长和用户数的增长近似平方关系。同时,基于用户的协同过滤很难对推荐结果作出解释。

      1. 基础算法
        ItemCF并不利用物品的内容属性计算物品之间的相似度,主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大相似度,是因为喜欢物品A的用户大都也喜欢物品B。

        与UserCF不同,ItemCF可以利用用户的历史行为给推荐结果提供推荐解释。

        基于物品的协同过滤算法主要分为两步

        1. 计算物品之间的相似度(基于用户的行为计算物品相似度,而不是基于物品的属性计算相似度)
        2. 根据物品的相似度和用户的历史行为给用户生成推荐列表。

        物品的相似度公式:wij=N(i)N(j)N(i)\displaystyle w_{ij} = \frac{|N(i)\cap N(j)|}{|N(i)}
        其中N(i)N(i)是喜欢物品i的用户数,分子是同事喜欢物品i和物品j的用户数。

        该公式可以理解为喜欢物品ii的用户中有多少比列的用户也喜欢物品jj
        该公式存在一个问题,如果物品jj很热门,那么WijW_{ij}就会很大,接近1.即任何物品都会和热门的物品有很大的相似度,不利于长尾信息的挖掘。为了避免推荐热门物品,可以使用修正公式wij=N(i)N(j)N(i)N(j)\displaystyle w_{ij} = \frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}
        这个公式惩罚了物品jj的权重,因此减轻了热门物品会和很多物品相似的可能性。

        在协同过滤中两个物品产生相似度是因为他们共同被许多用户喜欢,也就是说每个用户都可以通过他们的历史兴趣列表给物品贡献相似度

        这里蕴含一个假设,就是每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。

        同理,ItemCF 也会建立 用户-物品 倒排表(即对每个用户建立一个包含他喜欢的物品的列表)

        在得到物品之间的相似度后,ItemCF通过后面的公式计算用户u对一个物品j的兴趣puj=iN(u)S(j,K)wjirui\displaystyle p_{uj}=\sum_{i\in N(u)\cap S(j,K)}w_{ji}r_{ui}
        N(u)N(u)是用户喜欢的物品的集合,S(i,K)S(i,K)是和物品ii最相似的KK个物品的集合,wjiw_{ji}是物品jj和物品ii的相似度,ruir_{ui}是用户uu对物品ii的兴趣(对于隐反馈数据及,如果用户u对物品i有过行为,可令rui=1r_{ui} = 1)。
        该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名

      2. 用户活跃度对物品相似度的影响
        IUF(Inverse User Frequence),即用户活跃度对数的倒数的参数,即认为活跃用户对物品的相似度的贡献应该小于不活跃的用户,使用IUF参数来修正物品相似度的计算公式。wij=uN(i)N(j)1log1+N(u)N(i)N(j)\displaystyle w_{ij}=\frac{\sum_{u\in N(i)\cap N(j)}\frac{1}{log1+|N(u)|}}{\sqrt{|N(i)||N(j)|}}

      该公式只是对活跃用户做了一种软性的惩罚。对于很多过于活跃的用户,为了避免相似度矩阵过于稠密,实际计算中一般直接忽略此类用户的兴趣列表,不纳入到相似度计算的数据集中。

      1. 物品的归一化
        将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率,覆盖率和多样性。归一化之后的相似度矩阵wij=wijmaxjwij\displaystyle w'_{ij} = \frac{w_{ij}}{\max_{j}w_{ij}}
        对于两个不同的类,什么样的类其类内物品之间的相似度高,什么样的类其类内物品相似度低?

      一般来说,热门的类其类内物品相似度一般比较大,如果不归一化,会推荐比较热门的类里面的物品,而这些物品也是比较热门的。

    3. UserCF 与 ItemCF比较
      UserCF给用户推荐那些和他有共同兴趣爱好的用户喜欢的物品,
      ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。
      UserCF推荐结果着重于反映和用户兴趣相似的小群体的热点,
      ItemCF推荐结果着重于维护用户的历史兴趣。
      UserCF更社会化,反应用户所在的小型兴趣群体中物品的热门程度,
      ItemCF更加个性化,反映用户自己的兴趣传承。

      两个不同领域的最热门物品之间往往具有比较高的相似度,比如新闻联播和黄金八点档。此时,只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降权。这些不是协同过滤讨论的范畴了。

  5. 隐语义模型

    1. 基础算法
      核心是通过隐含特征(latent factor)联系用户兴趣和物品。
      如两个用户A,B在豆瓣的读书列表,A涉猎侦探小说,科普读物以及计算机技术,B比较关注数学和机器学习。

      1. UserCF,首先找到和他们看了同样书的其他用户(兴趣相似的用户),然后推荐那些用户喜欢的其他书
      2. ItemCF,给他们推荐和他们已经看的书相似的书。
      3. 对书和物品的兴趣进行分类,对于某个用户,首先得到他的兴趣分类,然后从中挑选他可能喜欢的物品。

      方法3需要解决3个问题。

      1. 如何给物品分类
      2. 如何确定用户对哪些分类的物品感兴趣,以及感兴趣的程度
      3. 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在一个类中的权重。
        隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,譬如pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、矩阵分解。本章以LFM为例介绍隐含语义分析技术在推荐中的应用。LFM通过如下公司计算用户u对物品i的兴趣Preference(u,i)=rui=puTqi=f=1Fpu,kqi,k\displaystyle Preference(u,i) = r_{ui} = p_u^Tq_i=\sum_{f=1}^Fp_{u,k}q_{i,k}
        其中pu,kp_{u,k}qi,kq_{i,k}是模型的参数,pu,kp_{u,k}度量用户u的兴趣和第k个隐类的关系,而qi,kq_{i,k}度量第k个隐类和物品i之间的关系。

      要计算这两个参数,需要一个训练集。对于每个用户u,训练集里都包含了用户u喜欢的物品和不感兴趣的物品,通过学习这个数据集得到上面的模型参数。

      针对隐性反馈数据集,即只有正样本(用户喜欢了什么物品)没有负样本(用户不喜欢什么物品),应用LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。
      我们发现对负样本采样时需要遵循以下原则:

      1. 对于每个用户,要保证正负样本的均衡(数目相似)。
      2. 对于每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。

      一般认为,很热门而用户却没有行为更加代表用户对这个物品不感兴趣。
      因为对于冷门物品,用户可能压根儿不知道这个物品,谈不上是否感兴趣。经过采样得到用户-物品集 K=(u,i)K={(u,i)},正样本 rui=1r_{ui} = 1, 负样本rui=0r_{ui} = 0。然后需要诱惑如下的损失函数来找到最合适的参数p和q。C=(u,i)K(ruir^ui)2=(u,i)K(ruif=1Fpu,kqi,k)2+λpu2+λqi2\displaystyle C =\sum_{(u,i) \in K}(r_{ui} - \hat r_{ui})^2 = \sum_{(u,i)\in K}(r_{ui} - \sum_{f=1}^Fp_{u,k}q_{i,k})^2 + \lambda ||p_u||^2 + \lambda ||q_i||^2

      该公式右2项是用来防止过拟合的正则化项,λ\lambda可以通过实验获得。通过随机梯度下降算法最小化损失函数。{Cpuk=2qik+2λpukCqik=2puk+2λqik\displaystyle \begin{cases} \frac{\partial C}{\partial p_{uk}} = -2q_{ik} + 2\lambda p_{uk} \\ \frac{\partial C}{\partial q_{ik}} = -2p_{uk} + 2\lambda q_{ik} \end{cases},根据随机梯度下降法,需要将参数沿着最速下降方向推进,得到{puk=puk+α(qikλpuk)qik=qik+α(pukλqik)\displaystyle \begin{cases}p_{uk} = p_{uk} + \alpha(q_{ik}-\lambda p_{uk})\\ \displaystyle q_{ik}=q_{ik} + \alpha(p_{uk}-\lambda q_{ik})\end{cases}, 其中α\alpha是学习率,其选取需要通过反复实验比较获得。
      通过实验对比了LFM在TopN推荐中的性能。在LFM中,重要的参数有4个

      1. 隐特征的个数F
      2. 学习速率α\alpha
      3. 正则化参数λ\lambda
      4. 负样本/正样本比例 ratio

      通过实验发现,ratio参数对LFM的性能影响最大。当数据集良好时,LFM在所有指标上都优于UserCF和ItemCF。但是当数据集稀疏时,LFM性能明显下降,甚至不如UserCF和ItemCF。
       

    2. 基于LFM的雅虎首页个性化设计方案。
      雅虎的研究员以CTR作为优化目标,利用LFM来预测用户是否会单击一个链接。因此将用户历史上对首页上链接的行为记录作为训练集。如果用户u单击过链接i,那么(u,i)(u,i)定义为正样本,取值为1,如果链接i展示给过用户,但是用户u从来没有点击过,那么定义为负样本,取值为-1。

      LFM模型在实际使用中有一个困难,很难实现实时的推荐。经典的LFM模型每次训练时都需要扫描所有的用户行为记录,这样才能计算出用户隐类向量(pup_u)和物品隐类向量(qiq_i)。而且LFM训练需要在用户行为记录上反复迭代才能获得比较好的性能。LFM每次训练都非常耗时,一般实际应用中只能每天训练一次,并计算出所有用户的推荐结果。

      从而LFM模型不能因为用户行为的变化实时地调整推荐结果来满足用户最近的行为。

      由于新闻的实时,雅虎的研究人员提出了优化方案。

      1. 利用新闻链接的内容属性(关键词,类别等)得到链接ii的内容特征向量yiy_i
      2. 实时收集用户对链接的行为,并且用这些数据得到链接ii的隐特征向量qiq_i

      利用公式推测用户u是否单击链接i:rui=xuTyi+puTqi\displaystyle r_{ui} = x_u^T\cdot y_i + p_u^T \cdot q_i。其中,yiy_i是根据物品的内容属性直接生成的,xukx_{uk}是用户u对内容特征k的兴趣程度,用户向量xux_u可以根据历史行为记录获得,而且每天只需要计算一次。而且pu,qip_u,q_i是根据实时拿到的用户最近几小时的行为训练LFM得到的。因此对于一个新加入的物品i,可以通过xuTyix_u^T\cdot y_i估计用户uu对物品ii的兴趣。然后经过几小时后,可以通过puTqip_u^T\cdot q_i得到更加准确的预测值。
       

    3. LFM与基于邻域的方法比较

      1. 理论基础。LFM是一种学习方法,通过优化一个设定的指标来建立最优的模型。基于邻域的方法更多的是一种基于统计的方法,并没有学习过程。
      2. 离线计算的空间复杂度。基于邻域的方法需要维护一张离线表,计算过程中对内存要求很高。假设有M个用户N个物品。基于邻域的推荐空间复杂度是O(MM)或者O(NN)。而LFM建模过程中,如果是F个隐类,空间复杂度是O(F*(M+N))。在M、N很大时,LFM可以很好的节省离线计算内存。
      3. 离线计算的时间复杂度。假设有M个用户、N个物品、K条用户对物品的行为记录。UserCF复杂度O(N(K/N)2)O(N*(K/N)^2),ItemCF复杂度是O(M(K/M)2)O(M*(K/M)^2)。对于LFM,如果是F个隐类,迭代S次,复杂度是O(KFS)O(K*F*S)。通常要高于基于邻域的推荐方法。
      4. 在线实时推荐。 UserCF和ItemCF在线服务算法需要将相关表缓存在内存中,然后可以在线进行实时预测。LFM在给用户生成推荐列表时,需要计算用户对所有物品的兴趣权重再重新排名,返回权重最大的N个物品。因此在没有额外设计的情况下,LFM不能进行在线实时推荐。即用户有了新的行为后,他的推荐列表不会发生变化。
      5. 推荐解释。ItemCF算法很好的支持推荐解释。LFM比较困难。
  6. 基于图的模型
    用户的行为很容易用二分图表示,因而图算法很适合描述推荐系统。
     

    1. 用户行为数据的二分图表示。
      用户行为数据可以用一系列二元组组成。每个二元组(u,i)(u,i)表示用户u对物品i产生过的行为。这种数据集很容易用一个二分图表示。

    2. 基于图的推荐算法
      将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可转化为度量用户顶点vuv_u和与vuv_u没有边直接相连的物品节点在图上的相关性。相关性越高的物品在推荐列表中的权重就越高。
      度量顶点之间的相关性方法很多,一般取决于下述因素:

      1. 两个顶点之间的路径数
      2. 两个顶点之间的路径长度
      3. 两个顶点之间的路径经过的顶点。

      相关性高的一对顶点一般具有如下特征:

      1. 两个顶点之间有很多路径相连
      2. 连接两个顶点之间的路径长度都比较短
      3. 连接两个顶点之间的路径不会经过出度比较大的顶点

      基于随机游走的PersoanalRank算法介绍。
      PersonalRank算法可以通过随机游走进行比较好的理论解释,但是时间复杂度上有明显的缺陷。因为对每个用户进行推荐都需要在整个用户物品二分图上进行迭代,直接整个图上的每个顶点的PR值收敛。通过减少迭代次数的优化会损耗最终的精度。更好的方案是从矩阵论出发,重新设计算法。
      将PersonalRank转化为矩阵形式。令M为用户物品二分图的转移概率矩阵。
      M(v,v)=1out(v)\displaystyle M(v,v') = \frac{1}{|out(v)|}
      那么迭代公式可以转化为r=(1α)ro+αMTr\displaystyle r = (1-\alpha)r_o + \alpha M^Tr,即r=(1α)(1αMT)1r0\displaystyle r = (1-\alpha)(1-\alpha M^T)^{-1}r_0
      因此只需要计算一次(1αMT)1(1-\alpha M^T)^{-1}

推荐系统冷启动问题

推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,因此大量的用户行为数据是图鉴系统的重要组成部分和先决条件。

冷启动问题简介

冷启动问题主要分为3类

  1. 用户冷启动
    主要解决如何给新用户做个性化推荐的问题。新来的用户,没有他的行为数据,无法根据历史行为预测其兴趣,进而无法做个性化推荐。
  2. 物品冷启动
    主要解决如何将新的物品推荐给可能对它感兴趣的用户。
  3. 系统冷启动
    主要解决如何在一个没有用户,也没有用户行为,只有一些物品信息的情况下,提供个性化推荐。

解决方案

  1. 提供非个性化推荐,如热门排行榜。等到用户数据收集到一定的时候,再切换为个性化推荐
  2. 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化推荐
  3. 利用用户的社交网络账号登录,导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品
  4. 要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息。然后给用户推荐那些和这些物品相似的物品。
  5. 对于新加入的物品,可以利用内容信息,将他们推荐给喜欢过和它们相似的物品的用户。

利用用户注册信息

用户注册信息分3种

  1. 人口统计学信息。包括年龄、性别、职业、民族、学历和居住地
  2. 用户兴趣的描述。
  3. 从其它网站导入的用户站外行为数据。

基于注册信息的个性化推荐流程基本如下:

  1. 获取用户的注册信息
  2. 根据用户的注册信息对用户分类
  3. 给用户推荐他所属分类中用户喜欢的物品

p(f,i)p(f,i)可以简单定义为物品ii在具有ff特征的用户中的热门程度p(f,i)=N(i)U(f)\displaystyle p(f,i) = |N(i)\cap U(f)|
其中N(i)N(i)是喜欢物品i的用户集合,U(f)U(f)是具有特征f的用户集合。
这种定义可以比较准确地预测具有某种特征的用户是否喜欢某个物品。但是热门物品会在各种特征的用户中都具有比较高的权重。也就是说具有比较高的N(i)|N(i)|的物品会在每一类用户中都有比较高的p(f,i)p(f,i)。给用户推荐热门物品并不是推荐系统的主要任务,推荐系统应该帮助用户发现他们不容易发现的物品。因此,我们可以将p(f,i)p(f,i)定义为喜欢物品i的用户中具有特征f的比例:

p(f,i)=N(i)U(f)N(i)+α\displaystyle p(f,i) = \frac{|N(i)\cap U(f)|}{|N(i)| + \alpha}

这里分母中使用参数α\alpha来解决数据稀疏问题。如果一个物品只有1个用户喜欢过,而用户刚刚好就有特征f,那么p(f,i)=1p(f,i) = 1. 这种情况并没有统计意义,因此分母加上一个比较大的数,可以避免这样的物品产生比较大的权重。

针对不同的推荐系统场景,甚至不同的业务形态,可以灵活选择不同的推荐策略和方案。Amazon,当当这类图书推荐和抖音快手这类内容UGC的推荐策略是完全不同的。冷启动的推荐策略也完全不同。这主要取决于产品形态和目标设计。甚至不同渠道新增的用户也需要采取不同的推荐启动策略来留住用户。

推荐算法未必能给用户推荐符合他们特征的个性化物品,但是通常能够推荐给用户符合他们兴趣的个性化物品。比如推荐算法给老年人和年轻人推荐个性化物品,未必全部具有明显的用户群年龄特征。

选择合适的物品启动用户的兴趣

解决用户冷启动问题的另一个方法就是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户提供一些物品,让用户反馈他们对这些物品的兴趣。然后根据用户反馈给提供个性化推荐。
一般来说,能够用来启动用户兴趣的物品需要具有以下特点

  1. 比较热门
  2. 具有代表性和区分性
  3. 启动物品集合需要有多样性

上面这些因素都是选择启动物品时需要考虑的。Nadav Golbandi提出了一个决策树方案来设计选择启动物品集合的系统。

给定一个用户群,用这群用户对物品评分的方差度量这群用户兴趣的一致程度。如果方差大,说明这群用户的兴趣不太一致,反之则比较一致。令 σuU\sigma_u \in U'为用户集合中所有评分的方差,该算法的基本思想是通过如下方式度量一个物品的区分度D(i)D(i)

D(i)=σuN+(i)+σuN(i)+σuNˉ(i)\displaystyle D(i) = \sigma_{u\in N^+(i)} + \sigma_{u\in N^-(i)} + \sigma_{u\in \bar N(i)}

其中N+(i)N^+(i)是用户喜欢物品i的集合,N(i)N^-(i)是用户不喜欢物品i的集合,Nˉ(i)\bar N(i)是没有对物品i评分的用户集合。相应的σ\sigma是对应的方差。

Nadav Golbandi算法首先会从所有用户中找到具有最高区分度的物品i,然后将用户分为3类,在每类用户中再找到最具区分度的物品,然后又将每一类用户各自分为3类,以此类推。最终通过一系列对物品的看法将用户进行分类。

利用物品的内容信息 (ContentItemKNN)

一般来说,物品的内容可以通过向量空间模型表示。该模型会将物品表示成一个关键词向量。
对于物品d, 它的内容表示成一个关键词向量 di=(e1,w1),(e2,w2),...d_i = {(e_1, w_1), (e_2, w_2), ...},其中e是关键词,w是关键词对应的权重。
在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间的余弦相似度计算wij=didjdIdj\displaystyle w_{ij} = \frac{d_i\cdot d_j}{\sqrt{|d_I||d_j|}}

理想很丰满,现实很骨感。内容相似度计算简单,能频繁更新,而且能够解决物品冷启动问题,但是效果并不稳定,甚至还比较差劲。ContentItemKNN实践中常常比ItemCF差很远,仅仅比random算法你好一丢丢,和MostPopular算法差不多。因为ContentItemKNN非常依赖内容的特征。所以针对内容特征突出的数据集,ContentItemKNN可以有比ItemCF更好的推荐准确率。

针对性的融合ContentItemKNN和ItemCF,可以得到比两者单独使用更好的效果。

发挥专家的作用

推荐系统刚建立时,既没有用户的行为数据,也没有充足的物品内容信息来计算准确的物品相似度。这时候,利用专家进行人工标注,可以提升整体的推荐效果。

利用用户标签数据

目前流行的图鉴系统基本通过3种方式联系用户兴趣和物品。

标签是一种无层次化结构的、用来描述信息的关键词,可以用来描述物品的语义。UGC的标签系统是一种表示用户兴趣和物品语义的重要方式。

标签系统中的推荐问题

  1. 用户为什么进行标准
  2. 用户如何打标签
  3. 用户打什么样的标签

基于标签的推荐系统

用户标签行为的最简数据集一般由一个三元组的集合表示,其中记录(u,i,b)(u,i,b)表示用户u给物品i打上了标签b。这里不考虑打标签的时间、用户属性数据、物品属性数据。

利用上下文信息

时间上下文信息

  1. 时间效应简介
    时间信息对用户兴趣的影响表现在以下方面。

    1. 用户兴趣是变化的
    2. 物品也是有生命周期的
    3. 季节、节日效应
  2. 系统时间特性的分析
    在给定时间信息后,推荐系统从一个静态系统变成了一个时变的系统,用户行为数据也变成了时间序列。
    通过研究时变的用户行为数据集来研究不同类型网站的时间特性。包含时间信息的用户行为数据集由一系列三元组构成,其中每个三元组(u,i,t)(u,i,t)代表了用户uu在时刻tt对物品ii产生过行为。
    给定数据集后,可以通过统计如下信息研究系统的时间特性。

    1. 数据集每天独立用户数的增长情况
    2. 系统的物品变化情况
    3. 用户访问情况

    物品的生存周期和系统的时效性
    我们可以用如下指标衡量物品的生命周期。

    1. 物品平均在线天数
    2. 相隔T天系统物品流行度向量的平均相似度
  3. 推荐系统的实时性
    用户兴趣是不断变化的,其变化体现在用户不断增加的新行为中。一个实时的推荐系统需要能够实时响应用户新的行为,让其推荐列表不断变化,从而满足用户不断变化的兴趣。隐性反馈未必能导致推荐列表的变化,但是所有的显性反馈行为都会导致推荐列表的变化。
    实现推荐系统的实时性除了对用户行为的存取有实时性要求,还要求推荐算法本身具有实时性,推荐算法本身的实时性意味着:

    1. 实时推荐系统不能每天都给所有用户离线计算推荐结果,然后在线展示昨天计算出来的结果。即要求每个用户访问推荐系统时,根据用户这个时间点前的行为实时计算推荐列表。
    2. 推荐算法需要平衡考虑用户的近期行为和长期行为。既要让推荐列表反应出用户近期行为所体现的兴趣变化,又不能让推荐列表完全受用户近期行为的影响,即保证推荐列表对用户兴趣预测的延续性。
  4. 推荐算法的时间多样性
    推荐系统常常遇到一个问题,就是每天给用户的推荐结果都差不多,没有什么变化。推荐系统每天推荐结果的变化程度被定义为推荐系统的时间多样性。时间多样性高的推荐系统中用户会经常看到不同的推荐结果。

    基于此,社交UGC领域相对电商领域而言,推荐系统会有更大的可能性和话语权,发挥更直接的作用。因为社交UGC日新增内容远远大于电商领域的日新增商品。

    提高推荐结果的时间多样性需要分两步解决:

    1. 保证推荐系统能够在用户有了新的行为后及时调整推荐结果,使得推荐结果满足用户最近的兴趣
    2. 保证推荐系统在用户没有新的行为时也能够经常变化一下结果,具有一定的时间多样性。
      如果没有用户行为,如何保证给用户的推荐结果具有一定的时间多样性。
      1. 在生成推荐结果时加入一定的随机性。比如从推荐列表前20个结果中随机挑选10个展示,或者按照推荐物品的权重采样10个结果展示给用户。
      2. 记录用户每天看到的推荐结果,然后在每天给用户进行推荐时,对他前几天看到过很多次的推荐结果进行适当性降权
      3. 每天给用户使用不同的推荐算法(不建议这么做)。
  5. 时间上下文推荐算法
    建模时间信息有很多方法。

    1. 最近最热门
      在没有时间信息的数据集里,可以给用户推荐历史上最热门的物品。在获得用户行为的时间信息后,最简单的非个性化推荐算法就是给用户推荐最近最热门的物品。给定时间T,物品i最近的流行度ni(T)n_i(T)可以定义为 ni(T)=(u,i,t)Train,t<T11+α(Tt)\displaystyle n_i(T) = \sum_{(u,i,t)\in Train, t<T} \frac{1}{1+\alpha (T - t)},其中α\alpha是时间衰减参数。

    2. 时间上下文相关的ItemCF算法。
      ItemCF由两个核心部分组成

      1. 利用用户行为离线计算物品之间的相似度
      2. 根据用户的历史行为和物品相似度矩阵,给用户做在线个性化推荐

      时间信息在上面两个核心部分中都有重要的应用,这体现在两种时间效应上。

      1. 物品相似度。 用户在相隔很短的时间内喜欢的物品具有更高的相似度。
      2. 在线推荐。用户近期行为相比用户很久之前的行为,更能体现用户现在的兴趣。因此预测用户现在的兴趣时,应该加重用户近期行为的权重,优先给用户推荐那些和他近期喜欢的物品相似的物品。
    3. 时间上下文相关的UserCF算法
      和ItemCF一样,UserCF算法同样可以利用时间信息提高预测的准确率。我们可以在以下两方面利用时间信息改进UserCF算法

      1. 用户兴趣相似度。 考虑到不同用户喜欢相似物品的时间间隔,添加时间间隔惩罚,调整兴趣相似度的权重。
      2. 相似兴趣用户的最近行为。 优先考虑给用户推荐和他兴趣相似的用户最近喜欢的物品。
  6. 时间段图模型
    即基于图的模型在时变个性化推荐系统的应用。

  7. 离线实验

地理上下文信息

基于空间地理位置的推荐。

利用社交网络数据

社会化推荐主要有以下优点

  1. 好友推荐可以增加推荐的信任度
  2. 社交网络可以解决冷启动问题

当然,社会化推荐最主要的缺点是很多时候并不一定能提高推荐算法的离线精度(准确率和召回率)。

基于邻域的社会化推荐算法

给定一个社交网络和一份用户行为数据集。其中社交网络定义了用户之间的好友关系,用户行为数据集定义了不同用户的历史行为和兴趣数据。

最简单的算法就是给用户推荐好友喜欢的物品集合。即用户u对物品i的兴趣puip_{ui}可以通过公式计算pui=vout(u)rvi\displaystyle p_{ui} = \sum_{v \in out(u)}r_{vi}。其中out(u)out(u)使用户u的好友集合。rvir_{vi}表示用户u好友v是否喜欢物品i。

考虑到不同的好友和用户u的熟悉程度和兴趣相似度也不同,因此推荐算法中考虑好友和用户熟悉程度以及兴趣相似度:pui=vout(u)wuvrvi\displaystyle p_{ui} = \sum_{v\in out(u)}w_{uv}r_{vi}。这里wuvw_{uv}由两部分相似度构成,一部分是用户之间的熟悉程度,另一部分是用户之间的兴趣相似度。

熟悉度可以用用户之间的共同好友比例来度量。也就是说如果用户u和用户v很熟悉,那么一般来说,他们之间应该有很多共同好友familiarity(u,v)=out(u)out(v)out(u)out(v)\displaystyle familiarity(u,v) = \frac{|out(u)\cap out(v)|}{|out(u)\cup out(v)|}
兴趣相似度可以通过和UserCF类似的方法度量,如果两个用户喜欢的物品集合重合度很高,两个用户的兴趣相似度很高similiarity(u,v)=N(u)N(v)N(u)N(v)\displaystyle similiarity(u,v) = \frac{|N(u)\cap N(v)|}{|N(u)\cup N(v)|}

这个推荐设计的假设,在社交实践中是非常容易翻车的。社交网络上共同好友很多的人,未必互相认识,或者干脆互相讨厌。尤其是在熟人社交网络里,这种翻车的现象尤其严重。相反,在理性(非约炮性质)陌生人社区或者基于内容为主的社交网络,这个推荐设计的假设效果往往非常好。

基于图的社会化推荐算法

在社交网络中存在3种关系,一种是用户对物品的兴趣关系,一种是用户之间的社交网络关系,一种是多个用户属于同一个社群。将3种关系建立到图模型中,实现对用户的个性化推荐。

信息流推荐

信息流推荐是社会化推荐领域的重磅话题。信息流的个性化推荐需要解决的问题就是如何进一步帮助用户从信息墙上挑选有用的信息。

以Facebook的EdgeRank方案为例子分析。该算法综合考虑了信息流中每个会话的时间、长度与用户兴趣的相似度。Facebook将其他用户对当前用户信息流中的会话产生过行为的行为成为edge,而一条会话的权重定义为edges euewede\displaystyle \sum_{edges \space e}u_ew_ed_e

  1. ueu_e指产生行为的用户和当前用户的相似度,这里的相似度只要是在社交网络中的熟悉度。
  2. wew_e指行为的权重,这里的行为包括发布日志、上传相册、评论、like、打标签,不同的行为有不同的权重。
  3. ded_e指时间衰减参数,越早的行为对权重的影响越低。
    不过EdgeRank算法的个性化因素仅仅是好友的熟悉度,没有考虑帖子的内容和用户兴趣的相似度。所以EdgeRank仅仅考虑了“我”周围用户的社会化兴趣,而没有重视“我”个人的个性化兴趣。

推荐系统实例

  1. 外围架构
    UI系统负责展示并与用户交互。通过日志系统将用户在UI上的各种行为记录到用户行为日志中。存储系统用来存储用户的日志,包括缓存,数据库,文件系统。推荐系统通过分析用户的行为日志,给用户生成推荐列表,展示到UI系统。
    数据的收集和存储
    个性化推荐算法依赖于用户行为数据。

  2. 推荐系统架构
    如果认为用户喜欢的物品也是一种用户特征,或者和用户兴趣相似的其他用户也是一种用户特征,那么用户就和物品通过特征相联系。基于此,可以设计一种基于特征的推荐系统架构。

    当用户到来之后,推荐系统需要为用户生成特征,然后对每个特征找到和特征相关的物品,从而最终生成用户的推荐列表。
    因此推荐系统的核心任务就被拆解为2部分。

    1. 如何为给定用户生成特征
    2. 如何根据特征找到物品

    用户的特征种类非常多,主要包括:人口统计学特征、用户行为特征、用户话题特征等。
    推荐系统的推荐任务也很多种:

    1. 将最新加入的物品推荐给用户
    2. 将商业上需要宣传的物品推荐给用户
    3. 给用户推荐不同种类的物品 (比如视频、图片、音乐、图书等等)
    4. 给用户混合推荐(有时候徐亚将不同种类的物品放到一个推荐列表中展示给用户)
    5. 对于不同的产品推荐不同新颖度的物品(比如首页展示热门推荐物品,其他页展示长尾物品)
    6. 考虑到用户访问推荐系统的上下文

    如果要在一个系统中把上面提到的各种特征和任务都统筹考虑,那么系统会非常复杂,而且很难通过配置文件方便的配置不同特征和任务的权重。因此推荐系统需要由多个推荐引擎组成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定权重或者优先级合并、排序然后返回。这样做的两个好处

    1. 可以方便的增加/删除引擎,控制不同引擎对推荐结果的影响。绝大多数需求,只需要通过不同的组合实现。
    2. 可以实现推荐引擎级别的用户反馈。每一个推荐引擎其实代表了一种推荐策略。而不同的用户可能喜欢不同的推荐策略。通过分析用户对推荐结果的反馈了解用户比较喜欢哪种推荐引擎推荐出来的结果,从而对不同的用户给出不同的引擎组合权重。

  3. 推荐引擎的架构
    推荐引擎使用一种或几种用户特征,按照一种推荐策略生成一种类型物品的推荐列表。

    如上图,推荐引擎架构主要包括3部分。

    1. 部分A负责从数据库或缓存中拿到用户行为数据,通过分析不同行为,生成当前用户的特征向量。如果是使用非行为特征,就不需要使用行为提取和分析模块了。该模块的输出是用户特征向量
    2. 部分B负责将用户的特征向量通过特征-物品相关矩阵转化为初始推荐物品列表。
    3. 部分C负责对初始的推荐列表进行过滤、排名等处理,从而生成最终的推荐结果。

     

    1. 生成用户特征向量
      用户特征包括两种:人口统计学特征、用户行为特征。
      一个特征向量由特征和特征的权重组成,利用用户行为计算特征向量时需要考虑
      1. 用户行为的类别。比如浏览、点击、收藏、打分、购买、评论、打标签、分享、搜索等等。一般用户付出代价越大的行为权重越高。
      2. 用户行为产生的时间。 一般来说近期行为比较重要。
      3. 用户行为的次数。 行为次数越多的物品对应的特征权重越高。
      4. 物品的热门程度。热门往往不能代表用户个性。反之,用户对不热门的物品产生了行为,反映了用户个性化需求。因此推荐引擎在生成用户特征时会加重不热门物品对应的特征的权重。
         
    2. 特征-物品相关推荐
      在得到永辉的特征向量后,可以根据离线的相关表得到初始的物品推荐列表。最简表结构如下。
      srd_id dst_id weight
      特征ID 物品ID 权重
      对于每个特征,我们可以在相关表中存储和它最相关的N个物品的ID。
       
    3. 过滤模块
      过滤模块会过滤掉以下物品
      1. 用户已经产生过行为的物品
      2. 候选物品意外的物品。 候选物品一般有2个来源:产品需求,比如在首页要求将新加入的物品推荐给用户;用户自己的选择,比如用户选择了某个约束条件(比如价格区间)
      3. 某些质量很差的物品。 用于提升用户体验,推荐系统需要过滤掉基于产品原则或者其他规则判定为很差属性的物品。
    4. 排名模块
      过滤后的推荐结果直接展示给用户一般也没问题。通过一些排名,可以更好的提升用户满意度。
      1. 新颖性排名。 优化长尾物品的展示。
        要准确了解用户是否已经知道某个物品是非常困难的,只能通过近似的方式估算,比如对推荐结果中热门的物品进行降权。pui=puilog(1+αpopularity(i))\displaystyle p_{ui} = \frac{p_{ui}}{log(1 + \alpha\cdot popularity(i))}

        要实现推荐结果的新颖性,仅仅在最后对热门物品进行降权是不够的,应在推荐引擎的各个部分考虑新颖性问题。在计算用户行为特征向量是要考虑 rujr_{uj}, 在计算物品相似度时候要考虑wjiw_{ji}。计算着两个参数时候都要考虑新颖性。

      2. 多样性
        多样性也是推荐系统的重要指标之一。增加多样性可以让推荐结果覆盖尽可能多的用户兴趣。

        尽可能的控制不同推荐结果的推荐理由出现的次数。需要让推荐结果尽量来自不同的特征,具有不同的推荐理由,而不是所有的推荐结果都对应一个理由。

      3. 时间多样性
        时间多样性主要是为了保证用户不要每天来推荐系统都看到同样的推荐结果。
        1. 记录用户每次登陆推荐系统看到的推荐结果
        2. 将这些结果发回日志系统。 这种数据不需要实时存储,只要能保证小于比如一天的延时就足够了。
        3. 在用户登录时拿到用户昨天及之前看过的推荐结果列表,从当前推荐结果中将用户已经看到的推荐结果降权。
      4. 用户反馈
        排名模块最重要的部分就是用户反馈模块。用户反馈模块主要通过分析用户之前和推荐结果的交互日志,预测用户会对什么样的推荐结果比较感兴趣。
        比如用电机模型预测用户是否会点击推荐结果,来提高用户对推荐结果的点击率。推荐系统的点击率预测中可用如下特征预测用户u会不会点击物品i:
        1. 用户u相关的特征,如性别、年龄、活跃度、之前有没有点击行为
        2. 物品i的相关特征,如流行度、平均分、内容属性
        3. 物品i在推荐列表中的位置。用户的点击和用户界面的设计有很高的相关性
        4. 用户之前是否点击过和推荐物品i具有同样推荐解释的其他推荐结果
        5. 用户之前是否点结果和推荐物品i来自同样推荐引擎的其他推荐结果

评分预测问题

前面讨论的都是TopN推荐问题。即给定用户,如何给他生成一个长度为N的推荐列表。
 
评分测试问题基本都通过离线实验进行研究。对于测试集中一堆用户和物品(u,i)(u,i),用户u对物品i的评分是ruir_{ui},推荐算法预测的用户u对物品i的评分是r^ui\hat r_{ui},那么一般可以用均方根误差RMSE度量预测的精度
RMSE=(u,i)T(ruir^ui)2Test\displaystyle RMSE = \frac{\sqrt{\sum_{(u,i)\in T}(r_{ui} - \hat r_{ui})^2}}{|Test|}
评分预测的目的就是找到最好的模型最小化测试集的RMSE。

  1. 基于邻域的方法。
    基于用户的邻域算法认为预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分。
    基于物品的邻域算法在预测用户u对物品i的评分时,会参考用户u对和物品i相似的其他物品的评分。
     

  2. 隐语义模型与矩阵分解模型
    即如何通过降维的方法将评分矩阵补全。
    用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]R[u][i]就是用户u对物品i的评分。但是用户不会对所有物品评分,所以这个矩阵里的很多元素都是空的,即缺失值元素。

    评分预测某种意义上就是填空。

    1. 传统SVD分解。
      寻找一种对矩阵扰动最小的补全方法。如果矩阵补全后的特征值和补全之前的特征值相差不大,就算扰动比较小。SVD分解是早期推荐系统研究常用的矩阵分解方法,但是很难在实践中应用。
      1. 该方法需要一个简单的方法补全稀疏评分矩阵。一般来说,推荐系统中的评分矩阵非常稀疏,95%以上的元素都是缺失的。而一旦补全,又变成一个稠密矩阵, 因而评分矩阵需要的存储空间非常大。这种空间要求实践中难以接受。
      2. SVD分解计算复杂度高,计算速度非常慢。1000维以上的矩阵应用SVD分解就已经非常慢了,实际系统中动辄千万用户和百万物品。
    2. Simon Funk的SVD分解
      Simon Funk提出的矩阵分解方法即后来的Latent Factor Model(LFM)
      从矩阵分解的角度,如果我们将评分矩阵R分解为两个低维矩阵相乘

      R^=PTQ\hat R = P^TQ

      其中PRf×mP\in R^{f\times m}QRf×nQ\in R^{f\times n}是两个降维后的矩阵。那么对于用户u对物品i的评分的预测值R^(u,i)=r^ui\hat R(u,i) = \hat r_{ui}可以通过如下公式得到:

      r^ui=fpufqif\hat r_{ui} = \sum_fp_{uf}q_{if}

      其中puf=P(u,f),qif=Q(i,f)p_{uf} = P(u,f), q_{if} = Q(i,f)。那么SImon Funk的思想很简单:可以直接通过训练集中的观察值利用最小化RMSE学习P、Q矩阵。那么如果能找到合适的P、Q来最小化训练集的预测误差,应该也能最小化测试集的预测误差。因此Simon Funk定义损失函数为

      C(p,q)=(u,i)Train(ruir^ui)2=(u,i)Train(ruif=1Fpufqif)2C(p,q) = \sum_{(u,i)\in Train}(r_{ui} - \hat r_{ui})^2= \sum_{(u,i)\in Train}(r_{ui} - \sum_{f=1}^Fp_{uf}q_{if})^2

      直接优化上面的损失函数可能会导致学习的过拟合,因此还需要引入防止过拟合项目λ(pu2+qi2)\lambda(||p_u||^2 + ||q_i||^2),其中λ\lambda是正则化参数,从而有

      C(p,q)=(u,i)Train(ruif=1Fpufqif)2+λ(pu2+qi2)C(p,q) = \sum_{(u,i)\in Train}(r_{ui} - \sum_{f=1}^Fp_{uf}q_{if})^2 + \lambda(||p_u||^2 + ||q_i||^2)

      使用随机梯度下降法来最小化损失函数。上面定义的损失函数有两组参数pufp_{uf}qifq_{if},求偏导有

      {Cpuf=2qik+2λpukCqif=2quk+2λpik\begin{cases}\frac{\partial C}{\partial p_{uf}} = -2q_{ik} + 2\lambda p_{uk} \\ \frac{\partial C}{\partial q_{if}} = -2q_{uk} + 2\lambda p_{ik}\end{cases}

      将参数沿着最速下降方向推进(学习率为α\alpha)

      {puf=puf+α(qikλpuk)qif=qif+α(pukλqik)\begin{cases}p_{uf} = p_{uf} + \alpha (q_{ik} - \lambda p_{uk})\\ q_{if} = q_{if} + \alpha (p_{uk} - \lambda q_{ik})\end{cases}

    3. LFM的改进[BiasSVD]
      LFM预测公司通过隐类将用户和物品联系在了一起,但是实际上一个评分系统有些固有属性和用户无关,而用户也有些属性和物品无关,物品也有些属性与用户无关。因此Netflix Prize提出了一种修正LFM

      r^ui=μ+bu+bi+puTqi\hat r_{ui} = \mu + b_u + b_i + p_u^T\cdot q_i

      1. μ\mu。训练集中所有记录的评分为全局平均数。有些用户喜欢打高分,有些喜欢打低分。全局平均数可以表示网站本身对用户评分的影响。
      2. bub_u。用户偏置项。表示用户的评分习惯中和物品没有关系的那种因素。比如有的用户苛刻,要求高,评分就偏低;反之,就评分高。
      3. bib_i。物品偏置项。表示物品接受的评分中和用户没有关系的因素。比如有些物品本身质量高,因此评分就容易高;反之,就评分低。
  3. 加入时间信息
    利用时间信息的方法也主要分成两种,一种是将时间信息应用到邻域模型;另一种是将时间信息应用到矩阵分解模型中。

  4. 模型融合
    模型融合对提高评分预测的精度至关重要。

    1. 模型级联融合。
    2. 模型的加权融合。