深度学习模型真的越大越好吗?

作者 | Jameson Toole

译者 | 平川

编辑 | 陈思

AI 前线导读:今年早些时候,NVIDIA 的研究人员发布了 MegatronLM,这是一个拥有 83 亿个参数(比 BERT 大 24 倍)的巨型转换模型,它在各种语言任务中都取得了最顶尖的性能。虽然这无疑是一项令人印象深刻的技术成就,但我不禁要问:深度学习的方向是否正确?更多优质内容请关注微信公众号“AI 前线”(ID:ai-front)

本文最初发布于 Heartbeat,由 InfoQ 中文站翻译并分享。

以下内容源于我最近在伦敦的 O 'Reilly AI 大会和 DroidCon 大会上的两次演讲。

今年早些时候,NVIDIA 的研究人员发布了 MegatronLM,这是一个拥有 83 亿个参数(比 BERT 大 24 倍)的巨型转换模型,它在各种语言任务中都取得了最顶尖的性能。虽然这无疑是一项令人印象深刻的技术成就,但我不禁要问:深度学习的方向是否正确?

仅这些参数就在磁盘上占了超过 33GB。最终模型的训练需要在 512 个 V100 GPU 上连续运行 9.2 天。考虑到每张板卡的能量需求,根据粗略估计,用于训练这一模型所消耗的能量是美国人平均年消耗能量的三倍多。

我并不是故意挑出这个特别的项目。大量的模型训练 都是为了在各种基准上获得稍微高一点的精度,这样的例子 不胜枚举。尽管 MegatronLM 比 BERT 大 24 倍,但它在语言建模方面只比 BERT 好 34%。作为一个演示新硬件性能的一次性实验,它并没有太大的危害。但从长远来看,这种趋势会带来一些 问题。

首先,它阻碍了民主化。如果我们相信,在这个世界上,数以百万计的工程师将使用深度学习来改进每一个应用程序和设备,那么我们就无法借助于需要花费大量时间和金钱进行训练的大规模模型。

其次,它限制了规模。世界上所有公有和私有云中可能都只有不到 1 亿个处理器。但是现在已经有 30 亿部手机,120 亿物联网设备,1500 亿微控制器。从长远来看,这些小的、低功耗的设备将是使用深度学习最多的地方,而巨大的模型不会成为它们的选项。

为了确保深度学习兑现承诺,我们需要重新调整研究方向,从最顶尖的准确性转向最顶尖的效率。我们需要问一下,模型是否能够让尽可能多的人以尽可能少的资源在大多数设备上进行迭代。

好消息是,人们正在努力使深度学习模型更小、更快、更高效。早期的回报令人难以置信。以 Han 等人 2015 年的一篇 论文 为例。

“在 ImageNet 数据集上,我们的方法将 AlexNet 所需的存储空间减少了 35 倍,从 240MB 减少到 6.9MB,同时没有损失准确性。我们的方法将 VGG-16 的大小减少了 49 倍,从 552MB 减少到 11.3MB,同样没有损失准确性。”

为了达到这样的结果,我们必须考虑整个机器学习的生命周期——从模型选择到训练再到部署。在本文的其余部分,我们将深入研究这些阶段,并研究如何构建更小、更快、更高效的模型。

模型选择

要得到一个更小、更高效的模型,最好的方法是从一个模型开始。上图描绘了各种模型架构的大致大小(以 MB 为单位)。我已经标注了移动应用程序的典型大小(包括代码和资产),以及嵌入式设备中可用的 SRAM 数量。

Y 轴上的对数刻度缓和了视觉上的冲击,但不幸的事实是,大多数模型架构的数量级都太大了,除了数据中心外,其他地方都无法部署。

令人难以置信的是,右边的小架构并不比左边的大架构效果差多少。像 VGG-16 这样的架构(300-500MB)的性能与 MobileNet(20MB)差不多,尽管它比 MobileNet 大了将近 25 倍。

是什么使得像 MobileNet 和 SqueezeNet 这样的小型架构如此高效?基于 Iandola 等人(SqueezeNet)、Howard 等人(MobileNetV3)和 Chen 等人(DeepLab V3)的实验,从模型的宏观和微观架构中可以找到一些答案。

宏观架构是指模型使用的层的类型,以及它们是如何被编排成模块和块的。要生成高效的宏观架构:

通过稍后的降采样或使用扩张(空洞)卷积来保持大的激活映射;

使用更多的通道,但更少的层;

在计算过程中使用跳过连接和残差连接来提高精度和重用参数;

用 深度可分离卷积 替换标准卷积。

模型的微架构是由与各个层相关的选择定义的,最佳实践包括:

使输入和输出块尽可能高效,因为它们通常占模型计算成本的 15-25%;

减小卷积核的大小;

添加一个宽度乘法器来控制每个卷积与超参数 alpha 的通道数;

编排层以便融合参数(例如偏差和批处理标准化)。

模型训练

在选择了一个模型架构之后,仍然可以做很多事情来缩小模型并使其在训练期间更高效。如果这还不明显的话,大多数神经网络都是过度参数化的。许多训练过的权值对整体精度影响很小,可以去掉。Frankle 等人 发现,在许多网络中,80-90% 的网络权值可以移除——同时这些权值中的大部分精度也可以移除——几乎不会损失精度。

寻找和删除这些参数有三种主要策略:知识精炼、修剪和量化。它们可以一起使用,也可以单独使用。

知识精炼

知识精炼使用较大的“教师”模型来训练较小的“学生”模型。Hinton 等人在 2015 年 首先提出 了这种技术,其关键是两个损失项:一个是针对学生模型的硬预测,另一个是基于学生在所有输出类中生成相同的分数分布的能力。

Polino 等人 在 CIFAR10 上训练的 ResNet 模型在大小上减少了 46 倍,而精度损失仅为 10%,在 ImageNet 上减小了 2 倍,精度损失仅为 2%。最近,Jiao 等人 对 BERT 进行了精简,得到了 TinyBERT:比原来小 7.5 倍,快 9.4 倍,精确度仅降低 3%。有一些很棒的开源库实现了精简框架,包括 Distiller 和 面向转换器的 Distil*。

修剪

第二种缩小模型的技术是修剪。修剪涉及到评估模型中权值的重要性,并删除那些对模型整体准确性贡献最小的权值。修剪可以在网络的多个尺度上进行。最小的模型是在单权值级上进行修剪。小量级的权值设置为 0。当模型被压缩或以稀疏格式存储时,这些零在存储时非常高效。

Han 等人 使用这种方法将普通的计算机视觉架构缩小了 9 到 13 倍,而在精度上的变化可以忽略不计。不幸的是,缺乏对快速稀疏矩阵操作的支持意味着权值级修剪不会增加运行时速度。

为了创建更小、更快的模型,需要在过滤器或层级别上进行修剪——例如,删除对总体预测精度贡献最小的卷积层的过滤器。在过滤器级修剪的模型没有那么小,但通常更快。Li 等人 使用该技术将 VGG 模型的大小和运行时间减少了 34%,并且没有损失准确性。

最后,值得注意的是,对于是从较大的模型开始然后修剪,还是从零开始训练较小的模型,Liu 等人 的研究结果各不相同。

量化

图片来源:网页链接

模型训练完成后,就需要准备部署了。这里也有一些技术可以对模型做进一步的优化。通常,模型的权值存储为 32 位浮点数,但对于大多数应用程序来说,这远远超出了所需的精度。通过量化这些权值,我们可以节省空间和(有时)时间,同时对准确性的影响也很小。

量化将每个浮点权值映射到一个精度固定的整数,该整数位数少于原来的浮点数。虽然有许多量化技术,但两个最重要的因素是最终模型的位深以及权值在训练时或训练后是否进行了量化(量化感知训练和训练后量化)。

最后,量化权值和激活来加速模型运行时也是很重要的。激活函数是数学运算,自然会产生浮点数。如果不修改这些函数来生成量化的输出,模型甚至会由于必要的转换而运行变慢。

在一篇精彩的评论文章中,Krishnamoorthi 测试了一些量化方案和配置,并提供了一组最佳实践:

结果:

训练后量化通常可以降到 8 位,使模型缩小 4 倍,精度损失小于 2%;

训练感知量化允许将位深减少到 4 位或 2 位(模型缩小 8 到 16 倍),同时使精度损失最小化;

量化权值和激活可以使其在 CPU 上的运行速度提高 2 到 3 倍。

部  署

这些技术中的一个共同点是,它们生成了一个连续的模型,每个模型具有不同的形状、大小和精度。虽然这造成了一些管理和组织问题,但它很好地反映了模型在实际使用时将面临的各种硬件和软件条件。

上图显示了一个 MobileNetV2 模型在不同智能手机上的运行速度。在最低端和最高端的设备之间可以有 80 倍的速度差异。为了给用户提供一致的体验,将正确的模型放在正确的设备上是很重要的。这意味着要训练多个模型,并根据可用的资源将它们部署到不同的设备上。

通常,可以通过以下方式在设备上获得最佳性能:

使用原生格式和框架(如在 iOS 上使用 Core ML,在 Android 上使用 TFLite);

仅通过使用受支持的操作来利用任何可用的加速器(如 GPU 或 DSP);

跨设备监控性能,识别模型瓶颈,迭代特定硬件的体系结构。

当然,监控和管理所有模型的不同版本并不总是很容易,这正是我们构建 Fritz AI 的原因。

合而为一

通过应用这些技术,可以将大多数模型缩小和加速至少一个数量级。以下引用来自目前为止讨论过的几篇论文:

“TinyBERT 实际上非常高效,并且在 GLUE 数据集上取得了与 BERT 相当的结果,与此同时,它比 BERT 小 7.5 倍,推理速度快 9.4 倍。” ——Jiao et al

“我们的方法将 VGG-16 的大小减少了 49 倍,从 552MB 减少到 11.3MB,同样没有损失准确性。” ——Han et al

“该模型本身占用的闪存空间不足 20KB,而且只需要 30KB 的 RAM 就可以运行。” ——Peter Warden at TensorFlow Dev Summit 2019

为了证明普通人就可以完成这项工作,我冒昧地 创建了一个 17KB 大小的转换模型,它只包含 11,686 个参数,但仍然可以产生与拥有 160 万个参数的模型一样好的结果。

左:原始图像。中间:来自 17KB 模型的风格化图像。右图:来自较大的 7MB 模型的风格化图像。

我一直很惊讶,这样的结果很容易实现,但却没有一篇论文将其作为一个标准的过程来完成。如果我们不改变我们的做法,我担心我们会浪费了时间、金钱和资源,却无法将深度学习应用到可以从中受益的设备上。

不过,好消息是,大型模型的边际效益似乎在下降,由于这里概述的技术,我们可以在不牺牲准确性的情况下对大小和速度进行优化。

一些关于未来的开放性问题

到目前为止,我相信我们只触及了模型优化的表面。随着更多的研究和实验,我认为这有可能走得更远。为此,以下是我认为有必要开展进一步工作的一些领域:

更好的框架支持量化操作和量化感知训练;

更严格的研究模型优化与任务复杂性;

确定平台感知神经结构搜索 是否有用的额外工作;

持续投资 Multi-Level Intermediate Representation(MLIR)。

英文原文:

网页链接

你也「在看」吗?

雪球转发:0回复:0喜欢:0