《推荐系统实践》第二章学习笔记

  这一章的标题是“利用用户行为数据”,整章讲的是如何利用用户的行为数据分析出用户的兴趣和需求。用户的行为不是随机的,而是蕴含着很多模式。
  用户行为数据在网站上最简单的存在形式就是日志,比如网页浏览、购买、点击、评分和评论等。用户行为一般分为显式反馈行为和隐式反馈行为。显式反馈可以明确用户的兴趣,正负反馈数据都有,但是数据较少。而隐式反馈无法明确用户的兴趣,一般只有正反馈,但是优势在于数据量大。一般来说,用户的行为表示可以分为6个部分:

  1. user id,产生行为的用户的唯一标识(必须)
  2. item id,产生行为的对象的唯一标识(必须)
  3. behavior type,行为的种类
  4. context,产生行为的上下文,包括时间和地点等
  5. behavior weight,行为的权重
  6. behavior content,行为的内容

  在利用用户行为数据设计推荐系统前,先要对用户行为数据进行分析。需要明确一点,用户活跃度和物品活跃度是满足长尾分布的。在后面设计推荐算法时要注意对长尾分布带来影响的修正,防止少部分用户或物品对推荐结果的影响过大,而导致不好的推荐效果。长尾分布的数据很容易导致模型的马太效应越来越强,即20%的用户或物品的影响力越来越大,而剩下80%的用户和物品的需求逐渐被忽略了。
  基于用户行为数据的推荐算法有很多,书中主要讲了3类方法:

基于邻域的方法

  基于邻域的方法又分为基于用户的协同过滤算法(UserCF)和基于物品的协同过滤算法(ItemCF)。

  1. 基于用户的协同过滤算法
    UserCF是推荐系统中最古老的算法,算法核心是给用户推荐和他兴趣相似的其他用户喜欢的物品。
    可见UserCF算法主要有2个步骤:1)找到和目标用户兴趣相似的用户集合;2)找到这个集合中的用户喜欢且目标用户没有听说过的物品推荐给目标用户。
    算法的关键在于用户相似度的衡量和计算。UserCF主要是利用用户行为的相似度来衡量用户的兴趣相似度,也就是统计两个用户的共同行为次数。但是很多用户之间是没有物品交集的,为了加快用户相似度矩阵的计算,可以建立物品到用户的倒排表,然后遍历倒排表得到用户之间的相似度矩阵。倒排表可以用一个字典实现,其中key是物品id,每个key对应的value就是与该物品有交集的用户id。
    但是需要注意一点,上面这种用户兴趣相似度的统计方式很容易受到热门物品的影响,一个热门物品可能会有很多用户购买,从而将大量用户联系起来,这种联系方式是不对的(比如两个兴趣非常不同的人却都喜欢看哈利波特)。为了防止热门物品的干扰,就需要对热门物品施加一个惩罚权重。也就是说,本来每个共同物品对相似度的贡献是1,但是修正后热门物品对相似度的贡献可能就变成0.01。
  2. 基于物品的协同过滤算法
    ItemCF是目前应用最多的算法,算法核心是给用户推荐和他之前喜欢的物品相似的物品。
    ItemCF算法也分为两步:1)计算物品之间的相似度;2)根据物品的相似度和用户的历史行为给用户生成推荐列表。
    同样,在计算物品相似度时,ItemCF先建立了用户到物品的倒排表,然后遍历倒排表得到物品之间的相似度矩阵。此时字典中key是用户id,每个key对应的value是与该用户有交集的物品id。
    ItemCF也会受到热门物品的影响,因此需要利用物品出现次数对相似度进行惩罚。同时ItemCF中物品相似度也会受到活跃用户的影响,一个非常活跃的用户可能会导致大量物品之间产生联系,但有时候这种联系是没有意义的,一个解决方案就是忽略非常活跃的用户的兴趣列表。
    物品相似度矩阵如果进行归一化的话,可以提高推荐的准确度。

UserCF和ItemCF之间的对比如下:
UserCF和ItemCF优缺点对比.png
隐语义模型

  隐语义模型(latent factor model, LFM)的核心思想是通过隐含特征联系用户兴趣和物品。LFM通过下面公式计算用户对物品的兴趣:其中,度量了用户的兴趣和第个隐类的关系,度量了第个隐类和物品之间的关系。
  LFM的性能和训练中正负样本比率有关,但是一般来说大部分用户行为数据只包含正样本。那么如何给每个用户生成负样本呢?一个比较好的方法就是从用户没有过行为的物品中采样一些物品作为负样本,采样时保证每个用户的正负样本数据相当。同时,当数据集非常稀疏时LFM的性能会明显下降,这是因为数据集很稀疏时,也就意味着正样本很少,此时模型的训练效果就很差,可能还会有过拟合的风险。
  LFM和基于邻域的方法的对比:1)LFM是一种基于机器学习的方法,需要训练,而基于邻域的方法是一种基于统计的方法,并没有学习过程;2)基于邻域的方法需要保存一张很大的表,表的维度和用户数/物品数相关,而LFM相当于对这个大的矩阵进行了分解,将一个大的矩阵分解成两个小的矩阵,因此内存消耗更少;3)基于邻域的方法可以实现实时推荐,只需要统计新的行为数据并更新相应的表即可,但是LFM不行,LFM有一个训练过程,因此不能进行实时推荐;4)基于邻域的方法中的ItemCF算法支持很好的推荐解释,而LFM不能对推荐结果给出很好的解释。

基于图的模型

  用户行为很容易用二分图来表示。基于图的模型其实学习的也是一个矩阵,行代表了用户节点,列代表了物品节点,对应的矩阵值代表了两个节点之间连接权重,这个矩阵也就表示了图中节点之间的相关性。如何计算图的节点相关性呢?一个解决方法就是基于随机游走的PersonalRank算法。用户在图上进行随机游走,每到一个节点都考虑是返回初始节点还是前往下一个随机节点,经过多次迭代后,就可以得到图中节点之间的相关性。该算法的一个性能改进在于将模型的迭代训练改为矩阵运算,此时假设节点之间的转移矩阵为,初始节点之间的相关性矩阵是,那么有这里简单解释下,由于最终节点相关矩阵总会收敛,所以上面公式中左右的节点相关性矩阵都用来表示。最终图中节点之间的关系矩阵为

个人总结:上面都是以前比较经典的对用户行为数据进行处理的算法,不过现在我更加倾向于对id进行embedding。其实我感觉embedding和基于邻域的方法有点接近,基于邻域的方法中需要计算用户或者物品之间的相似度,其实在计算这个相似度的过程中就利用物品/用户对用户/物品进行编码,而现在的embedding技术其实也是对id的一种再编码。而如何在embedding的基础上接着利用用户行为数据呢?阿里的DIN模型提出了一个很好的解决方法,简单来说就是将目标物品id的embedding向量和用户历史行为中物品id的embedding向量之间建立attention机制,从而更好地反映出历史行为对用户的影响。

你可能感兴趣的:(《推荐系统实践》第二章学习笔记)