共计 6162 个字符,预计需要花费 16 分钟才能阅读完成。
作者 |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.
原文链接:https://medium.com/snipfeed/h…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/