论文地址:A Survey of Quantization Methods for Efficient Neural Network Inference
摘要
这篇论文是关于模型量化方向的综述,介绍了量化相关领域的研究,同时也介绍了一些重要的论文。
提到了量化的好处:
- 加快模型的推理过程
- 减少模型的存储开销
- 可以部署到特定设备(比如有的设备只能进行整型运算)
介绍
过去模型的能力有了巨大的提升,其中一个原因就是模型参数的增加,但这也为模型的部署提升了难度。
过去几年关于这方面的尝试有如下几种:
- 设计高效的神经网络模型架构,包括微观结构和宏观结构
- 神经网络软件和硬件协同设计
- 剪枝,减去对模型影响小的参数,分为结构化剪枝(删去部分参数)和非结构化剪枝(删去部分结构,相当于参数按组删去),两个方法各有优劣
- 知识蒸馏,用“教师”模型训练“学生”模型,可与前面方法结合
- 量化:分为训练中量化和推理量化
- 量化和神经科学的发展
这里很多次提到了AutoML和NAS技术调整网络结构
量化历史
量化,作为一种从大的(通常是连续的)集合中的输入值映射到小的(通常是有限的)集合中的输出值的方法,具有很长的历史。早在1897年就有微积分相关工作从事量化研究,同时,量化在信号处理中也非常重要。
香农在信息学和信号处理的研究过程中也针对量化进行过研究。同时,量化在连续数学量的数值求解中研究过。一些问题的良好解法可能由于数字量化会导致巨大误差,从而引出了算法数值稳定性的概念。
神经网络的发展给量化带来了机遇。神经网络的计算是计算密集型任务且目前很多模型都过度参数化。很多问题的解决都是基于一个某种误差度量,因此量化可能会增大误差,但同时也会增加模型的鲁棒性。
量化的基本概念
问题设置和符号
在不失一般性的情况下,让我们关注监督学习问题,即最小化下面所示的损失函数。
\[ L(\theta)=\frac{1}{N} \sum^{N}_{i=1}l(x_i,y_i;\theta) \]
(x,y)是输入数据和对应的标签,$ l(x_i,y_i;)$是损失函数,N是数据数目
同时让我们把第\(i\)层的输入隐藏激活表示为\(h_i\),输出隐藏激活表示为\(a_i\),我们假设浮点格式存储的模型参数为\(\theta\).
均匀量化
均匀量化和非均匀量化
均匀量化的一个常用的函数是
\[ Q(r)=Int(\frac{r}{S})-Z \]
\(Q\)是压缩函数,\(r\)是实数类型的输入,\(S\)是实数类型的比例因子,\(Z\)是整数零点,\(Int\)函数通过舍入操作把实数映射到整数
去量化操作
\[ Q(\tilde{r})=S(Q(r)+Z) \]
由于舍入操作\(\tilde{r}\)和\(r\)不会严格相等
对称和非对称量化
对称和非对称量化(观察量化前后零点位置
确定放缩因子\(S\)的式子为
\[ S=\frac{\beta-\alpha}{2^{b}-1} \]
\([\alpha,\beta]\)代表剪切范围,\(b\)代表量化位宽.
确定\([\alpha,\beta]\)的两个方式:
- \(\alpha=r_{min},\beta=r_{max}\)
- \(-\alpha=\beta=max(|r_{min}|,|r_{max}|)\)
利用实数的最大最小位选定裁剪范围可能会容易被异常数据影响,从而增加不必要的范围.解决这个问题的一种方法是使用百分位数,另一种方法是选择\(α\)和\(β\),以最小化真实值和量化值之间的KL散度(即信息损失).也有学者对不同的量化范围选取范围方法进行了评估.
确定\(S\)的两个方式:
- \(\frac{2max(|r|)}{2^n-1}\)
- \(\frac{max(|r|)}{2^{n-1}-1}\)
对称量化使用广泛,因为可以把零点降为0,减少计算成本并且实现更加简单;非对称量化对于范围可能是倾斜的和不对称的情况表现会更加优秀.
非对称激活中的偏移而占据的交叉项是一个静态数据独立项并且可以被偏差吸收(或用于初始化累加器).
范围校准算法:静态与动态量化
- 动态量化:运行期间计算量化参数,高精度,高开销
- 静态量化:量化参数预先确定,推理期间为静态,低开销,低精度
量化粒度
- 分层量化:通过一整个层的数值来计算量化参数,实现简单,精度次优
- 分组量化:把每一层的多个通道进行分组量化,有助于解决单个通道、激活分布离散的情况,但是计算开销会增加
- 分通道量化:每一层的每个通道进行量化,更好的精度,更高的计算成本
- 分卷积核(滤波器)量化:输入通道为\(n\),输出通道为\(m\),那么应该会有\(n*m\)个卷积核,根据卷积核量化会有更高的精度
总结(量化粒度)。通道量化是目前用于量化卷积核的标准方法。它使从业者能够以可忽略不计的开销来调整每个单独的内核的剪切范围。相比之下,子信道量化可能会导致巨大的开销,而且目前还不是标准的选择。
非均匀量化
量化步骤和量化水平被允许是非均匀间隔的
\[ Q(r)=X_i, \quad if\quad r \in [r_i,r_{i+1}] \]
非均匀量化对于固定的位宽,可以获得更高的精度 典型的有
- 钟型分布
- 对数分布
- 二进制码,把一个向量拆成多个基向量的和,每个基向量的每个维度的值的绝对值为1
很多把量化问题转化为优化问题,减少原始张量r和量化后张量Q(r)的差异
\[ \underset{Q}{min}||Q(r)-r|| \]
此外,量化器本身也可以和模型参数一起学习,称之为可学习的量化器 还有一些工作使用聚类来减少量化损失
非均匀量化能更好的捕获信息,但是计算成本更高,因此目前主流的还是均匀量化
微调方法
量化可能需要对参数进行微调,有两种方式:
- 量化感知训练QAT
- 训练后量化PTQ
左边是QAT,右边是PTQ
QAT
QAT一种方法展示 反向传播方法有:
- STE
- 随机神经元
- 组合优化
- 目标传播
- Gumbelsoftmax
- 正则化算子来强制执行要量化的权重(量化过程没有不可微分算符)
也可以考虑量化感知训练的过程种学习量化参数
PTQ
PTQ的流程:
由于PTQ不需要训练,所以对数据集的依赖比较低,当然,精度也会下降
因此,PTQ的研究重点都在于减轻PTQ的精度下降:
- ACIQ 解析地计算了PTQ的最佳剪切范围和通道级位宽设置
- OMSE方法在激活时去除信道级量化,并提出通过优化量化张量与相应的浮点张量之间的L2距离来进行PTQ
- 一种离群值信道分裂(OCS)方法,该方法将包含离群值的信道重复和减半,缓解离群值对PTQ的不利影响
- AdaRound表明,简单的圆到最近的量化方法(round-to-nearest)可以反直觉地得到次优解,并且提出了一种自适应四舍五入的方法
- AdaQuant提出了一种更通用的方法,允许量化权值根据需要进行变化。
在PTQ中,所有的权值和激活量化参数都是不需要再训练而确定的。因此,PTQ是一种非常快速的神经网络模型量化方法。然而,与QAT相比,这往往以较低的准确性为代价。
Zero-shot Quantization(ZSQ)
PTQ的极端场景,量化过程中不使用数据
- Level 1: 没有数据且没有微调 (ZSQ + PTQ).
- Level 2: 没有数据但需要微调 (ZSQ +QAT).
ZSQ中一个流行的研究分支是生成与类似于真实数据的合成数据,从中训练目标预先训练的模型。
随机量化
在推理过程中,量化方案总是确定的,小的权重更新可能不会导致任何权重变化,因为舍入操作可能总是返回相同的权重。然而,启用一个随机舍入可能为神经网络提供一个随机的机会,从而更新其参数。
比如,在有的论文里面,INT操作定义为
\[ INT(x)=\begin{cases} \lfloor x \rfloor ,with \quad probability \quad \lceil x \rceil-x\\ \lceil x \rceil ,with \quad probability \quad x-\lfloor x \rfloor\\ \end{cases} \]
有的会选择在量化的适合选择随机从量化参数权重子集里选一个进行量化运算
ADVANCED CONCEPTS: QUANTIZATION BELOW 8 BITS
模拟和纯整数量化
部署量化神经网络模型有两种常见方法:
- 模拟量化(又名假量化):模拟量化中,量化后的模型参数以低精度存储,但运算(例如矩阵乘法和卷积)是用浮点运算进行的,运算之前需要对量化参数进行反量化
- 纯整数量化(又名定点量化):所有运算都是使用低精度整数算术执行
如下图所示,硬件对低精度的处理会更好,并且低精度能量和面积方面的效率明显更高。
(这里稍微介绍了对于各种激活函数的量化方法,可以留意一下?
二进量化(Dyadic quantization)是一种特殊的量化方法,通过把权重量化为二元数(二元数是分子中具有整数值、分母中具有 2 的幂的有理数),从而把运算转化为加减与位移从而提高效率。
两种量化种纯整数量化应用较多,但是假量化在通信成本高于计算成本的时候也有一定的应用前景。
混合精度量化
使用较低精度的量化时,硬件性能会提高。然而,将模型统一量化为超低精度可能会导致精度显着下降,可以通过混合精度量化来解决这个问题。
每一层都以不同的位精度进行量化,如下图所示。这种方法的一个挑战是,用于选择此位设置的搜索空间与层数成指数关系。人们提出了不同的方法来解决这个巨大的搜索空间。
搜索方法有:
- 强化学习
- 转化为神经架构搜索NAS使用DNAS解决
另一类混合精度方法使用周期函数正则化来训练混合精度模型,方法是在学习各自的位宽时自动区分不同的层及其在准确性方面的不同重要性。
HAWQ引入了一种基于模型二阶灵敏度自动查找混合精度设置的方法。
硬件感知量化
量化带来的性能提升和硬件有着密切关系,比如带宽设置、缓存结构等。因此,通过硬件感知量化实现最佳效益十分重要。
蒸馏辅助量化
量化领域的一个有趣的工作是结合模型蒸馏来提高量化精度。在学生模型的训练过程中,模型蒸馏建议利用教师产生的软概率,而不是仅使用真实类别标签,其中可能包含更多的输入信息。
\[ \mathcal{L}=\alpha\mathcal{H}(y,\sigma(\mathcal{z}_{s}))+\beta\mathcal{H}(\sigma(\mathcal{z}_{t},T),\sigma(\mathcal{z}_{s},T)) \]
α 和 β 是调整学生模型损失量和蒸馏损失的加权系数,y 是真实类别标签, \(\mathcal{H}\)是交叉熵损失函数,\({\mathcal{z}}_{s}/{\mathcal{z}}_{t}\)是学生/教师模型生成的概率,T是温度。
\[ p_{i}=\frac{\exp\frac{z_{i}}{T}}{\sum_{j}\exp\frac{z_{j}}{T}} \]
然后有许多关于蒸馏过程的尝试,比如使用软概率、中间层数据、多教师模型等。
极致量化
这里提到了一些极端的量化方法,比如二值化和三值化等,但是极致的量化也会带来巨大的精度损失。因此有许多工作是关于极值量化的。目前大致有三个分支:
- 量化误差最小化
- 改进损失函数
- 改进训练方法
矢量量化
量化的目标是保持精度,而不是单个值的差异。因此有相关工作是把权重聚类分组然后使用中心作为量化值。还可以扩展为矩阵的乘积量化,把矩阵按照子矩阵分组。
量化和硬件处理器
这里罗列了一些处理器,并且介绍了他们的特点。
量化的未来研究
介绍了未来可以研究的几个东西:
- 量化软件
- 硬件和神经网络架构协同设计
- 耦合压缩方法
- 量化训练
总结和结论
...