机器学习29:《推荐系统-II》协同过滤

news2024/11/16 1:35:23

在《机器学习28:《推荐系统-I》概述》一文中,笔者介绍了“基于内容过滤(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.最小化目标函数

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

  • 随机梯度下降(SGD)

  • 加权交替最小二乘法WALS ) 

目标在两个矩阵 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android studio使用Flutter Inspector调试布局

1、点击anroid studio右侧的Flutter Inspector按钮 2、点击展开布局右上角的‘Select Widget Mode’,即可实现点击相关节点,真机上可以看到相关的方框 如下图

月薪65k的大厂项目经理,是种什么体验

早上好,我是老原。 之前给大家更新了几期关于项目管理行业的面试题,又值一年毕业季,想入行的新手小白,或者想跳槽的行业大佬可以码起来了。 有很多粉丝朋友都在后台给我留言,想看云计算行业的岗位分析,今…

前端开发:JS中常用事件汇总

前言 在前端开发中,关于事件相关的操作是非常常见的操作,尤其是实际业务场景中涉及复杂交互的需求。在JS中比较常用的事件有很多,而且涉及不同方式不同类型的点击事件,一般情况下事件会和函数结合使用,这就是事件和函数…

Python 背包问题

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

MySQL阶段DAY20(附笔记)

【注意】:工厂模式学习知识结构如下: (一)、单例模式 1.Single类: 使用懒汉式:对象的延迟加载,安全的,高效的应用 双重判断提升效率和安全性 package singleton;/** 单例设计模式之…

Prisma 国内镜像设置

背景 相信大家在体验完 prisma 后,一般都是会感觉开发起来很方便,功能使用起来很顺畅很爽,但是想推广起来团队内使用的时候发现。。。 原因是prisma client 需要下载几个引擎,在其他没有翻墙工具的小伙伴使用的时候发现一直下不下…

供应商管理解决方案实战指南:打造高效供应链

在现代商业环境中,供应商管理是企业成功运营的关键因素之一。随着全球化和供应链的复杂性不断增加,供应商管理面临着许多挑战,如供应商选择、供应商绩效评估和供应链风险管理等。为了解决这些挑战,企业需要采取一系列的解决方案&a…

Sui x KuCoin Labs夏季黑客松第四批入围项目公布

自Sui x KuCoin Labs夏季黑客松开放注册以来,收获了众多开发者的关注和报名参与。现在比赛的报名阶段已结束,截至目前为止,我们已经公布了三批入围项目名单,现在第四批入围名单项目新鲜出炉,最后一轮入围结果将于7月12…

十、HTML中的浮动

1、浮动 1、浮动 块级元素 独占一行 若块级元素宽度较少时,导致后续是空白 布局 先整体,后局部 先简单,再复杂 复杂再划分 整体布局 局部 2、float属性 浮动飘 float属性 让网页元素按照标准文档流方式显示 自上到下,…

19.内部温度传感器

1.STM32内部温度传感器介绍: 内部温度传感器支持的温度范围为:-40~125度,精度为1.5℃左右;T(℃){(V25-Vsense)/Avg_Slope}25;STM32的内部温度传感器是直接连接在ADC内部输入通道,在ADC1通道16连接的内部温度传感器&am…

Django基础入门⑬:Cookie和Session详讲和Django HTML表单实战讲解

Django基础入门⑫:Django 对象查询详解,分组聚合 Cookie和SessionCookie简述Session使用Session的定义理解Session的作用 Session配置Session的基本操作Session在settings.py中的配置Cookie和Session的区别 Django HTML表单实战HTML表单实现用户的登录实…

基于混沌集成决策树的电能质量复合扰动识别(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《基于混沌集成决策树的电能质量复合扰动识别》,主要做的是S变换电能质量扰动识别,通过S变换对电能质量扰动(谐波,闪变,暂升等单一扰动和…

15 | 边界:微服务的各种边界在架构演进中的作用?

目录 演进式架构 微服务还是小单体? 微服务边界的作用 逻辑边界 物理边界 代码边界 正确理解微服务的边界 总结 那重点落到边界的时候,总结一下就是,微服务的设计要涉及到逻辑边界、物理边界和代码边界等等。 那么这些边界在微服务架…

vue清除地址栏参数(可以单个,可以多个)

需求 vue跳转新页面后,清除url里面的参数,就是上一个页面带过来的参数,只用一次 mounted () {this.$nextTick(() > {let url this.getnewurl()window.history.replaceState(null, null, url);})},methods: { //根据参数名去清除&#xf…

深度学习训练营之调用Gensim来训练Word2Vec模型

深度学习训练营之调用Gensim来训练Word2Vec模型 原文链接环境介绍前置工作下载Gensim库对于原始语料进行分词添加停用词 模型训练模型介绍模型正式训练 计算词频 原文链接 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章&#…

C#:了解LINQ,简化数据查询和操作的强大工具

文章目录 linq关键字fromwhereselectorderbyjoingroupletinto linq方法筛选方法WhereOfType 排序方法:OrderByOrderByDescendingThenByThenByDescending 投影方法:SelectSelectMany 分组方法:GroupBy 连接方法:JoinGroupJoin 聚合…

高效方案:30万条数据插入 MySQL 仅需13秒

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

SpringBoot 集成 MybatisPlus 一——介绍

MybatisPlus 是 Mybatis 的升级版本,是对 Mybatis 的简化,因为他们的口号就是“为简化开发而生”。 1、创建数据表 CREATE TABLE ​​User​​ ( ​​id​​ INT NOT NULL, ​​username​​ VARCHAR(50) NULL DEFAULT NULL, ​​gendar​​ CHAR(2) NU…

了解微服务架构

微服务架构 软件架构历史 Software As A Service,这不仅仅是⼀个理念,它更多释放的是企业在新⼀轮的市场竞争中,如何使⽤轻量级的组织架构和新的软件架构来更好的服务企业⾯向未来的战略调整和市场定位,从⽽赢得未来的市场空间。…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

文章目录 一、分割|语义相关(15篇)1.1 Prompting Diffusion Representations for Cross-Domain Semantic Segmentation1.2 ZJU ReLER Submission for EPIC-KITCHEN Challenge 2023: Semi-Supervised Video Object Segmentation1.3 Multi-Modal Prototypes for Open-Set Semanti…