【论文阅读笔记】ZeroQ: A Novel Zero Shot Quantization Framework

论文地址:ZeroQ
论文地址:https://github.com/amirgholami/ZeroQ

论文总结

  本文的方法是一种后量化方法,是不用finetune的一种方法。本文的量化方式,支持均匀量化和混合精度量化。

  本文的贡献主要有两点:(1)提出了一种方法,从模型的分析中生成更为接近训练数据的数据,用于得到activation的范围和计算每一层的量化损失。(作者称他生成数据的方式,叫做蒸馏,distilled,数据。这样就不需要提供任何有关训练和测试的数据)(2)提出使用Pareto frontier方法去选择目标模型大小的一个混合精度。

  本文的混合精度的选择,是在目标量化模型大小(比如6bit或4bit下对应的模型大小)的限制下,选择每一层量化Bit数。每一层的bit数不一样,有利于去恢复精度。因为不同层对于量化的损失是不一样的。但这种混合精度的方式,能不能真正应用在终端上进行加速,暂时还不了解这种不同layer采用不同Bit数如何进行计算。其目标是目标量化bit对应的模型大小下的混合bit模型的最优精度模型。

  另外,论文中介绍的,应用的时候,其认为不同层的量化bit数不相互打扰,是相互独立的。这是一种假设的理想状态。

  其实验结果,比当前最好的后量化方法DFQ要好一些。

论文介绍

  作者认为,量化后训练浪费时间和计算资源,这对于一些在线学习的算法是行不通的。还有一些隐私和安全问题导致的训练模型的数据不可获得。这是作者提出依据模型属性生成数据集,并决定使用后量化(不用finetune)方法作为量化手段的原因。
  本文提出的蒸馏数据的方式,是通过优化一个公式生成的,整个生成过程耗时短,生成数据分布于模型训练的数据分布更为接近(相比较随机生成的高斯分布数据。这个高斯分布是作者假定输入数据都经过处理变成均值0方差1的分布)。

量化细节介绍

  作者想要混合精度量化的前提是,其认为同时量化所有层到低bit会导致巨大的精度下降。同时,不是所有层对量化的敏感度是一样的。

  对于后量化算法,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)=\frac1N\sum_{j=1}^{N_{dist}}KL(M(\theta;x_j),M(\tilde{\theta_i}(k-bit);x_j)) Ωi(k)=N1j=1NdistKL(M(θ;xj),M(θi~(kbit);xj))其中, i i i 指的是第 i i i层算子,量化到 k k k-bit, θ i ~ ( k − b i t ) \tilde{\theta_i}(k-bit) θi~(kbit)指的是第 i i i层的模型参数量化到 k k k-bit。这个量化指标 Ω i ( k ) \Omega_i(k) Ωi(k)是对每一层单独量化看最后的KL散度的,如果KL散度值越小,则量化的损失越小,即第 i i i层的模型参数对量化到 k k k-bit不敏感。整个模型的量化损失,是通过叠加每层的量化KL散度值得到的。下图展示了量化过程:

生成蒸馏数据介绍

  如果没有输入数据,则不能获得量化所需要的activation范围,则不能去截断和映射。同时,也需要输入数据去计算每一层的量化KL散度。非常朴素的方法去构造随机高斯数据(均值0,方差1),这是作者假定每个输入都经过预处理会变成的分布。但这种方法不能得到原始训练数据集的activation正确统计值,如下图所示。下图展示了不同输入下的敏感值,可以看出,随机高斯数据不能捕捉到模型正确的敏感值,而蒸馏数据更贴近训练数据与模型的贴合。

  优化合成数据问题的公式如下: min ⁡ x r ∑ i = 0 L ∥ μ ~ i r − μ i ∥ 2 2 + ∥ σ ~ i r − σ i ∥ 2 2 \mathop{\min}\limits_{x_r}\sum_{i=0}^L\|\tilde\mu_i^r -\mu_i \|_2^2+\|\tilde\sigma_i^r-\sigma_i\|_2^2 xrmini=0Lμ~irμi22+σ~irσi22其中 x r x^r xr是重构(蒸馏)输入数据, μ r \mu_r μr σ r \sigma^r σr是重构数据的均值和标准差,而 μ \mu μ σ \sigma σ是存储在模型中BN层的值。解决这个优化问题后,可得到与原始模型相匹配的统计分布。算法流程如下面所示:

  对比蒸馏数据和随机高斯分布数据,如下图所示,蒸馏数据更能捕捉小的局部结构。

  混合精度的一个主要挑战是决定整个网络的精确bit数。如果一个模型一共有 L L L层,每一层的量化目标有m个精度(2,4,8-bit),则整个搜索空间为 m L m^L mL。但是我们可以用下面的公式来减少搜索空间。 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 t a r g e t \min\limits_{\{k_i\}^L_{i=1}}\Omega_{sum}=\sum_{i=1}^L\Omega_i(k_i)\ \ s.t.\ \sum_{i=1}^LP_i*k_i\leq S_{target} { ki}i=1LminΩsum=i=1LΩi(ki)  s.t. i=1LPikiStarget这表示着整个模型的敏感程度,为每一层量化后的敏感度的和。其中, k i k_i ki是第 i i i层量化到 k k k-bit数, P i P_i Pi是第 i i i层的参数量, S t a r g e t S_{target} Starget是目标的量化模型大小,比如4-bits对应的模型大小。

  使用动态规划方法可以求解不同条件下的最佳配置。下图展示了使用Pareto frontier求解不同模型大小配置下的解。其中x轴是模型大小,对于每层不同bit数,都有不一样的模型大小。y轴是敏感值。每个蓝点是一个精度配置(每一层不同bit数的配置),红色和橙色是 4-bit 和 6-bit 混合精度配置的两个例子。用Pareto frontier方法去选择一个bit配置,其结果是最小扰动。尽管Pareto frontier不能保证得到最优解,但仍然得到了当前最先进的精度。

实验结果

  下面是与其他后量化方法的对比。其中,MP是混合精度,No D是没有使用数据(训练和测试数据),No FT是没有经过finetune。OCS,OMSE和DFQ都是后量化方法。

  下表是目标检测的量化效果,对象是RetinaNet。

  均匀后量化的实验对比,在ImageNet数据集,对象是ResNet18。

  随机高斯数据和蒸馏数据的实验对比:

  在W4A8,ResNet50,top-20的精度配置的实验对比:

猜你喜欢

转载自blog.csdn.net/qq_19784349/article/details/111005639