技术帖:从头开始在PyTorch中使用深度学习的推荐系统
矩阵分解算法一直是RS的主力。在本文中,我假设您对基于协同过滤的方法非常熟悉,并且具有在PyTorch中训练神经网络的基本知识。
在这篇文章中,我的目标是向您展示如何从头开始在PyTorch中实现RS。本文提出的理论和模型也会在本文中提供。
GitHub传送门:https://github.com/HarshdeepGupta/recommender_pytorch。
问题定义
鉴于过去用户看过的电影记录,我们将构建一个推荐系统,帮助用户发现他们感兴趣的电影。
具体来说,给定<userID,itemID>出现对,我们需要为每个用户生成一个排序的电影列表。
我们将问题建模为二元分类问题,在这个问题中,我们学习一个函数来预测某个特定的用户是否会喜欢某个特定的电影。
我们的模型将学习这种映射
数据集
我们使用MovieLens 100K数据集,该数据集在1700部电影中拥有100,000个用户的100,000个评级。数据集可以从这里下载。(https://grouplens.org/datasets/movielens/100k/)
评级以<userID,itemID,rating,timestamp>元组的形式提供给我们,每个用户至少有20个评级。
训练
我们删除了rating(1,2,3,4,5)的确切值,将其转换为隐式场景,即任何正交互都被赋予值1。默认情况下,所有其他交互的值都为零。
由于我们正在训练分类器,我们需要正样本和负样本。数据集中存在的记录计为阳性样本。我们假设用户项交互矩阵中的所有条目都是负样本(一个强有力的假设,并且易于实现)。
对于用户交互的每个项目,我们随机抽样4个未被用户交互的项目。这样,如果用户有20个正面交互,他将有80个负面交互。这些负面交互不能包含用户的任何积极交互,尽管由于随机抽样它们可能并非全部唯一。
评估
我们随机抽样100个未与用户交互的项目,在100个项目中对测试项目进行排名。本文使用了相同的策略,这是本文的灵感来源(参见下文)。我们将排名列表截断为10。
由于为每个用户排序所有项目太耗时,因此我们必须计算1000 *1700~10⁶的值。通过这种策略,我们需要1000 *100~10⁵的值,少一个数量级。
对于每个用户,我们使用测试集中的最新评级(根据时间戳),使用其余的进行训练。该评估方法也称为leaout -one-out策略,与参考文献中使用的方法相同。
指标
我们使用命中率(HR)和归一化折扣累积增益(NDCG)来评估RS的性能。
对于给定用户,我们的模型为测试集中的每个项目提供0到1之间的置信度得分。项目按其分数的降序排序,前10项作为推荐。如果此列表中存在测试项目(每个用户只有一个),则HR为该用户的一个,否则为零。在对所有用户进行平均后,报告最终的HR。对NDCG进行了类似的计算。
在训练时,我们将最小化交叉熵损失,这是分类问题的标准损失函数。RS的真正优势在于给出用户最有可能互动的前k项的排序列表。想想为什么你大多只在第一页点击谷歌搜索结果,而不是去其他页面。像NDCG和HR这样的度量标准通过指示排名列表的质量来帮助捕获这种现象。以下是评估推荐系统的一个很好的介绍。
基线:项目人气模型
基线模型是我们用来为问题提供一个简单、不复杂的解决方案的模型。在推荐系统的大多数使用案例中,向所有用户推荐相同的最受欢迎项目列表会给基线带来难以超越的打击。
在GitHub存储库中,您还可以找到从头开始实现项目流行度模型的代码。以下是基线模型的结果。
基于深度学习的模型
凭借所有奇特的架构和神经网络的术语,我们的目标是打败这个项目的人气模型。
我们的下一个模型是深层多层感知器(MLP)。模型的输入是userID和itemID,它们被送入一个嵌入层。因此,每个用户和项目都有一个嵌入。之后有多个致密层,接着是具有S形激活的单个神经元。确切的模型定义可以在文件MLP.py中找到。
神经协同过滤的体系结构
我们的损失函数是二元交叉熵损失。我们使用Adam进行梯度下降,使用L-2范数进行正则化。
结果
对于基于人气的模型,训练时间不到5秒,这些是得分:
HR = 0.4221 | NDCG = 0.2269
对于深度学习模型,我们在近30个训练epochs(CPU上约3分钟)后获得这些结果:
HR = 0.6013 | NDCG = 0.3294
结果令人兴奋。我们关注的指标大幅增加。根据HR,我们观察到误差减少了30%,这是巨大的。这些数字是从非常粗略的超参数调整中获得的。通过超参数优化可能仍然可以提取更多juice。
结论
用于矩阵分解的现有技术有很多,可以很容易地使用神经网络复制。对于非神经视角,请阅读关于推荐系统的矩阵分解的这篇优秀文章。
在这篇文章中,我们看到了神经网络如何提供构建推荐系统的简单方法。诀窍是将推荐问题视为分类问题。我们在PyTorch中实现了推荐系统。我们将结果与非个性化基线算法进行了比较,并观察到了显著的收益。
为了更深入地理解,我鼓励您阅读原始论文(下面链接)并转到GitHub存储库以获取此帖子。(https://github.com/HarshdeepGupta/recommender_pytorch)
作者:Harshdeep Gupta
文章来源:https://towardsdatascience.com/recommender-systems-using-deep-learning-in-pytorch-from-scratch-f661b8f391d7