为了解决基于内容的过滤所存在的一些限制,协同过滤使用用户和内容之间的相似之处来提供建议。这样,就可以随机获得推荐;也就是说,协同过滤模型可以根据类似用户 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。
在此示例中,我们对嵌入进行了手动设计。实际上,可以自动学习嵌入,这就是协同过滤模型的强大功能。在接下来的两个部分中,我们将讨论不同的模型来学习这些嵌入,以及如何训练这些嵌入。
当模型学习嵌入时,这种方法的协作特性显而易见。假设影片的嵌入向量是固定的。然后,模型可以学习嵌入向量,以便用户最有效地解释他们的偏好。因此,具有类似偏好的用户的嵌入将彼此接近。同样,如果用户的嵌入是固定的,我们就可以学习影片嵌入,以便更好地解释反馈矩阵。 因此,类似用户喜欢的电影的嵌入将靠近嵌入空间。