样本知识蒸馏】(三)ZeroQ: A Novel Zero Shot Quantization Framework"/>
【零样本知识蒸馏】(三)ZeroQ: A Novel Zero Shot Quantization Framework
【零样本知识蒸馏】(三)ZeroQ: A Novel Zero Shot Quantization Framework
- 论文地址:
- 代码地址:
- 主要问题:
- 主要思路:
- 主要贡献:
- 具体实现:
- 基本符号:
- Distilled Data:
- Pareto Frontier:
- 实验结果:
论文地址:
.00281
代码地址:
主要问题:
最近的工作提出了训练后量化,它直接量化NN模型而不需要微调,但是这些方法导致了的性能下降,特别是对于低精度的量化,而且有的训练后的量化方法通常需要有限的(未标记的)数据来帮助训练后的量化
主要思路:
这篇文章提出了ZEROQ,一个新的零样本量化框架来解决这个问题
ZEROQ支持混合精度量化,并通过优化一个蒸馏数据集,无需访问任何训练或验证数据,该数据集被设计为匹配跨网络不同层的批处理标准化的统计数据
同时作者引入了一种新的基于帕累托边界的方法来自动确定所有层的混合精度位设置,而不涉及手动搜索
主要贡献:
- 提出了一个优化公式来生成蒸馏数据,即通过合成数据工程,以匹配批处理归一化层的统计数据,并且这种重建方法的计算开销很小;
- 使用上述重建框架在量化模型和原始模型之间进行灵敏度分析,并且通过实验表明,蒸馏数据与原始训练数据的敏感度相匹配,然后使用蒸馏数据来执行训练后的量化;
- 该框架支持统一精度和混合精度的量化,对于后者,作者提出了一种新的基于帕累托边界( Pareto Frontier)优化的自动精度选择方法,这是通过基于蒸馏数据的计算开销计算量化灵敏度来实现的
具体实现:
基本符号:
对于一个典型的监督计算机视觉任务,我们寻求最小化经验风险损失,即:
min θ L ( θ ) = 1 N ∑ i = 1 N f ( M ( θ ; x i ) , y i ) \min _{\theta} \mathcal{L}(\theta)=\frac{1}{N} \sum_{i=1}^{N} f\left(\mathcal{M}\left(\theta ; x_{i}\right), y_{i}\right) θminL(θ)=N1i=1∑Nf(M(θ;xi),yi)
在这里,我们假设输入数据通过了零均值( μ 0 = 0 \mu_0=0 μ0=0)和单位方差( σ 0 = 1 \sigma_0=1 σ0=1)的标准预处理归一化,并我们假设该模型有 L L L 个 B N BN BN 层,表示为 B N 1 , B N 2 , . . . , B N L BN_1,BN_2,...,BN_L BN1,BN2,...,BNL
我们用 z i z_i zi 表示第 i i i 个 B N BN BN 层之前的激活(即 z i z_i zi 是第 i i i 个卷积层的输出),并且在推理过程中, z i z_i zi 由第 i i i 个 B N BN BN 层中参数的运行均值( μ i \mu_i μi)和方差( σ i 2 \sigma_i^2 σi2)进行归一化
通常, B N BN BN 层还包括缩放和偏差校正,我们分别表示为 γ i \gamma_i γi 和 β i \beta_i βi
我们假设在量化之前,所有的 NN 参数和激活都存储在 32 32 32 位的精度中,并且我们无法访问训练/验证数据集
为了量化一个张量(权值或激活),我们将参数裁剪到 [ a , b ] ( a , b ∈ R ) [a,b](a,b\in\mathbb{R}) [a,b](a,b∈R) 的范围内,并使用不对称量化将参数空间离散到 2 k − 1 2^{k−1} 2k−1 的均匀区间上,区间长度为 Δ = b − a 2 k − 1 \Delta=\frac{b-a}{2^{k}-1} Δ=2k−1b−a
因此,原始的32位单精度值被映射到 [ 0 , 2 k − 1 ] [0,2^{k−1}] [0,2k−1] 范围内的无符号整数
自取的一些工作提出了非均匀的量化方案,可以捕获更精细的权重/激活分布的细节,但是这里我们只使用非对称均匀量化,因为非均匀方法通常不适合有效的硬件执行
ZEROQ框架同时支持固定精度和混合精度的量化,在后一种方案中,不同的模型层可能具有不同的比特精度(不同的 k k k),混合精度量化背后的主要思想是在不增加整体模型尺寸的情况下,保持更高的精度、更敏感的层和更积极的量化
和混合精度量化中每一层的 k k k 的典型选择是 { 2 , 4 , 8 } \{2,4,8\} {2,4,8} 位,但是这种混合精度量化会导致了指数级大的搜索空间,因为每一层都可以有这些位精度设置之一,如果我们能够测量模型对每一层量化的敏感性,就有可能避免这种禁止的搜索空间
对于训练后量化的情况(即不进行微调),一个常用的灵敏度度量是使用原始模型和量化模型之间的 KL 散度,定义为:
Ω i ( k ) = 1 N ∑ j = 1 N d i s t K L ( M ( θ ; x j ) , M ( θ ~ i ( k − b i t ) ; x j ) ) \Omega_{i}(k)=\frac{1}{N} \sum_{j=1}^{N_{d i s t}} \mathrm{KL}\left(\mathcal{M}\left(\theta ; x_{j}\right), \mathcal{M}\left(\tilde{\theta}_{i}(k-b i t) ; x_{j}\right)\right) Ωi(k)=N1j=1∑NdistKL(M(θ;xj),M(θ~i(k−bit);xj))
其中 Ω i ( k ) \Omega_{i}(k) Ωi(k) 用来测量第 i i i 层量化到 k k k 位时的敏感性, θ ~ i ( k − b i t ) \tilde{\theta}_{i}(k-b i t) θ~i(k−bit) 指的是具有 k k k 位精度的第 i i i 层的量化模型参数
如果 Ω i ( k ) \Omega_{i}(k) Ωi(k) 较小,量化模型在量化到 k k k 位时的输出不会明显偏离全精度模型的输出,因此第 i i i 层对 k k k 位量化相对不敏感,反之亦然:
然而,一个重要的问题是,对于零样本量化,我们无法访问原始训练数据集 x j x_j xj
作者提议可以通过分析训练的模型本身,“提取”一个合成的输入数据来解决这个问题,以匹配原始训练数据集的统计数据,并称之为蒸馏数据
Distilled Data:
对于零样本量化,我们无法访问任何训练/验证数据,这带来了两个问题:
- 我们需要知道每层激活值的范围,以便我们可以剪辑量化的范围(上面提到的 [ a , b ] [a,b] [a,b] 范围),而如果不能访问训练数据集,我们就不能确定这个范围;
- 对于混合精度的量化,我们需要计算公式中的 Ω i \Omega_i Ωi,但是我们不能访问训练数据 x j x_j xj;
解决这些问题的一个非常朴素的想法是,创建一个从均值和单位方差为零的高斯分布中提取的随机输入数据,并将其送入模型,但是该方法不能捕获与原始训练数据集对应的激活数据的正确统计数据
如上图所示,作者绘制了用原始训练数据集(黑色表示)和基于高斯的生成数据在 ResNet50 每一层的灵敏度,正如我们所见,高斯数据显然没有捕捉到模型的正确灵敏度,例如,对于前三层,红线的灵敏度顺序实际上与原始训练数据相反
为了解决这个问题,作者提出了一种新的方法来“提取”NN模型本身的输入数据,即根据NN的特性生成合理分布的合成数据,即作者提出了一个蒸馏优化问题,以学习与模型BN层中编码的统计数据最匹配的输入数据分布:
min x r ∑ i = 0 L ∥ μ ~ i r − μ i ∥ 2 2 + ∥ σ ~ i r − σ i ∥ 2 2 \min _{x^{r}} \sum_{i=0}^{L}\left\|\tilde{\mu}_{i}^{r}-\mu_{i}\right\|_{2}^{2}+\left\|\tilde{\sigma}_{i}^{r}-\sigma_{i}\right\|_{2}^{2} xrmini=0∑L∥μ~ir−μi∥22+∥σ~ir−σi∥22
其中 x r x^r xr 是重构的输入数据, μ i r / σ i r \mu^r_i/\sigma^r_i μir/σir 是蒸馏数据在第 i i i 层的分布的平均值/标准差, μ i / σ i \mu_i/\sigma_i μi/σi 是存储在 B N BN BN 层中的相应的平均值/标准偏差参数
换句话说,在解决了这个优化问题后,我们可以提取一个输入数据,当输入到网络时,可以有一个与原始模型非常匹配的统计分布
算法的伪代码如下:
这样我们就可以用生成的蒸馏数据的范围来解决上述问题,并使用蒸馏数据来确定量化灵敏度 Ω i ( k ) \Omega_{i}(k) Ωi(k):
我们可以看到,与使用高斯输入数据(用红色显示)相比,蒸馏数据与模型的灵敏度非常匹配,并且蒸馏数据可以捕获细粒度的局部结构
Pareto Frontier:
如前所述,混合精度量化的主要挑战是确定整个神经网络的精确比特精度配置,对于具有 m m m 个可能的精度选项的 L L L 层模型,混合精度搜索空间表示为 S S S,其指数大小为 m L m^L mL
例如,对于ResNet50,只有 3 3 3 位精度的搜索空间包含 7.2 × 1 0 23 7.2×10^{23} 7.2×1023 种配置,我们可以使用之前提到的灵敏度度量来减少这个搜索空间
主要思想是对更敏感的层使用更高的位精度,对不那么敏感的层使用较低的位精度,这给了我们一个关于比特数的相对排序
同时为了计算精确的比特精度设置,作者提出了一种基于帕累托边界的方法
帕累托边界法的工作原理如下,对于目标量化模型大小 S target S_{\text{target}} Starget,我们测量了 S target S_{\text{target}} Starget 大小下模型的每个比特精度配置的总体灵敏度,并选择对应于最小总体灵敏度的位精度设置,即优化以下问题:
min { k i } i = 1 L Ω s u m = ∑ i = 1 L Ω i ( k i ) s.t. ∑ i = 1 L P i ∗ k i ≤ S target \min _{\left\{k_{i}\right\}_{i=1}^{L}} \Omega_{s u m}=\sum_{i=1}^{L} \Omega_{i}\left(k_{i}\right) \text { s.t. } \sum_{i=1}^{L} P_{i} * k_{i} \leq S_{\text {target }} {ki}i=1LminΩsum=i=1∑LΩi(ki) s.t. i=1∑LPi∗ki≤Starget
其中 k i k_i ki 是第 i i i 层的量化精度, P i P_i Pi 是第 i i i 层的参数大小,注意,这里作者做了一个简化的假设,即不同层的灵敏度与其他层的位选择无关
使用动态规划方法,我们可以解决不同起点的最佳设置,然后我们绘制帕累托边界,如图所示是 ResNet50模型的一个示例,其中x轴是每个位精度配置的模型大小,y轴是整体模型的扰动/灵敏度:
图中的每个蓝点表示一个混合精度的配置,在ZEROQ中,我们选择了具有特定模型大小约束的最小扰动的位精度设置
计算帕累托边界的计算开销是 O ( m L ) \mathcal{O}(mL) O(mL),这是因为我们分别计算每一层和其他层的灵敏度
实验结果:
更多推荐
【零样本知识蒸馏】(三)ZeroQ: A Novel Zero Shot Quantization Framework
发布评论