前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >变分自编码器如何淘汰经典的推荐系统

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

作者头像
磐创AI
发布2020-07-17 14:14:35
1.2K0
发布2020-07-17 14:14:35
举报

磐创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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据集:MovieLens 20M
    • 初始数据集
      • 训练数据集
        • 训练验证测试数据集
        • 指标:NDCG和Personalization
          • NDCG
            • Personalization(个性化指数)
            • 协同与基于内容的过滤
              • 协同过滤
                • 基于内容的过滤
                • 基于内容
                  • 定义
                    • 结果
                      • 优点
                        • 缺点
                        • 基于记忆
                          • 定义
                            • 结果
                              • 优点
                                • 缺点
                                • 非负矩阵分解
                                  • 定义
                                    • 结果
                                      • 优点
                                        • 缺点
                                        • 神经矩阵分解
                                          • 定义
                                            • 结果
                                              • 优点
                                                • 缺点
                                                • 受限玻尔兹曼机
                                                  • 定义
                                                    • 结果
                                                      • 优点
                                                        • 缺点
                                                        • 深度协同
                                                          • 定义
                                                            • 结果
                                                              • 优点
                                                                • 缺点
                                                                • 自编码
                                                                  • 定义
                                                                    • 结果
                                                                      • 优点
                                                                        • 缺点
                                                                        • 变分自编码器
                                                                          • 定义
                                                                            • 结果
                                                                              • 优点
                                                                                • 缺点
                                                                                • 混合
                                                                                  • 定义
                                                                                    • 结果
                                                                                      • 优点
                                                                                        • 缺点
                                                                                        • 比较
                                                                                        • 结论
                                                                                          • 引用
                                                                                          领券
                                                                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档