协同过滤

为了解决基于内容的过滤所存在的一些限制,协同过滤使用用户和内容之间的相似之处来提供建议。这样,就可以随机获得推荐;也就是说,协同过滤模型可以根据类似用户 B 的兴趣向用户 A 推荐商品。此外,嵌入可以自动学习,而无需依赖于特征的工程。

电影推荐示例

假设有这样一个电影推荐系统,其中训练数据由一个反馈矩阵组成,其中:

  • 每一行代表一个用户。
  • 每一列表示一项内容(一部电影)。

有关影片的反馈可分为以下两类:

  • 露骨 - 用户通过提供评分来表明自己对某部电影的喜爱程度。
  • 隐式 - 如果用户观看电影,系统会推断出该用户感兴趣。

为简单起见,我们将假定反馈矩阵是二进制文件;也就是说,值 1 表示对电影感兴趣。

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

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

为了进行说明,让我们为下表所述的电影动手设计一些功能:

电影 评分 说明
黑暗骑士崛起 PG-13 这部影片是《黑暗骑士》的续集,以 DC 漫画的宇宙背景为背景,帮助蝙蝠侠尽力拯救哥谭市,使其免遭核毁灭。
《哈利·波特与魔法石》 PG 一个无儿子的男孩发现自己是一名巫师,并且加入了霍格沃茨魔法与魔法学校。在那里,他首次与邪恶的伏地魔王展开战斗。
《怪物史莱克》 PG 一只可爱的食人魔和他的驴子,启程营救被一条龙困在城堡里的菲奥娜公主。
《美好的三元组》 PG-13 当专业骑行者冠军在环法自行车大赛期间被绑架后,他的奶奶和超高强度的狗狗在国外救援,在三位年长爵士歌手的帮助下营救他。
记忆 R 一位短期记忆丧失症患者将线索纹在身上,竭尽全力寻找杀害妻子的凶手。

1D 嵌入

假设我们在 \([-1, 1]\) 中为每个影片分配一个标量,用于说明影片是面向儿童的(负值)还是成人的(正值)。假设我们还为 \([-1, 1]\) 中的每位用户分配一个标量,描述用户对儿童电影(更接近 -1)或成人电影(更接近 +1)的兴趣。对于我们预计用户会喜欢的电影,影片嵌入和用户嵌入的乘积应该更高(更接近 1)。

此图显示了沿一维嵌入空间排列的多部电影和多位用户。每个轴沿此轴的位置描述了相应影片是儿童影片(左侧)还是成人影片(右侧)。用户所在的位置描述了对儿童或成人电影的兴趣。

在下图中,每个对勾标记都表示一个特定用户观看过的电影。第 3 个和第 4 个用户偏好此功能对此进行了详细说明,第 3 位用户更喜欢观看面向儿童的电影,第 4 位用户更喜欢成人电影。但是,这一功能未能很好地解释第一个用户和第二个用户的偏好设置。

反馈矩阵的图片,其中行对应用户,列对应电影。每个用户和每部影片都映射到一维嵌入(如上图所述),使得两个嵌入的乘积可近似于反馈矩阵中的标准答案值。

2D 嵌入

有一项功能不足以解释所有用户的偏好。为了克服这个问题,我们再增加一项功能:每部电影在多大程度上是一部卖座大片或一部艺术片。通过第二个功能,我们现在可以使用以下二维嵌入来表示每部电影:

一张图片,显示了在二维嵌入空间中排列的多部电影和多位用户。每个影片在横轴上的位置分别说明它是儿童电影(左侧)还是成人影片(右侧);它在纵轴上的位置描述了影片是大片(顶部)还是艺术片(底部)。用户的排名反映了他们在每个类别中的兴趣。

我们再次将用户放在相同的嵌入空间中,以便更好地解释反馈矩阵:对于每个(用户,推荐项)对,我们希望用户嵌入和项嵌入的点积在用户观看影片时接近 1,否则为 0。

同一反馈矩阵的图片。这次,每位用户和每部影片都映射到一个二维嵌入(如上图所述),以使两个嵌入的点积接近反馈矩阵中的标准答案值。

在此示例中,我们对嵌入进行了手动设计。实际上,可以自动学习嵌入,这就是协同过滤模型的强大功能。在接下来的两个部分中,我们将讨论不同的模型来学习这些嵌入,以及如何训练这些嵌入。

当模型学习嵌入时,这种方法的协作特性显而易见。假设影片的嵌入向量是固定的。然后,模型可以学习嵌入向量,以便用户最有效地解释他们的偏好。因此,具有类似偏好的用户的嵌入将彼此接近。同样,如果用户的嵌入是固定的,我们就可以学习影片嵌入,以便更好地解释反馈矩阵。 因此,类似用户喜欢的电影的嵌入将靠近嵌入空间。

检查您的理解情况

此模式向用户推荐了一个购物应用,因为其最近安装了一款类似的应用。以下哪种过滤示例是这个例子?
基于内容的过滤
太棒了!基于内容的过滤不会考虑其他用户。
协同过滤 (collaborative filtering)
协同过滤会考虑其他用户。在特定场景中,我们只关注一位用户。