共计 3573 个字符,预计需要花费 9 分钟才能阅读完成。
在过来的十年中,深度学习在解决许多以前被认为无奈解决的问题方面施展了重要作用,并且在某些工作上的准确性也与人类程度相当甚至超过了人类程度。如下图所示,更深的网络具备更高的准确度,这一点也被宽泛承受并且证实。
应用更深层次的网络模型谋求人类级别的准确性会带来一系列挑战,例如:
- 更长的推理工夫
- 更高的计算要求
- 更长的训练工夫
高计算量的深度模型须要较长训练工夫,对于线下训练还是能够承受的,因为训练通常进行一次或以固定的工夫距离进行,但在高吞吐量生产环境中进行线上部署变得极其艰难。在这种状况下模型压缩技术变得至关重要,因为压缩可能在不影响准确性的状况下缩小宏大模型的占用空间。这篇介绍性文章将探讨可用于优化重型深度神经网络模型的不同技术。
模型压缩办法
目前用于古代深度学习的模型压缩的支流办法有三个:
基于量化的办法:量化波及应用较低精度的数据类型来存储模型权重和执行计算(例如:8 位整数而不是 32 位浮点数)。
模型剪枝:模型修剪波及革除对模型性能的奉献较小的神经元或某些神经元之间的连贯。剪枝之所以无效是因为深度神经网络实质上是稠密的,正如 Frankle 等人在他们的论文 The Lottery Ticket Hypothesis:Finding Sparse, Trainable Neural Networks 中所形容的那样。
常识蒸馏:这种办法训练一个小模型来模仿更大、更精确的预训练模型的软标签。
软标签容许学生模型很好地泛化,因为软标签代表了更高级别的形象和对不同类别相似性的了解,而不是峰值的独热编码表示。
在以下局部中,咱们具体介绍模型量化,这是最宽泛应用的模型压缩模式。
什么是量化?
依据定义,量化是将值从大汇合映射到较小汇合的过程,其指标是在转换中具备起码的信息损失。这个过程被广泛应用于各个领域,包含信号处理、数据压缩、信号转换等等。
量化利用于间断模拟信号,通过采样和四舍五入到最靠近的可示意量化值将它们转换为离散数字信号
浮点数示意
1985 年创立的 IEEE 754 规范是古代计算机中浮点值二进制示意的技术标准。依据 IEEE 754,定义了可用于示意浮点数的级别,范畴从 16 位(半精度)到 256 位(八位精度)。浮点数的示意包含三个局部:符号位、无效数(小数)和指数位。
这些二进制模式的值被连接起来以示意内存中的数字。下图形容了 32 位精度浮点数的示意:
对于离散整数示意,咱们最多能够应用 n 位示意 2^n 个不同的数字。应用浮点表示法使咱们可能在数轴上示意更大范畴的数字,如下图所示:
还须要留神的是 不同精度的浮点数应用不同的位来示意指数位和无效位,因而所示意的范畴也有所不同。下表显示了数据类型 FP32、FP16 和 INT8 示意的范畴和最小值。
量化操作
可示意范畴的方差对不同数据类型中固定值的示意是有影响的。以𝞹的数值为例,该值随示意它的不同数据类型而变动。
从表中能够显著看出,将数字从较高精度的数据类型间接转换为较低精度的数据类型可能会导致值的示意误差。这些误差称为量化误差。在深度神经网络中呈现此类误差可能造成重大的结果的,因而将模型间接类型转换为较低的精度并非易事。咱们将在本节探讨最小化此类误差的办法。
实践上咱们能够应用 n 位示意最多 2^n 个不同的值。因为鸽巢原理(pigeonhole principle,狄利克雷抽屉原理),由较高精度数据类型示意的整个范畴映射到较低精度数据类型必然会减少量化误差。然而如果咱们晓得要先验转换的散布的常识,那么它能被用来最小化误差吗?
从 FP32 到 INT8 的代表性映射
FP32 能够示意介于 3.4 10³⁸ 和 -3.4 10³⁸ 之间的范畴。然而大多数深度网络模型的权重在它们的权重和激活方面没有如此大的变动。如果咱们当时晓得或能够预计咱们的输出范畴,咱们就能够确定咱们输出数据的范畴(而不是整个 FP32 范畴)与较低精度数据类型的整个范畴之间的关系,这就能够使映射变得更优化。
让咱们假如输出数据的散布范畴是先验已知的,并以从浮点集(FP32)到整数(INT8)的转换为例探讨转换过程。
深度学习中的量化
当初让咱们介绍一下量化在深度学习中的利用。在深度神经网络中模型参数存储为浮点值,模型的前向缠脖波及一系列浮点运算。所以对于深度学习量化是指对精度要求较低的数据类型中的权重和激活进行量化,如下图所示。
偏置层没有量化吗?在实践中,偏置层通常从浮点数量化到 INT32 精度,而不是升高到 INT8 精度,因为偏置的数量比权重 / 卷积层少得多。应用更大尺寸的 INT32 对深度神经网络模型的体量来说是微不足道的。
量化权重向量
在实践中这是一个简略的步骤,因为咱们通常能够看到模型的权重并且在量化给定层的状况下,权重能够用作先验。咱们察看到神经网络权值的散布通常在一个很小的范畴内,十分靠近于 0。下图显示了 Alexnet 模型和 MobileNet v1 模型中一些卷积和全连贯层的权重散布。这个无限的范畴使得映射到较低精度的数据类型更不容易呈现量化误差。
量化激活
与模型的权重不同,神经网络层的激活依据提供给模型的输出数据而变动,并且为了预计激活范畴,须要一组具备代表性的输出数据样本。因而量化激活是一个依赖于数据的过程,须要额定的数据来校准神经网络层的输入。咱们能够应用不同的办法来确定比例因子和模型权重和激活的零点,咱们将在下一节中探讨。
量化类型
Pytorch、Tensorflow 等古代深度学习框架都反对不同类型的量化。咱们能够将量化算法分类成两大类:
- 训练后量化:在模型齐全训练后执行
- 量化感知训练:训练是在量化束缚下实现的
1)训练后量化
在这种办法中,量化是在模型齐全训练后执行的。因为权重在训练后是固定的权重的映射很容易计算,因为层的激活值依据传递的输出张量而变动,所以在训练后计算激活范畴就比拟麻烦,这里有两种解决办法:
a) 动静训练后量化:
这波及依据运行时输出到模型的数据分布,在推理过程中动静微调激活范畴。这种办法最容易实现,因为量化不须要额定的步骤。因为不须要额定的数据,这种办法最适宜难以生成详尽数据分布的状况——例如:序列到序列模型。然而在运行时应用指数挪动平均线来预计激活范畴会减少模型提早。
b) 动态训练后量化:
这种办法会波及额定的校准步骤,例如应用代表性数据集来预计使数据集变动的激活范畴。为保障最大水平地缩小误差,这种预计会以全精度数据进行,而后将激活按比例放大到较低精度的数据类型。因为在运行期间的推理过程中没有进行额定的计算,因而这种办法生成的模型速度最快(提早起码)
应用训练后量化的次要长处是不须要在整个数据集上进行训练,8 位或 16 位量化能够利用于任何现有的预训练模型。像 Pytorch 和 Tensorflow 这样的古代深度学习框架对这些办法都有官网实现。然而这种策略会因为量化误差而导致一些(通常是轻微的)精度损失。这些误差能够在训练过程中通过应用一个技巧来进一步加重,咱们将在下一节探讨。
2)量化感知训练
量化感知训练 (QAT) 试图解决因为模型训练过程中的量化误差而导致的精度损失的问题。在前向传递中 QAT 在权重和激活计算期间复制量化行为,而损失计算和损失的反向流传放弃不变(放弃更高的精度)。这个想法是由 Jacob 等人提出的。
应用 QAT,所有模型权重和激活在前向传递期间都被“伪量化”:也就是说浮点值被四舍五入以模仿较低精度(通常是 int8)值,但所有其余计算依然应用浮点数实现。因为训练过程中的所有权重调整都是在“意识到”模型最终会被量化的状况下进行的,因而在量化之后这种办法通常会产生比其余办法更高的准确率,并且训练后的量化模型与全精度相比简直无损。
主动混合精度量化
作为 QAT 的扩大,在某些状况下仍不可能将某些层的输出域的整个范畴齐全拟合到较低精度的量化范畴中。这种状况下应用更高的精度值保留这些层是无益的。随着主动混合精度训练的引入这一问题在很大水平上失去了解决,主动混合精度训练波及到在训练工夫内依据层的激活范畴来确定单个层的量化,并且对模型的精度没有影响。
量化类型的总结
下表从数据集需要和波及的衡量方面总结了下面的探讨。
可概括为以下流程图:
模型的基准测试
在本节中,咱们将钻研这些量化办法在各种理论模型中的影响。正如预期的那样,咱们看到量化感知训练 (QAT) 在准确性和提早方面比训练后量化体现得更好。通过量化后大多数模型的精度都有小幅降落,但从整体上看提早的改善可能覆盖了理论利用中性能的小幅降落。
CNN 模型比照
BERT 模型比照
各种类型的量化速度比照
总结
在这篇文章中咱们探讨了各种量化办法,这些办法可用于压缩深度神经网络,同时对模型的准确性影响最小。咱们常常应用包含量化在内的各种技术来优化咱们的模型。量化作为罕用的模型压缩形式,在生产环境中失去了宽泛的利用。
作者:Akash Manna,Vikram Gupta,Debdoot Mukherjee