专栏名称: AI开发者
AI研习社,雷锋网旗下关注AI开发技巧及技术教程订阅号。
目录
相关文章推荐
爱可可-爱生活  ·  [CL]《Leveraging ... ·  2 天前  
爱可可-爱生活  ·  -20250310221422 ·  2 天前  
51好读  ›  专栏  ›  AI开发者

如何搭建增量推荐系统?

AI开发者  · 公众号  · AI  · 2020-02-22 17:12

正文

点击上方“蓝字”关注“AI开发者”



学习本教程的先决条件

尽管我会尽量减少数学术语的使用,但本文希望读者熟悉一些概念,如矩阵分解、嵌入空间以及基本的机器学习术语。这篇文章并不是推荐系统的介绍,而是对它们的增量变体的介绍。在任何情况下,本文的主要受众是机器学习和推荐系统领域的初学者。


简介

开始一个机器学习项目,数据科学家收集数据,对其进行处理,训练模型并将其部署到生产中。当模型的性能开始恶化时,数据科学家通常会从头开始重复这个循环。在这个时候,他们才有新的数据示例来对模型进行改进以提高其性能。然而,这通常是一种适得其反的做法,其效率也很低下,特别在那些根据当前数据做出的决策至关重要的业务领域来说尤其如此。

现在,进入推荐系统的世界吧,在这里,用户的偏好经常会随着季节、预算、时尚趋势等发生变化。此外,客户数量和库存造成了所谓的冷启动问题,即系统没有足够的信息使消费者与产品或服务相匹配。推荐系统在理想情况下应该适应这些变化,改进其模型以适应当前的状态,同时要对数据进行一次传递。这就是渐进式学习的理念。

在本文中,我们将探索在实践中将增量学习的思想应用到推荐系统中。我们使用一个基于 Pytorch 的 Python 库 CF Step,重现了 João Vinagre 等人发表的论文「Fast incremental matrix factorization for recommendation with positive-only feedback」中的结果。接下来,我们将通过应用几个技巧来实现更高的目标。


快速增量矩阵分解

我们将要实现的算法使用隐式的、仅为正的反馈。让我们试着解开这两个关键字的神秘面纱。

隐式反馈意味着用户从来没有对他们交互的项目表达过直接的意见,比如评级。隐式反馈的一个例子是,一个顾客买了多少次某个产品,或者花了多少分钟看了某个电影。顾客购买的产品或使用的服务越多,我们就越有信心认为,这是一种偏好。仅为正的反馈是一个与隐式反馈一起使用的术语。这是因为,在隐式反馈的情况下,我们很难知道是什么构成了消极互动。用户不与项目交互并不意味着什么,想象一下超市里的消费者,如果他们尚未购买特定产品,我们无法确定原因。

返回到我们的实现,仅为正的反馈意味着用户项交互矩阵 R 只包含布尔值,其中正值表示喜欢,负值被视为不确定。这个假设有两个主要的含义:R 的稀疏性是会保持的,因为在训练过程中只使用了正反馈;对于任何用户项交互,负值都是完美的推荐候选者。


算法与方法

现在让我们更仔细地看一下本文中提出的增量随机梯度下降(ISGD)算法。

ISGD——增量 SGD

我们拥有的数据是元组或用户项交互数据。记住,这些都是积极的交互。算法的输入是三个数字:feat (用户或项目嵌入空间的维数)、λ(正则化系数)和 η(学习速率)。算法的输出是两个嵌入矩阵:A 表示用户,B 表示项目。这些矩阵的维数是 A 的 number_of_users x feat 和 B 的 number_of_items x feat。然后我们有几个不同的步骤:

  • 检查活跃用户是否是已知的。如果不是,则创建一个具有随机潜在特征的新用户,该用户从均值为 0、标准差为 1 的正态分布中提取。对活动项执行相同的操作。

  • 计算损失。因为我们只需要处理积极的反馈,所以目标总为 1。因此,我们只需要从 1 中减去我们的预测值。

  • 使用通用规则更新活跃用户的潜在特征(用户嵌入矩阵中的参数)。对活动项执行相同的操作。

  • 转到下一个数据点。这样,我们可以处理任意长度的数据流。


实现与评估

对于这个实现,我们将使用 Python 库 CF Step 和众所周知的 Movielens 数据集( https://grouplens.org/datasets/movielens/ )。CF Step 是一个开源库,用 Python 编写并在 Pytorch 上构建,它支持增量学习推荐系统的快速实现。该库是欧洲研究项目 CloudDBAppliance 的副产品。你可以通过运行以下命令轻松安装库:

pip install cf-step

接下来,下载 movielens 数据集,并将 ratings.dat 文件提取在一个方便的目录下,例如 Linux 中的 tmp 文件夹。对于这个实现,我们只需要这个文件。其余文件(users.dat 和 movies.dat)包含用户和电影的元数据。我们将使用 pandas 加载内存中的文件:

如你所见,我们将用户和电影 ID 转换为类别,以便提取类别代码。现在,我们不必为嵌入矩阵的生成创建单独的词汇表。我们只需要使用用户和电影编码,而不是 ID。最后,我们总是通过这个数据帧在代码和 ID 之间建立连接,以找到原始用户和电影。现在,让我们看看我们正在处理的数据中的不重复的用户和电影的数量。







请到「今天看啥」查看全文