推荐系统二——深入理解推荐系统召回算法(1)

作为【推荐系统】系列文章的第二篇,将以“召回”作为今天的主角,会从四个方面来介绍召回的不同算法方式,即基于内容的召回、协同过滤、基于FM模型召回和基于深度学习的方法。

一、背景介绍

推荐系统整体架构

召回是推荐系统的第一阶段,主要根据用户和商品部分特征,从海量的物品库里,快速找回一小部分用户潜在感兴趣的物品,然后交给排序环节。这部分需要处理的数据量非常大,速度要求快,所有使用的策略、模型和特征都不能太复杂。下面主要介绍四种常见的召回方法:

  • 基于内容的召回:使用item之间的相似性来推荐与用户喜欢的item相似的item。
    例如:如果用户A看了《绣春刀2》这部杨幂主演的电影后,则会为他推荐杨幂主演的其他电影或电视剧

  • 协同过滤:同时使用query和item之间的相似性来进行推荐。
    例如:如果用户A与用户B类似,并且用户B喜欢视频1,则系统可以向用户A推荐视频1(即使用户A尚未看过任何与视频1类似的视频)。

  • 基于FM模型召回:FM是基于矩阵分解的推荐算法,其核心是二阶特征组合。

  • 基于深度神经网络的方法:利用深度神经网络生成相应的候选集。

二、基于内容的召回

在这里插入图片描述

基于内容的召回( CB召回 ),一般也叫做标签召回。当谈起CB的时候,大家可能会觉的很简单,用tag或者用cate召回就行了,好像没什么可做的。可事实上,CB并不仅仅是用tag和cate做个倒排就搞定了。这类召回的核心思想是基于item自身的属性,这些属性可以表达为tag,Cate,也可以用来表达用户ID,用户类型等,更可以通过⼀些交叉验证的⽅式,针对内容提取向量,将内容表达为连续向量的方式进行召回。接下来我们进一步来理解基于内容的过滤。

在实际的应用中,如电影推荐,首先我们根据用户之前的历史行为信息(如点击,评论,观看等),CB会使用item相关特征来推荐给用户与之前喜欢的item类似的item。为了更形象的表示CB,假设一个应用商店要推荐给用户相应的APP。下图是相应的特征矩阵,其中每一行代表一个应用程序,每一列代表一个特征。包括不同的类别特征,应用程序的发布者信息等。为简化起见,假定此特征矩阵是布尔类型的的:非零值表示应用程序具有该特征。
在这里插入图片描述

还可以在同一特征空间中表示用户。一些与用户相关的特征可以由用户明确提供。例如,用户在其个人资料中选择“娱乐应用”。其他特征可能是隐式的,具体取决于它们先前安装的应用程序。例如,用户安装了由Science R Us发布的另一个应用程序。

模型应推荐与此用户有关的item。为此,必须首先选择一个相似性指标(如,点积)。然后,推荐系统会根据此相似性度量标准为每个候选item打分。请注意,建议是针对该用户的,因为该模型未使用其他用户的任何信息。

2.1 基于内容召回的优点

该模型不需要其他用户的任何数据,因为推荐是针对该用户的。 这使得更容易扩展到大量用户。
该模型可以捕获用户的特定兴趣。

2.2 基于内容召回的缺点

  • 由于item的特征表示在某种程度上是手工设计的,因此该技术需要大量领域知识。因此,模型很依赖手工设计特征的好坏。
  • 该模型只能根据用户的现有兴趣提出建议。换句话说,该模型扩展用户现有兴趣的能力有限。

基于内容的召回看似比较容易,如果当我们的item属性越来越多的时候,比如⼀个视频可能有多个平行的tag以及其它属性,那么,为了把这些信息综合利用起来,我们还会利用多term检索的方式,去提升CB的效果。下面,我们针对这些内容详细的来聊⼀聊CB的常见优化点。

2.3 倒排优化

优化倒排的主要目的是提升cb召回的推荐效果,常见的倒排基本是和线上排序指标⼀致的,比如,如果排序的指标是点击率,倒排理所应当,也是点击率。但这样的排序方式有个小问题,因为倒排排序使用的是后验的值,而排序通常也是单指标排序,这样,就很容易出现我们之前提到的,单指标被hack的问题,比如,用点击率倒排,头部都是标题党等。所以,这个问题是需要额外注意的。另外,也要考虑指标的bias的问题,例如,用完成率倒排导致短的视频都排到了头部。这种问题可以通过归一化的方式缓解。但有⼀个潜在风险,资源的后验表现的分布往往会跟资源本身的类型有关。

2.4 触发key的优化

key的优化要求只有⼀点,保证每次选择的key,是用户点击概率最⼤的key即可,所以通用的方式是把用户的点击历史按照属性加和取top,比如,在某个类别上点击的次数排序,把点击次数最多的那几个类别留作触发的key,这个过程很简单,没太多优化点,我们就不继续讨论了。这⾥想聊的是关于用户不⼀样的行为差异化权重的问题,我们选取key的过程实际是判断用户对某⼀类内容感兴趣的过程,也就是通过行为,来判断用户的感兴趣程度,在只有浏览功能的产品⾥,点击就是表达用户兴趣的唯一行为,但产品通常会设计很多交互功能,来帮助用户进行有效的兴趣表达,所以,在触发key的选取的时候需要考虑到这⼀点,至于怎么做是和业务形态相关的事,这⾥就不展开了。

2.5 多维度内容属性

最后,我们来讲⼀下cb⾥⾯比较高阶的问题,多term的问题。我们先考虑这样⼀种情况,一个视频有很多个tag,tag的特性是平行不唯⼀。我们在线通过点击量汇聚得到了用户的高频点击tag,通常的方式是,每⼀个tag都会有⼀个倒排,然后各自召回。但很容易想到的,当用户同时有“帅哥”,“萌宠”这两个tag的时候,通过萌宠给用户召回⼀个美女+萌宠的视频显然没有召回⼀个帅哥+萌宠的视频更有吸引力,也就是说,我们在召回的时候,如果能同时考虑多个term之间的关系,会更有效⼀些。传统搜索⾥对于多term召回是有⼀套实现方式的,通过设置每个term的权重,可以在返回结果⾥去得到包含多term的结果,这部分属于搜索架构的内容范畴,我在此不展开了,有兴趣的同学可以找身边做搜索的同学了解⼀下。我们讲⼀个更和推荐match的方式,用户身上有多个标签,内容上面也有多个标签,我们在做多term匹配的时候,就是标签的list到标签的list,使得他们点击的概率最大即可。是不是觉得豁然开朗了?是不是转化成点击率建模问题了?更简单地,直接使用word2vec,把用户标签和内容标签作为⼀个sentence训练,再离线把内容的标签加和表征为内容的属性向量,在线做召回即可。当然,也可以⽤更复杂的⽅式来做,提升精度,大同小异,就不展开说了。那作者,内容的其他纬度等信息也是可以⼀样的方式加进去的,这就留给大家来讨论了。

三、协同过滤

为了解决基于内容的召回所存在的弊端,人们提出了协同过滤召回方式(Collaborative filtering,CF),CF同时使用user和item之间的相似性来进行推荐。 这样可以提高模型的推荐拓展性。也就是说,协同过滤模型可以根据相似用户B的兴趣向用户A推荐商品。此外,可以自动学习Embedding,而无需依赖手工设计的特征。

一般来说,协同过滤推荐分为三种类型。第一种是基于用户(user-based)的协同过滤,第二种是基于项目(item-based)的协同过滤,第三种是基于模型(model based)的协同过滤

  • 基于用户(user-based)的协同过滤:主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。
  • 基于项目(item-based)的协同过滤:和基于用户的协同过滤类似,只不过这时我们转向找到物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么我们就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。比如你在网上买了一本机器学习相关的书,网站马上会推荐一堆机器学习,大数据相关的书给你,这里就明显用到了基于项目的协同过滤思想。
  • 基于模型(model based)的协同过滤:是目前最主流的协同过滤类型了,所含算法是非常之多的,如矩阵分解、关联算法、聚类算法、深度学习、图模型等等。

这里我们带来一个有关电影推荐系统的简单例子帮助更好的理解协同过滤。首先,考虑一个电影推荐系统,其中训练数据由一个反馈矩阵组成,其中每行代表一个user,每一列代表一个item。

关于电影的反馈分为以下两类:

  • 显示反馈:用户通过提供评分来指定他们对特定电影的喜欢程度。

  • 隐式反馈:如果用户观看电影,则系统会推断用户感兴趣。
    假设反馈矩阵是布尔类型的,即值为1和0分别表示对电影是否感兴趣,当用户访问首页时,系统会根据以下两种情况推荐电影:

  • 与用户过去喜欢的电影相似(Item-Based CF)

  • 类似用户喜欢的电影(User-Based CF)

为便于举例阐述,让我们手工设计用以描述电影的一些特征:

在这里插入图片描述

3.1 一维Embedding

假设我们为每部电影分配一个标量,用于描述该电影是适合儿童(负值)还是适合成人(正值)观看。 假设我们还为每个用户分配了一个标量,用于描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。 对于我们希望用户喜欢的电影,电影Embedding和用户Embedding的乘积应更高(接近1)。
在这里插入图片描述

在下图中,每个对号标记都标识特定用户观看的电影。 第三和第四用户具有的特征很好地表示了用户的偏好:第三用户偏爱儿童电影,第四用户偏爱成人电影。 但是,单个特征无法很好地表示第一和第二用户的偏好。这时候需要考虑二维甚至更高维度的特征。
在这里插入图片描述

3.2 二维Embedding

一个特征不足以解释所有用户的偏好。 为了克服这个问题,让我们添加第二个特征:每部电影是商业流行片或是小众文艺片上的表现程度。 通过这个特征,我们现在可以使用以下二维Embedding来表示每部电影:
在这里插入图片描述
我们再次将用户放置在相同的嵌入空间中,以最好地解释反馈矩阵:对于(用户,商品)对,我们希望用户Embedding和商品Embedding的点积在用户观看商品时接近1 电影,否则为0。
在这里插入图片描述
在这个例子中,我们对Embedding进行了手工设计。在实践中,可以自动学习Embedding向量表示,这是协同过滤模型的强大功能。在接下来的内容中,我们将讨论学习这些嵌入表示的不同模型以及如何对其进行训练。

当模型自动学习Embedding时,这种方法的协同性质就显而易见了。假设电影的Embedding向量是固定的。然后,模型可以为用户学习Embedding向量,以最好地解释他们的偏好。 因此,具有相似偏好的用户的Embedding将紧密在一起。同样,如果用户的Embedding是固定的,则我们可以学习电影Embedding以最好地解释反馈矩阵。结果,类似用户喜欢的电影的Embedding将在Embedding空间中紧密在一起。

3.3 基于模型(model based)的协同过滤

矩阵分解是一个简单的Embedding模型。 给定反馈矩阵 A ∈ R m × n A\in R^{m\times n} ARm×n,其中 m m m是用户(或query)数量, n n n是item数量,该模型将学习:

  • user Embedding矩阵 U ∈ R m × d U\in R^{m\times d} URm×d,其中第i行是 u s e r i user_i useri的Embedding。
  • item Embedding矩阵 V ∈ R n × d V\in R^{n\times d} VRn×d,其中第j行是 i t e m j item_j itemj的Embedding。

Embedding通过学习,使得 U V T UV^T UVT的乘积是反馈矩阵 A A A的良好近似。 U V T UV^T UVT ( i , j ) (i,j) (i,j)项就是 u s e r i user_i useri i t e m j item_j itemj对应的两个embedding的点积,使其尽量接近 A i , j A_{i,j} Ai,j

注意:与学习完整矩阵相比,矩阵分解通常会得到更简洁的表示。 完整矩阵具有 O ( n m ) O(nm) O(nm)项,而Embedding矩阵具有 O ( ( n + m ) × d ) O((n+m)\times d) O((n+m)×d)项,其中Embedding维数 d d d通常比 m m m n n n小得多。 最终,观测矩阵会被映射到低维子空间中,矩阵分解就可以在数据中找到其对应的潜在信息。 在前面的示例中 n n n m m m d d d的值都非常小,因此优势可以忽略不计。 但是,在现实世界中的推荐系统中,矩阵分解可以比学习整个矩阵要简洁得多。

3.4 选择目标函数

一种直观的目标函数是距离的平方, 即在所有观察到的矩阵项上最小化平方误差之和:
在这里插入图片描述

在此目标函数中,只求观察到的对 ( i , j ) (i,j) (i,j)的误差和,即对反馈矩阵中的非零值求和。 但是,只求1的误差总和并不是一个好方法。最小化矩阵中所有为1元素产生的模型,并不能进行很好的推荐,而且泛化性较差。
在这里插入图片描述

也许可以将未观察到的值视为零,并对矩阵中的所有条目求损失和。这样其实就是最小化 A A A及其近似值 U V T UV^T UVT之间Frobenius距离的平方:
在这里插入图片描述
可以通过矩阵的奇异值分解(SVD)解决此二次问题。 但是,SVD并不是一个很好的解决方案,因为在实际应用中,矩阵 A A A可能非常稀疏。 例如,将抖音上所有视频与特定用户观看过的视频进行比较。 得到的解 U V T UV^T UVT(对应于模型对输入矩阵的近似值)可能接近于零,从而导致泛化性能较差。

相比之下,加权矩阵分解将目标分解为以下两部分的和:

  • 观察到的误差和
  • 未观察到的误差和(视作0)

在这里插入图片描述

w 0 w_0 w0是调节两项加权的超参,以使目标不被其中一项所支配。 调整此超参数非常重要。

在实际应用中,还需要仔细权衡观察到的数据。例如,频繁的item(如,非常受欢迎的视频)或频繁的query(例如,重度用户)可能会主导目标功能。可以通过对频繁出现的item所对应的训练样本进行加权来纠正此影响。 换句话说,您可以将目标函数替换为:

在这里插入图片描述

w i , j w_{i,j} wi,j是query i i i和item j j j对应的频率函数。

3.5 最小化目标函数

最小化目标函数的常用算法包括:

  • **随机梯度下降(SGD)**是使损失函数最小化的通用方法。

  • **加权交替最小二乘(WALS)**专用于此特定目标函数。
    在两个矩阵 U U U V V V中,每个目标都是二次的。(需要请注意的是,联合问题并不是凸的)WALS的工作方式是随机初始化Embedding,然后在以下条件之间交替进行:

  • 固定 U U U求解 V V V

  • 固定 U U U求解 V V V
    每步都可以准确地求解(通过线性问题的解决方法)并可以进行分布式计算。 该技术可以保证收敛,因为可以确保每一步都可以减少损失。

3.6 SGD和WALS

下面对SGD和WALS优缺点进行比较:

SGD优点:非常灵活:适用于其他损失函数;可以并行化。

SGD缺点:较慢,收敛速度不那么快;难以处理未观察到的项(entries),需要使用负采样或gravity。

WALS优点:可以并行化;收敛速度比SGD更快;更容易处理未观察到的项(entries)。

WALS缺点:仅适用于平方损失;

3.7 协同过滤的优缺点

优点

  • 无需领域知识:不需要相关领域知识,因为Embedding是自动学习的。
  • 发掘用户兴趣:该模型可以帮助用户发现新的兴趣点。 系统可能并不知道用户对给定的item的兴趣度,但是模型仍会推荐给他,因为相似的用户有着相同的兴趣点。
  • 很好的初始模型:在某种程度上,该方法仅需要反馈矩阵即可训练矩阵分解模型。 而且该方法不需要上下文特征。 实际上,该方法可以用作多个召回队列中的一个。

缺点

  • 冷启动问题

模型预测结果是给定的(用户,商品)相应Embedding的点积。因此,如果在训练数据中item从未出现过,则系统也无法计算其Embedding,也无法得到相应的预测结果。此问题通常称为冷启动问题。但是,以下技术可以在某种程度上解决冷启动问题:

(1)利用WALS进行预测。给定一个在训练集中未出现的item,如果系统与用户有一些交互,则系统可以很容易计算出该item的Embedding,而无需重新训练整个模型。只需求解以下方程式或其加权形式:

上述方程对应于WALS中的一个迭代:用户Embedding保持固定,系统求解item的Embedding。对于新用户也可以这样做。

(2)启发式生成新item的Embedding。如果系统没有相应的交互信息,则系统可以通过对来自同一类别,来自同一上传者(在视频推荐中)的item的Embedding进行平均来近似其Embedding。

  • 难以融入query/item的附加特征
    附加特征是query或itemID以外的其他特征。 对于电影推荐,附加特征可能包括国家或年龄。 融入可用的附加特征可以提高模型的效果。 尽管在WALS中融入付诸特征可能并不容易,但是WALS的泛化模型使这成为可能。

更多内容参见:

深入理解推荐系统召回算法(2)

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值