高效神经网络推理量化方法综述
立即解锁
发布时间: 2025-08-29 11:17:04 阅读量: 14 订阅数: 20 AIGC 


低功耗计算机视觉技术精要
# 高效神经网络推理量化方法综述
## 1. 神经网络量化概述
神经网络(NN)的推理和训练计算量都很大,因此数值的高效表示尤为重要。而且当前大多数神经网络模型存在严重的过参数化问题,这为在不影响精度的前提下降低比特精度提供了机会。与传统研究不同,神经网络对激进的量化和极端离散化具有很强的鲁棒性,即使量化模型与原始非量化模型之间存在较大误差,也能实现良好的泛化性能。此外,神经网络的分层结构为量化提供了额外的探索维度,不同层对损失函数的影响不同,这促使人们采用混合精度的量化方法。
## 2. 量化的基本概念
### 2.1 问题设定与符号表示
假设神经网络有 $L$ 层可学习参数,记为 $\{W_1, W_2, ..., W_L\}$,$\theta$ 表示所有这些参数的组合。在监督学习问题中,目标是优化以下经验风险最小化函数:
\[L(\theta) = \frac{1}{N} \sum_{i=1}^{N} l(x_i, y_i; \theta)\]
其中,$(x, y)$ 是输入数据和对应的标签,$l(x, y; \theta)$ 是损失函数(如均方误差或交叉熵损失),$N$ 是数据点的总数。第 $i$ 层的输入隐藏激活记为 $h_i$,对应的输出隐藏激活记为 $a_i$。我们假设已经有以浮点精度存储的训练好的模型参数 $\theta$。量化的目标是将参数 $\theta$ 以及中间激活图(即 $h_i$,$a_i$)的精度降低到低精度,同时尽量减少对模型泛化能力/准确性的影响。为此,需要定义一个将浮点值映射到量化值的量化算子。
### 2.2 均匀量化
均匀量化需要定义一个将神经网络权重和激活量化到有限值集的函数。一个流行的量化函数如下:
\[Q(r) = \text{Int}(\frac{r}{S}) - Z\]
其中,$Q$ 是量化算子,$r$ 是实值输入(激活或权重),$S$ 是实值缩放因子,$Z$ 是整数零点。$\text{Int}$ 函数通过舍入操作(如四舍五入和截断)将实值映射到整数值。这种量化方法也称为均匀量化,因为得到的量化值(即量化级别)是均匀间隔的。可以通过反量化操作从量化值 $Q(r)$ 恢复实值 $r$:
\[\tilde{r} = S(Q(r) + Z)\]
由于舍入操作,恢复的实值 $\tilde{r}$ 不会与 $r$ 完全匹配。
### 2.3 对称和非对称量化
在均匀量化中,缩放因子 $S$ 的选择很重要,其计算公式为:
\[S = \frac{\beta - \alpha}{2^b - 1}\]
其中,$[\alpha, \beta]$ 表示裁剪范围,$b$ 是量化比特宽度。确定缩放因子之前,需要先确定裁剪范围,这个过程通常称为校准。一种直接的选择是使用信号的最小值/最大值作为裁剪范围,即 $\alpha = r_{min}$,$\beta = r_{max}$,这是一种非对称量化方案,因为裁剪范围不一定关于原点对称。也可以选择对称裁剪范围 $\alpha = -\beta$,例如基于信号的最小值/最大值选择 $-\alpha = \beta = \max(|r|)$,这是对称量化方案。非对称量化通常会得到比对称量化更紧密的裁剪范围,这在目标权重或激活不平衡时(如 ReLU 后的激活始终为非负值)尤为重要。对称量化通过将零点设为 $Z = 0$ 简化了量化函数:
\[Q(r) = \text{Int}(\frac{r}{S})\]
对称量化在量化权重时被广泛采用,因为消除零点可以降低推理过程中的计算成本,并且实现更简单。然而,对于激活,非对称激活中的偏移导致的交叉项是与数据无关的静态项,可以被吸收到偏置中(或用于初始化累加器)。使用信号的最小值/最大值进行对称和非对称量化是一种流行的方法,但这种方法容易受到激活中离群数据的影响,可能会不必要地增加范围,从而降低量化分辨率。可以使用百分位数代替最小值/最大值,或者选择 $\alpha$ 和 $\beta$ 来最小化实值与量化值之间的 KL 散度。
| 量化类型 | 优点 | 缺点 | 适用场景 |
| --- | --- | --- | --- |
| 对称量化 | 实现简单,可降低计算成本 | 对于范围不对称的情况不是最优 | 权重量化 |
| 非对称量化 | 裁剪范围更紧密 | 实现相对复杂 | 激活不平衡的情况 |
### 2.4 范围校准算法:静态与动态量化
确定裁剪范围 $[\alpha, \beta]$ 的方法有多种,另一个重要的区别是裁剪范围的确定时间。对于权重,裁剪范围可以静态计算,因为在大多数情况下,参数在推理过程中是固定的。但激活图会因每个输入样本而不同,因此有两种量化激活的方法:动态量化和静态量化。
- **动态量化**:在运行时为每个激活图动态计算裁剪范围。这种方法需要实时计算信号统计信息(如最小值、最大值、百分位数等),开销非常高,但由于为每个输入精确计算了信号范围,通常能获得更高的精度。
- **静态量化**:裁剪范围在推理前预先计算并保持静态。这种方法不会增加计算开销,但
0
0
复制全文
相关推荐










