++论文地址: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;\theta)$是损失函数,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的精度下降:
+-
+
- 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}
$$
有的会选择在量化的适合选择随机从量化参数权重子集里选一个进行量化运算
+参考资料
+ ++ +