变分自编码器如何淘汰经典的推荐系统

2020-07-17 14:14:35 浏览数 (1)

磐创AI分享

作者 | 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数据集只提供电影的类型。

但是,我们开发了一个简单的方法,如下面的伪代码所述:

代码语言:javascript复制
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 个项目。

「仅当项目具有足够的特征时才有效」:如结果所示,如果项目没有足够的特征,则此操作不起作用。例如如果有电影情节的描述,我们会有更好的结果。

基于记忆

定义

基于记忆的推荐是一种计算用户和项目之间相似度的简单方法。与基于模型的方法不同,基于记忆的推荐没有要优化的参数。这是一个非常简单的算法,可以概括为以下几行伪代码:

代码语言:javascript复制
输入用户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等经典方法。非线性概率模型(如变分自编码)使我们能够超越线性因子模型的有限建模能力。

引用
  1. Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, Tat-Seng Chua, Neural Collaborative Filtering, 2017
  2. Dawen Liang, Rahul G. Krishnan, Matthew D. Hoffman, Tony Jebara,Variational autoencoders for collaborative filtering, 2018.

原文链接:https://medium.com/snipfeed/how-variational-autoencoders-make-classical-recommender-systems-obsolete-4df8bae51546

0 人点赞