推荐系统(二)协同过滤

在《推荐系统(一)概述》一文中,笔者介绍了“基于内容过滤(content-based filtering)”和“协同过滤(Collaborative Filtering)”两种常见的【候选 Item 池】生成方法。其中,基于内容过滤非常简单,当然,其局限性也很明显。相较之下,协同过滤会同时利用 User 和 Item 之间的相似性来推荐。

目录

1.电影推荐示例

1.1 一维嵌入

1.2 二维嵌入

1.3 再次理解嵌入

2.矩阵分解

3.选择目标函数

4.最小化目标函数

4.1 SGD

4.2 WALS

5.协同过滤的优点和缺点

5.1 优点

5.2 缺点

5.2.1 无法处理新上的 Item

5.2.2 很难加入辅助特征

6.参考文献


1.电影推荐示例

考虑一个电影推荐系统,其中训练数据由反馈矩阵组成,其中:

  • 每行代表一个用户。
  • 每列代表一个 Item(一部电影)。

关于电影的反馈分为两类之一:

  • 明确——用户通过提供数字评级来指定他们对特定电影的喜爱程度。
  • 隐式——如果用户观看电影,系统就会推断用户感兴趣。

为了简化,我们假设反馈矩阵是二进制的;也就是说,值为 1 表示对电影感兴趣。

当用户访问主页时,系统应根据以下两项推荐电影:

  • 与用户过去喜欢的电影的相似度
  • 类似用户喜欢的电影

为了便于说明,让我们为下表中描述的电影手工设计一些特征:

电影 评级 描述
黑暗骑士崛起 PG-13 在这部以 DC 漫画宇宙为背景的《黑暗骑士》续集中,蝙蝠侠致力于拯救哥谭市免遭核毁灭 。
哈利·波特与魔法石 PG 一名孤儿发现自己是一名巫师,并就读于霍格沃茨魔法学校,在那里他与邪恶的伏地魔展开了第一次战斗。
怪物史莱克 PG 一个可爱的食人魔和他的驴伙伴出发执行营救被龙囚禁在城堡里的菲奥娜公主的任务。
贝尔维尔的三胞胎 PG-13 当职业自行车手冠军在环法自行车赛期间被绑架时,他的祖母和超重的狗在三位老年爵士歌手的帮助下远赴海外营救他。
纪念 一名失忆症患者迫切希望通过在身上纹上线索来侦破妻子的谋杀案。

1.1 一维嵌入

如图 1 所示,假设我们为每部电影分配一个标量 [−1,1] 以描述这部电影是适合儿童(负分)还是成人(正分)。假设我们还为每个用户分配一个标量 [−1,1] 以描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。对于我们期望用户喜欢的电影,电影嵌入和用户嵌入的乘积应该更高(更接近 1)。

图 1 基于单一特征(成人OR儿童)来为电影评分

在图 2 中,复选标记(✅)用于标识特定用户观看的电影。第三和第四个用户的偏好可以通过该特征得到很好的解释(因为他们观看的电影呈现明显的 “两极分化”)——第三个用户更喜欢儿童电影,第四个用户更喜欢成人电影。然而,这个单一特征并不能很好地解释第一和第二个用户的偏好——因为,他们的偏好似乎很矛盾,既有儿童片又有成人片。

图 2 一维嵌入示意图

1.2 二维嵌入

上述单一特征(儿童-成人)显然不足以刻画所有用户的偏好。为了解决这个问题,让我们添加第二个特征:每部电影是大片或艺术电影的程度。通过第二个特征,我们现在可以使用以下二维嵌入来表示每部电影。

图 3 基于两个特征描述电影

我们再次将用户放置在相同的嵌入空间中,以最好地解释反馈矩阵:对于每个(User,item)对,我们希望当用户观看视频时,User 嵌入和 Item 嵌入的点积接近 1电影,否则为 0。

图 4 二维嵌入示意图

注意:上面的例子中,我们在同一嵌入空间中表示 Item 和 User,这可能看起来有点奇怪。毕竟 User 和 Item 是两个不同的实体。但是,我们可以将嵌入空间视为 Item 和 User 共同的抽象表示——即我们使用了同一个嵌入空间来表示 Item 和 User,这种方式有点很明显:可以方便使用相似性度量来评估相似性或相关性。

在此示例中,我们手工设计了嵌入。在实践中,嵌入可以自动学习,这就是协同过滤模型的强大之处。在接下来的两节中,我们将讨论学习这些嵌入的不同模型以及如何训练它们。

当模型学习嵌入时,这种方法的协作性质就很明显。假设电影的嵌入向量是固定的。然后,该模型可以为用户学习一个嵌入向量,以最好地解释他们的偏好。因此,具有相似偏好的用户的嵌入将接近。类似地,如果用户的嵌入是固定的,那么我们可以学习电影嵌入来最好地解释反馈矩阵。因此,相似用户喜欢的电影的嵌入将在嵌入空间中接近。

1.3 再次理解嵌入

关于嵌入,学术界和业界均已有明确的定义。在这里,笔者谈谈自己的一种理解—— User 和 Item 是复杂多元的,他们分别具有各自的特征,我们很难直接评估这些特征。因此,我们需要将这些纷繁复杂的特征抽象到一个空间中来,以便【统一世界观】,在这一统一的空间中,原本纷繁复杂的特征蜕变成为相对简单的数字化向量。

基于上述理解,所谓嵌入——本质上是一种【抽象】,通过抽象,去粗存精、去伪存真,以便刻画 User 和 Item 的本质。通过抽象,我们将 User 和 Item 投射到另一个【空间】中以数学形式表达,这一【空间】是相对精简的。


2.矩阵分解

矩阵分解是一种简单的嵌入模型。给定反馈矩阵 A \in R^{m \times n},其中,m 是 User(或 Query)的数量,n 是 Item 的数量,模型学习:

  • User 嵌入矩阵 U \in \mathbb R^{m \times d},其中第 i 行是 User i 的嵌入。
  • Item 嵌入矩阵 V \in \mathbb R^{n \times d},其中第 j 行是 Item j 的嵌入。
  • d 表示特征维度。

学习嵌入使得 U V^T 是反馈矩阵 A 的良好近似。在上图中,很明显, U . V^T 中的坐标 (i, j) 的值是点积 \langle U_i, V_j\rangle ,即 User i 的嵌入和 Item j 的嵌入的点积。理想情况下,这一点积与反馈矩阵中的 A_{i, j} 越接近越好——说明预测得准。

注意:矩阵分解通常提供比学习完整矩阵更紧凑的表示。完整的矩阵有 O(nm) 条目,而嵌入矩阵 UVO((n+m)d) 个条目,其中嵌入维度 d 通常远小于 m 和 n。因此,假设观测值靠近低维子空间,矩阵分解会发现数据中的潜在结构。在前面的示例中,n、m 和 d 的值太低,以至于优势可以忽略不计。然而,在现实世界的推荐系统中,矩阵分解可以比学习完整矩阵更加紧凑。


3.选择目标函数

一种直观的目标函数是平方距离。为此,需要最小化所有观察到的【条目对】(U,V) 的平方误差之和,如下所示:

\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2.

在此目标函数中,我们仅对观察到的条目对 (i, j) 求和,即对反馈矩阵中的非零值求和。然而,仅对其中一个值求和并不是一个好主意——所有值的矩阵将具有最小的损失,并产生一个无法提出有效建议且泛化能力较差的模型(因为观察到的条目对可能是稀疏的,例如100部电影,我们仅仅观察到用户看了其中一部)。

 也许可以将未观察到的值视为零,并对矩阵中的所有条目求和。这对应于最小化 A 与其近似值 U V^T 之间的弗罗贝尼乌斯 距离平方:

\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \|A - U V^T\|_F^2.

可以通过矩阵的奇异值分解SVD )来解决这个二次问题 。然而,SVD 也不是一个很好的解决方案,因为在实际应用中,矩阵 A 可能非常稀疏。例如,将 YouTube 上的所有视频与特定用户观看过的所有视频进行比较。解决方案 U V^T(对应于模型的输入矩阵的近似值)可能接近于零,从而导致泛化性能较差。

相反,加权矩阵分解将目标分解为以下两个总和:

  • 观察到的 条目对 的总和——相当于(观测值 - 预测值)的平方和。
  • 未观察到的 条目对 的总和(视为零)——相当于预测值的平方和。
\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 + w_0 \sum_{(i, j) \not \in \text{obs}} (\langle U_i, V_j\rangle)^2.

其中,w_{0} 是一个超参数,它对两项进行加权,以便目标不被其中一项所支配。调整这个超参数非常重要。

注意:在实际应用中,需要谨慎加权。例如,在一些高频场景中,对于高频的 Item(如非火爆的视频)或高频的 User(如重度用户),上述公式中的第一项可能会主导目标函数。在这种场景下,我们呢可以通过对训练示例进行加权以考虑 Item 频率来纠正这种影响。换句话说,可以将目标函数替换为:

\sum_{(i, j) \in \text{obs}} w_{i, j} (A_{i, j} - \langle U_i, V_j \rangle)^2 + w_0 \sum_{i, j \not \in \text{obs}} \langle U_i, V_j \rangle^2

其中,w_{i, j} 是 User i 和 Item j 的频率的函数。


4.最小化目标函数

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

目标在两个矩阵 U 和 V 中都是二次的。(但请注意,该问题不是联合凸的。)WALS 的工作原理是随机初始化嵌入,然后在以下各项之间交替:

  • 指定 U 求解 V
  • 指定 V 求解 U

每个阶段都可以精确求解(通过线性系统的求解)并且可以分布。该技术保证收敛,因为每一步都保证减少损失。

SGD 和 WALS 各有优缺点。查看以下信息以了解它们的比较:

4.1 SGD

   优点:

        1-非常灵活——可以使用其他损失函数。

        2-可以并行化。

   缺点:

        1-较慢 - 收敛速度不那么快。

        2-更难处理未观察到的条目。

4.2 WALS

    优点:

        1-可以并行化。

        2-收敛速度比 SGD 更快。

        3-更容易处理未观察到的条目。

    缺点:

        1-仅依赖于损失平方。


5.协同过滤的优点和缺点

5.1 优点

1-无需领域知识:我们不需要领域知识,因为嵌入是自动学习的。

2-发现兴趣:该模型可以帮助用户发现新的兴趣。孤立地来说,机器学习系统可能不知道用户对给定的 Item 感兴趣,但模型可能仍然会推荐它,因为类似的用户对该 Item 感兴趣。

3-起步容易:在某种程度上,系统只需要反馈矩阵来训练矩阵分解模型。特别是,系统不需要上下文特征。在实践中,这可以用作多个候选生成器之一。

5.2 缺点

5.2.1 无法处理新上的 Item

给定(User, Item)对的模型预测是相应嵌入的点积。因此,如果在训练期间没有看到某个 Item,系统将无法为其创建嵌入,也无法使用该 Item 查询模型。这个问题通常称为 冷启动问题。然而,以下技术可以在一定程度上解决冷启动问题:

  • WALS 中的投影。给定一个新 Item i_{0} 在训练中没有看到,如果系统与用户有一些交互,对于这个 Item,系统可以轻松计算嵌入 v_{i_0},而无需重新训练整个模型。系统只需求解以下方程或加权版本:

    \min_{v_{i_0} \in \mathbb R^d} \|A_{i_0} - U v_{i_0}\|

    前面的方程对应于 WALS 中的一次迭代:用户嵌入保持固定,系统求解 Item 的嵌入 i_{0}。对于新用户也可以进行同样的操作。

  • 启发式生成新 Item 的嵌入。如果系统没有交互,系统可以通过对来自同一类别、同一上传者(如 YouTube 上传视频)等的 Item 的嵌入进行平均来近似其嵌入。

5.2.2 很难加入辅助特征

辅助特征是 User (Query) 或 Item ID 之外的任何特征。对于电影推荐,辅助特征可能包括国家或年龄。加入可用的辅助特征可以提高模型的质量。尽管在 WALS 中加入辅助特征可能并不容易,但 WALS 的泛化使这成为可能。

为了推广 WALS,通过定义块矩阵来增加输入矩阵的特征 \bar A, 其中:

  • Block(0, 0)是原始反馈矩阵 A
  • Block(0, 1)是 User 特征的 multi-hot  编码。
  • Block(1, 0)是 Item 特征的 multi-hot 编码。

Block (1, 1) 通常留空。如果将矩阵分解应用于\bar A,那么除了 User 和 Item 嵌入之外,系统还学习辅助特征的嵌入。

6.参考文献

链接-https://developers.google.cn/machine-learning/recommendation/collaborative/basics

猜你喜欢

转载自blog.csdn.net/Jin_Kwok/article/details/131597874