随着深度学习的出现,基于神经网络的个性化和推荐模型已经成为包括 Facebook 等公司构建推荐系统的重要工具。然而,这些模型与其他深度学习模型有很大的不同,因为它们必须能够处理用于描述高级属性的分类数据。对于一个神经网络来说,有效地处理这类稀疏的数据是很有挑战性的,而且由于公开的代表性模型和数据集细节的缺乏,减缓了其研究进展。
为了有助于加深人们对这一子领域的理解,Facebook 开源了一个最先进的深度学习推荐模型(DLRM),该模型是使用 Facebook 开源的 PyTorch 和 Caffe2 平台实现的。DLRM 通过将协同过滤和基于预测分析的方法的原理结合起来,改进了其他模型,从而使其能够有效地处理工业规模的数据,并提供最先进的结果。
相关 github 地址:https://github.com/facebookresearch/dlrm
雷锋网将 Facebook 博文编译如下:
通过发布这个模型,并在本文中详细介绍它的功能,我们希望帮助社区找到新方法,从而解决使用这类模型所带来的独特挑战。我们还希望鼓励进一步的算法实验、建模、系统协同设计和基准测试。这反过来将导致新的模型和更高效的系统,它们可以为使用数字服务的人们提供更相关的内容。
了解 DLRM 模型
在 DLRM 模型中,分类特征使用 embedding 处理,而连续特征使用底层多层感知器(MLP)处理。然后,它明确地计算了不同特征的二阶交互作用。最后,使用顶部 MLP 对结果进行处理,并将其输入到 sigmoid 函数中,以给出单击的概率。
DLRM 模型处理描述用户和产品的连续(密集)和分类(稀疏)功能,如图所示。它使用了各种硬件和系统组件,如内存容量和带宽,以及通信和计算资源。
基准化分析与系统协同设计
DLRM 的开源实现可以用作衡量以下各项的基准:
- 模型执行的速度
- 各种数值技术如何影响其精度
这可以在不同的硬件平台上完成,例如 BigBasin 人工智能平台。
DLRM 基准测试提供了两个版本的代码,一个使用 PyTorch,另一个使用 Caffe2 操作符。此外,还使用 Glow C 操作符提供了这种变化的实现(为适应每个框架的具体情况,每个框架的代码略有不同,但总体结构是相似的)。这些实现允许我们将 Caffe2 框架与 PyTorch 框架以及当前专注于加速器的 Glow 的实现进行对比。也许最重要的是,我们接下来可以突出显示每个框架中的最佳特性,这些特性将来可以合并到一个框架中。
Big Basin 采用模块化,可扩展的架构,开源设计可用
DLRM 基准测试支持随机和合成输入。支持与分类特征对应的自定义索引生成有很多原因。例如,如果我们的应用程序使用一个特定的数据集,但出于隐私考虑,我们不想共享它,那么我们可以选择通过分发来表示分类功能。另外,如果我们想练习系统组件,例如研究内存运行,我们可能想捕获合成追踪中,原始追踪访问的基本位置。
此外,Facebook 上的服务根据用例使用各种个性化的推荐模型。例如,为了在大规模数据上提高性能,服务可以通过批处理输入并将多个模型放在一台机器上,在不同的平台上并行推理。此外,Facebook 数据中心中的各种服务器引入了架构异构性,从不同的 SIMD 宽度到缓存层次结构的不同实现。这篇文章对 Facebook 推荐系统的体系结构进行了深入分析。
并行性
如上图所示,DLRM 基准由计算主导的 MLP 和内存容量有限的 embedding 组成。因此,依靠数据并行性来提高 MLP 的性能,依靠模型并行性来满足嵌入的内存容量需求是很自然的。DLRM 基准测试提供了一个遵循此方法的并行实现。我们注意到,在交互过程中,它需要一个高效的全部一一对应的通信原语,我们称之为蝴蝶式随机播放。它将每个设备上小批量的嵌入查找结果随机移动到所有设备上的小批量嵌入查找的一部分。如下图所示,其中每种颜色表示小批量的不同元素,每个数字表示设备及其分配的 embedding。
建模与算法实验
DLRM 基准测试是用 Python 编写的,其中模型体系结构、数据集和其他参数由命令行参数定义。
该代码是自包含的,可以与公共数据集(包括 kaggle 广告展示挑战赛数据集)进行接口。这个特定的数据集包含 13 个连续特征和 26 个分类特征,这些特征定义了 MLP 输入层的大小以及模型中使用的 embedding 数量,而其他参数可以在命令行上定义。例如,下面的图表显示了使用以下命令行参数运行 DLRM 的结果。
python dlrm_s_pytorch.py --arch-sparse-feature-size=16 --arch-mlp-bot="13-512-256-64-16" --arch-mlp-top="512-256-1" --data-generation=dataset --data-set=kaggle --processed-data-file=./input/kaggle_processed.npz --loss-function=bce --round-targets=True --learning-rate=0.1 --mini-batch-size=128 --print-freq=1024 --print-time
左边的图表显示了训练和测试二进制交叉熵损失,右边的图表显示了训练和测试的准确性
模型运行在一个真实的数据集上,它允许我们测量模型的精度。我们计划在接下来的工作中基于建模和算法实验,对该模型的影响进行进一步深入的分析。
通过详细描述 DLRM 最先进的个性化推荐系统及其开源实现,我们希望能提醒大家注意这类模型所带来的独特挑战。我们期待着与人工智能社区的其他人合作,在算法实验、建模、系统协同设计和基准测试方面取得进展。从长远来看,我们的目标是开发新的、更好的方法,将深度学习用于推荐和个性化工具(并提高模型的效率和性能),使用新的方法给人们推荐和他们最相关的内容。
via:https://ai.facebook.com/blog/dlrm-an-advanced-open-source-deep-learning-recommendation-model/