作者|Quentin Bacuet
编译|VK
来源|Medium
随着信息过载的增加,我们不可能通过观看海量的内容来获取我们想要的项目。推荐系统可以来拯救我们。推荐系统是一种模型,通过向用户展示他们可能感兴趣的内容,帮助他们探索音乐和新闻等新内容。
在Snipfeed,我们每天处理成千上万的内容,用户群的要求很高:Gen Z.通过利用最先进的深度学习推荐系统,我们帮助用户浏览他们最喜欢的视频、新闻、和博客。
麦肯锡估计,
“已经有35%的消费者在亚马逊上购买的东西和75%在Netflix上观看的东西来自基于这种算法的产品推荐。”
随着推荐系统的日益普及,出现了这样的问题:哪些新的模型和算法可以将推荐提升到一个新的水平?与矩阵分解等更经典的方法相比,它们的性能如何?
为了回答这些问题,我决定比较九种方法,并专注于两个指标:NDCG和个性化指数,使用MovieLens数据集进行实验。我使用TensorFlow和Keras来实现这些模型,并使用Google Colab的GPU对它们进行训练。
数据集:MovieLens 20M
初始数据集
为了进行分析,我们将使用著名的数据集MovieLens 20M。
这个数据集包含了来自电影推荐服务MovieLens的2000多万个评分。下面是dataframe的示例:
该数据集列出了138000个用户和27000多部电影。经过清洗和过滤(我们只接受正面评价),我们有:
-
13.6万用户
-
2万部电影
-
1000万次互动
-
99.64%稀疏度
我们还可以从下面的直方图中看到,大多数电影的收视率都在5000以下…
而且大多数用户评价不超过500部电影。
这与大多数推荐系统问题是一致的:很少有用户对很多电影进行评分,很少有电影有很多评分。
训练数据集
我们可以根据这些数据建立一个点击矩阵。点击矩阵的格式如下所示。如果用户u与项i交互,则行u和列i上的单元格包含1,否则包含0。
我们还将点击向量xᵤ定义为点击矩阵的第u行向量。
训练验证测试数据集
为了评估模型的质量,我们将数据集分成3个子集,一个子集用于训练,一个子集用于验证,一个子集用于测试。我们将使用第一个子集训练模型,第二个子集在训练期间选择最佳模型,最后一个子集获得度量。
指标:NDCG和Personalization
NDCG
如前所述,我们将使用两个指标来评估我们的模型。第一个将是NDCG,它衡量质量和我们的推荐项目的顺序。我们首先需要定义DCG。DCG越高越好。DCG@p定义为:
I是指示函数,elem_i代表推荐列表的第i个元素。为了说明这个抽象公式,这里有一个简短的例子:
需要建议:{A,B,C}
建议1:[C、A、D]-DCG@3=1.63
建议2:[D、B、A]-DCG@3=1.13
注意,这些建议是有顺序的。因此,我们有:DCG₁ > DCG₂,因为预测1中的前两个项目是我们的目标项目,而这些项目位于预测2的列表末尾。
NDCG是DCG的近亲,将分数投影在0到1之间,以便它们在模型之间转换。
Personalization(个性化指数)
Personalization=计算每对推荐之间的距离,然后计算平均值。为了比较不同的个性化指数,我们将其标准化(就像我们对NDCG所做的那样,我们将分数投影在0到1之间)。为了说明这个指标,让我们看看下面的示例:
建议1:
用户1:[A,B,C]/用户2:[D,E,F] 个性化=1
建议2:
用户1:[A,B,C]/用户2:[A,B,C] 个性化=0
协同与基于内容的过滤
推荐系统可以分为两类:协同过滤和基于内容的过滤。
协同过滤
协同过滤是基于用户相似度的RS子族。它通过分析与用户u关系密切的其他用户的口味来预测用户u的兴趣。它基于关系密切的用户喜欢的东西是类似的。
基于内容的过滤
基于内容的过滤是基于用户偏好和内容相似性的另一类RS,这意味着它基于这样一种想法:如果你喜欢item i,那么你更可能喜欢类似于i的项,而不是不同于它的项。
基于内容
定义
如上所述,基于内容的方法使用项目描述来查找与用户看到的最接近的项目。我尽可能详尽地实现了这个方法,但是一个几乎没有特征的数据集是这个方法的一个限制。MovieLens数据集只提供电影的类型。
但是,我们开发了一个简单的方法,如下面的伪代码所述:
reco = zero-vector of size number of items
for i in items of user u:
for j in the k closest items to i:
reco[j] = max(reco[j],1 - dist(i,j))
output recommendation reco
对于dist(i,j),使用类型向量之间的余弦距离。
结果
- NDCG@100: 0.011
- Personalization: 0.958
NDCG非常低,这是因为每个样本的特征数量非常有限。
优点
无冷启动:推荐系统(RS)中经常出现的问题之一是冷启动。当添加新项目或用户时,会出现此问题。由于没有可供推断的先前活动,推荐系统给的推荐就会有点生硬。在我们的场景中,一个项目的交互次数并不影响它最终被推荐的可能性,这意味着当涉及到新项目时,我们不存在冷启动问题。
实现简单:如上图所示,使用几行伪代码,算法相当简单。
缺点
查询时间是O(#items×#features),#代表个数,我们必须小心数据的大小。在不进行预处理的情况下,每次要求系统向用户推荐新内容时,它都必须找到与用户交互的每个项目最接近的k个项目。因为有项目可以比较,而每一个距离都需要计算特征来衡量,所以整个过程都需要O(#items × #features)。通过预处理,我们可以终止这个查询时间,但是我们需要在每个项中存储k个最近的项,这意味着在内存中存储k × #items 个项目。
仅当项目具有足够的特征时才有效:如结果所示,如果项目没有足够的特征,则此操作不起作用。例如如果有电影情节的描述,我们会有更好的结果。
基于记忆
定义
基于记忆的推荐是一种计算用户和项目之间相似度的简单方法。与基于模型的方法不同,基于记忆的推荐没有要优化的参数。这是一个非常简单的算法,可以概括为以下几行伪代码:
输入用户u:
使用dist函数查找与u最接近的k个用户
在一个新向量v_u中聚集k个最近接近用户的向量
输出建议v_u
在我们的例子中,我们用以下方法实现了算法:
- 对于距离函数,我们使用了汉明距离:
- 我们使用的聚合函数为:
结果
-
NDCG@100: 0.173
-
Personalization: 0.715
优点
-
实现简单:如上所示,使用少量伪代码,算法相当简单,易于实现。
-
可解释性:这是一些算法的一个重要特性。这允许向用户解释为什么向他们推荐特定内容。这可以是:“我们推荐你看电影A是因为你看了电影B”。
缺点
-
复杂度:这种方法的主要问题是它会使获得可缩放的对象变得更加困难。我们在这方面最好的朋友是本地敏感哈希(LSH)和最近邻搜索算法。
-
查询时间是O(#users×#items):没有预处理的查询时间对每个用户来说都很高,因为你需要以O(#items)的成本计算用户距离,以获得到所有其他用户的距离。然后我们需要找到k个最接近的用户,即O(#items)。通过预处理,我们可以结束这个查询时间,但是我们需要存储离每个用户最近的k个用户,这意味着k × #users个用户在内存中。
非负矩阵分解
定义
非负矩阵分解(Non-negative matrix factorization,NMF)是Netflix竞赛期间出现的一种著名的推荐系统算法。
NMF的思想是将点击矩阵分解为两个低维矩形矩阵,一个用于用户,一个用于项目,嵌入到可计算维度的向量中(我们称之为潜在空间)。将这两个矩阵相乘,得到一个新的矩阵,其值接近它们存在的原始点击矩阵,所有的空白都用(希望)好的预测填补。
结果
- NDCG@100: 0.315
- Personalization: 0.800
优点
-
实现简单:一些库,如Surprise或sklearn可以实现矩阵分解!
-
潜在的可解释性:使用一些聚类和对它们的一些分析(找到共同的演员、流派等);从技术上来说,获得可解释的结果是可能的。
-
查询时间快:为了得到用户的推荐,我们只需要乘以一个向量和一个矩阵。
缺点
- 线性模型:矩阵分解的一个主要限制是它是一个线性模型,因此它不能捕获数据中更复杂的关系。尽管它是线性的,但我们看到它在NDCG方面给出了很好的结果。
神经矩阵分解
定义
神经矩阵因式分解(NeuMF)是一种尝试推广上述经典NMF的新方法。它是在本文中开发的。该模型采用两个整数(两个索引)作为表示项i和用户u的输入,并输出一个介于0和1之间的数字。输出表示用户u对项目i感兴趣的概率。
该神经网络的结构可以分为两部分:矩阵分解部分和全连接部分。然后连接起来传递到Sigmoid层。
结果
- NDCG@100: 0.173
- Personalization: 0.017
下面,尽管我试图用许多不同的参数来正则化,但过拟合是不可避免的。
优点
- 神经网络(非线性模型):NeuMF的主要优点之一是它是一个非线性模型,因此它可以捕获数据中更复杂的模式。然而,我们可以看到我们的NDCG比常规NMF要低。
缺点
-
对大数据集的过拟合:在最初的论文中,NeuMF改进了NMF模型,但它适用于较小的数据集。我们可以推断,对于较大的数据集,这种方法往往会过拟合。
-
查询时间是O(#items):此方法的问题之一是,对于给定的用户,我们需要解析所有项目。当项目数量增加时,这可能会成为一个可伸缩性问题。
受限玻尔兹曼机
定义
受限玻尔兹曼机(RBM)是一种生成随机神经网络,具有非常简单的结构(一个输入层和一个隐藏层),可以用来学习输入上的概率分布,在我们的例子中是点击向量。
结果
- NDCG@100: 0.155
- Personalization: 0.959
下图是验证集上随着epochs增加的NDCG@100
优点
- 神经网络(非线性模型):由于RBM是一个神经网络,它是一个非线性模型,所以它可以捕捉数据中更复杂的模式。
- 潜在的可解释性:RBM从隐藏层表示的数据中学习复杂的特性。通过做一些分析(例如演员),有可能在技术上可以解释结果。
缺点
- 长期训练:这个模型的训练围绕着一种叫做吉布斯抽样的方法。这种方法意味着大量的采样,这是计算密集型的。
深度协同
定义
深度协同是一个直截了当的协同模型,旨在为用户预测最有用的项目。输入是用户的点击向量,原始输出是我们的建议。为了训练这个模型,我使用了用户点击向量的70%作为输入,剩下的作为输出。
架构很简单。有一个相同大小的输入和输出(#items),以及多个相同大小的隐藏层(1000个神经元)。
结果
- NDCG@100: 0.353
- Personalization: 0.087
下面,和往常一样(验证集上随着epochs增加的NDCG@100):
优点
- 神经网络(非线性模型):深度协同是一个非线性模型,因此它可以捕获数据中更复杂的模式。
- 查询时间快:该模型的主要优点是,在一次正向传递中,我们可以获得对给定用户的推荐,从而缩短查询时间。我们可以看到,模型的参数数量随着项目数量的增加而增加,但即使如此,它仍然比NeuMF快。
缺点
- 没有可解释性:这种深度神经网络使得无法解释结果。
自编码
定义
自动编码器(AE)最初用于学习数据的表示(编码)。它们被分解为两部分:
编码器,它减少了数据的维度大小;
解码器,它将编码转换回其原始形式。由于存在降维,神经网络需要学习输入(潜在空间)的低维表示,以便能够重构输入。
在RS环境中,它们可以用来预测新的推荐。为了做到这一点,输入和输出都是点击向量(通常AE的输入和输出是相同的),我们将在输入层之后使用dropout。这意味着模型将不得不重构点击向量,因为输入中的某个元素将会丢失,因此要学会预测给定的点击向量的推荐值。
结果
- NDCG@100: 0.382
- Personalization: 0.154
下面惯例(验证集上随着epochs增加的NDCG@100)。尽管我们试图用很多不同的参数来调整,但它很快就过拟合了。
优点
- 神经网络(非线性模型):该模型是一个非线性模型,这意味着它可以捕获数据中更复杂的模式。
- 查询时间快:一次向前传递就足以获得给定用户的推荐。这意味着查询时间很快。
缺点
无可解释性:这种深度神经网络使得无法解释结果。
变分自编码器
定义
变分自编码器(VAE)是AE的扩展。它将有一个采样层,而不是简单的全连接层。这一层将使用从编码器的最后一层的均值和方差得到一个高斯样本,并使用它作为输入的解码器。跟AE一样,我们在第一层使用dropout。
结果
- NDCG@100: 0.403
- Personalization: 0.117
下面,和往常一样(验证集上随着epochs增加的NDCG@100):
优点
- 神经网络(非线性模型):VAE是一个非线性模型,因此它可以捕获数据中更复杂的模式。
- 查询时间快:一次向前传递就足以获得给定用户的推荐。因此查询时间很快。
缺点
-
更复杂的实现:采样层使得用反向传播计算梯度下降变得困难。重新参数化技巧使得利用方程z=ε×σ+μ,ε~N(0,1)来解决这个问题成为可能。我们现在可以安全地计算梯度了。
-
不可解释:这种深度神经网络使得解释结果不可行。
混合
定义
混合模型提供了两个世界中最好的(基于记忆和基于模型的方法),因此在RS中非常流行。
为了实现混合方法,我选择使用VAE,然后将其结果与基于记忆的结果进行平均。
结果
- NDCG@100: 0.334
- Personalization: 0.561
优点
-
它的一部分是NN:作为VAE方法的一部分,它可以捕获数据中更复杂的模式。
-
可解释性:作为基于记忆的方法的一部分,我们得到了一个有趣的属性,我们可以向用户解释为什么我们推荐他们一个特定的项目。
缺点
- 查询时间是O(#users × #items):计算时间的瓶颈是基于记忆的部分。如上所示,它的查询时间是O(#users×#items),无需预处理。
比较
我们现在可以比较我们所有的模型。NDCG@100最好的模型看是VAE。对于个性化索引,它是RBM。
结论
在NDCG度量上,VAE、AE或深度协同等新方法的性能优于NMF等经典方法。非线性概率模型(如变分自编码)使我们能够超越线性因子模型的有限建模能力。
引用
- Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, Tat-Seng Chua, Neural Collaborative Filtering, 2017
- Dawen Liang, Rahul G. Krishnan, Matthew D. Hoffman, Tony Jebara,Variational autoencoders for collaborative filtering, 2018.
欢迎关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官方文档:
http://sklearn123.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/10/19/%e5%8f%98%e5%88%86%e8%87%aa%e7%bc%96%e7%a0%81%e5%99%a8%e5%a6%82%e4%bd%95%e6%b7%98%e6%b1%b0%e7%bb%8f%e5%85%b8%e7%9a%84%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f/