INQ渐进量化方法详解

144 篇文章 70 订阅

作者‖ Cocoon
编辑‖ 3D视觉开发者社区
✨如果觉得文章内容不错,别忘了三连支持下哦😘~

导语:

本文由英特尔中国提出,发表于ICLR 2017,本文提出了一种渐进式量化的方法——INQ (被引:797),通过先分组量化,冻结已量化的部分并训练未量化的部分,重复上述步骤直到所有权重都完成量化。这种方法可以把一个预训练的全精度模型近乎无损地压缩成一个低精度的模型,在Alexnet,VGG,ResNet等模型上都表现良好,精确度有较大提升。

在这里插入图片描述
论文链接:https://arxiv.org/pdf/1702.03044v2.pdf
代码链接:https://github.com/Zhouaojun/IncrementalNetwork-Quantization

概述

该方法发表于ICLR 2017,由英特尔中国提出,目的是希望能够无损地用低位宽的权重表达神经网络,是量化领域中的经典论文之一。具体地,文章提出了一种渐进量化方式,其主要包含三个相互依赖的操作:权重划分、分组量化与重训练。即,首先通过某种分组规则将权重分为两个互不相干的组,然后对其中一组进行量化,而后将其冻结,再对另外一组以渐进迭代的方式进行重训练,目的是补偿第一组的量化损失。其中,渐进迭代的终止条件是所有的权值都被量化完毕。

下文将对权值量化的方式、渐进量化的策略以及整体的算法步骤进行介绍,并在实验部分贴出INQ相比起其他SOTA的对比效果及部分消融实验结果。

渐进量化

变长编码的权重量化(variable-length encoding scheme)

命名

假设预训练的全精度的模型为 { W l : 1 ≤ l ≤ L } \{W_l: 1 \leq l \leq L\} {Wl:1lL},其中 W l W_l Wl表示第 l l l层的权重, L L L表示在模型中要学习参数的层数。为了对接下来的表达进行简化,我们只考虑对卷积层和全连接层进行量化。举个例子,就像 A l e x N e t AlexNet AlexNet V G G − 16 VGG-16 VGG16 G o o g l e N e t GoogleNet GoogleNet以及 R e s N e t s ResNets ResNets之类的网络而言,对应于其中的卷积层, W l W_l Wl可以是4D的tensor,对应于其中的全连接层, W l W_l Wl可以是2D的矩阵。

设低比特版本的权重为 W l ^ \hat{W_l} Wl^,且其中的每一个元素只能从以下的集合中选取:
P l = { ± 2 n 1 , ⋯   , ± 2 n 2 , 0 } \mathbf{P}_{l}=\left\{\pm 2^{n_{1}}, \cdots, \pm 2^{n_{2}}, 0\right\} Pl={±2n1,,±2n2,0} (1)
其中 n 1 n1 n1 n 2 n2 n2是两个整数,且 n 2 ≤ n 1 n2 \leq n1 n2n1

也就是说,量化后的权重数值范围由 n 2 n2 n2 n 1 n1 n1决定,在一定范围以外的数值会被直接怼成0。
任务描述

给定一个预训练的全精度模型,INQ的目的是在尽可能不损失精度的前提下,将该32位的浮点型权重变换到2的整数幂或0上。

此外,还希望能够探索在网络无损量化限定下能支持的最极端的小位宽是多少。

怎么做?

在INQ中,期待的位宽 b b b需要我们预先确定好,然后我们只要确定好超参 n 1 n1 n1就可以了,因为 n 2 n2 n2可以根据位宽 b b b以及超参 n 1 n1 n1推断而得。

n 1 n1 n1的计算方式为一个经验上有点复杂又实践证明有用的公式:
n 1 =  floor  ( log ⁡ 2 ( 4 s / 3 ) ) n_{1}=\text { floor }\left(\log _{2}(4 s / 3)\right) n1= floor (log2(4s/3))(2)
其中, s s s的计算方式为:
s = max ⁡ ( abs ⁡ ( W l ) ) s=\max \left(\operatorname{abs}\left(\mathbf{W}_{l}\right)\right) s=max(abs(Wl))(3)
其中, s s s的计算方式为:
s = max ⁡ ( abs ⁡ ( W l ) ) s=\max \left(\operatorname{abs}\left(\mathbf{W}_{l}\right)\right) s=max(abs(Wl))(4)
再其中, a b s abs abs为逐元素的操作。

n 1 n1 n1获得后, n 2 n2 n2可以自然而然的通过 n 2 = n 1 + 1 − 2 b − 1 2 n2 = n1+1-\frac{2^{b-1}}{2} n2=n1+122b1而得,举个例子,当 b = 3 b=3 b=3 n 1 = − 1 n1=-1 n1=1时, n 2 = − 2 n2=-2 n2=2

当侯选池 P l P_l Pl确定后,我们进一步地通过下式将 W l W_l Wl中的每一个元素变换成低比特的量化值:

W ^ l ( i , j ) = { β sgn ⁡ ( W l ( i , j ) )  if  ( α + β ) / 2 ≤ abs ⁡ ( W l ( i , j ) ) < 3 β / 2 0  otherwise  \widehat{\mathbf{W}}_{l}(i, j)= \begin{cases}\beta \operatorname{sgn}\left(\mathbf{W}_{l}(i, j)\right) & \text { if }(\alpha+\beta) / 2 \leq \operatorname{abs}\left(\mathbf{W}_{l}(i, j)\right)<3 \beta / 2 \\ 0 & \text { otherwise }\end{cases} W l(i,j)={βsgn(Wl(i,j))0 if (α+β)/2abs(Wl(i,j))<3β/2 otherwise 
其中, α \alpha α β \beta β是在侯选池 P l P_l Pl中相邻的两个元素,进而迫使量化后的权重都能够是侯选池中的元素。这里有一个小细节,即在公式(2)中的系数 4 / 3 4/3 4/3的设定与公式(4)是强呼应的。

假设我们希望模型量化位数 b b b是5,由于0不能够用2的整数次幂来表达,因此我们额外给出一个比特来表示0值,剩下的4个比特则用来表达最多16个2的整数次幂数。换句话说,候选的量化值的个数最多只有 2 b − 1 + 1 2^{b-1}+1 2b1+1个,这也对应点了该小节的“变长(variable-length )”的题。

显然,上述的量化方式是线性的,另一种可以选择的替代方案是“对数”的,尽管这种替代方案很可能也是有效的,但是在实现上以及计算开销上都有着更大的困难。

渐进量化策略

假设:

尽管我们可以直接使用上述的量化方式直接对全精度的模型进行量化,但是不可避免的,会遭遇很大的精度损失。

在当时已有的量化工作中,比如说HashedNet(Chen 等, 2015),BinaryConnect(Courbariaux等,2015)等,其实大家都会面临着掉点的问题,在大型的数据面前,掉点问题会显得更加突出。然而,发现已有的量化工作有一个共性,就是在量化的过程中都采用了全局的策略,即所有的权重参数同时地转换为低比特位的量化参数。而INQ认为,这种全局策略是导致精度损失的原因之一。此外,当量化比特位越低时,精度损失的越厉害。

INQ受当时的某些剪枝工作的启发,即在剪枝中,移除某些不那么重要的神经网络中的层所带来的精度损失往往可以通过后续的训练弥补回来,因此,INQ做出了这样的推测:改变网络权重的重要性是获得无损量化的关键。

策略:

在上述假设的基础上,INQ提出了三个互相依赖的操作:权重划分、逐组的量化、重训练

权重划分将全精度的CNN中的每一层的权重划分为两个互不相关的组,这两个组主要起着互补的作用。在第一组的权重主要用于构成全精度网络的低比特版本,因此其中的权重直接使用公式(4)进行量化,而第二组的权重,则用于补偿模型精度的损失,因此他们需要被重训练。

一旦第一次量化和重训练的操作结束后,这三个操作将在第二组权重中以一种迭代的方式进行,迭代结束的条件是所有的权重都被量化完毕,这个过程就是所谓的渐进的网络量化和精度逐步提升的过程。这个过程的好处就是,低比特量化的精度损失可以被渐进策略很好的弥补。

INQ迭代的过程如Fig 2所示:
在这里插入图片描述在Fig 2中,第一行表示在提出的三个操作中的第一次迭代,最左上角的cube表示权重划分操作,该操作产生了两个互不相关的组,中间的影像则表示对第一组权重的量化操作(绿色表示),第一行最右边表示对第二组的权重(浅蓝色表示)进行重训练。第二行表示了INQ中第二次、第三次、第四次的迭代。在这样的过程中,慢慢地量化参数的比例为50% - 75% - 87.5% - 100%。

对于第 l l l层来说,权重划分可以被表达为:
A l ( 1 ) ∪ A l ( 2 ) = { W l ( i , j ) } ,  and  A l ( 1 ) ∩ A l ( 2 ) = ∅ \mathbf{A}_{l}^{(1)} \cup \mathbf{A}_{l}^{(2)}=\left\{\mathbf{W}_{l}(i, j)\right\}, \text { and } \mathbf{A}_{l}^{(1)} \cap \mathbf{A}_{l}^{(2)}=\emptyset Al(1)Al(2)={Wl(i,j)}, and Al(1)Al(2)=
其中, A l ( 1 ) A_l^{(1)} Al(1)表示需要被量化的第一组权重参数, A l ( 2 ) A_l^{(2)} Al(2)则表示需要被重训练的第二组参数。具体分组的准则留到实验部分进行进一步地描述。

在这里,定义了一个二值的矩阵 T l T_l Tl来辅助辨别上述的两类权重。即, T i ( i , j ) = 0 T_i(i,j)=0 Ti(i,j)=0表示 W l ( i , j ) ∈ A l ( 1 ) W_l(i,j) \in A_l^{(1)} Wl(i,j)Al(1),而 T l ( i , j ) = 1 T_l(i,j)=1 Tl(i,j)=1则表示 W l ( i , j ) ∈ A l ( 2 ) W_l(i,j) \in A_l^{(2)} Wl(i,j)Al(2)

渐进网络量化算法

这一小节主要来介绍训练方法。

仍然以第 l l l层为例,量化的优化问题可以表示为:
min ⁡ W l E ( W l ) = L ( W l ) + λ R ( W l )  s.t.  W l ( i , j ) ∈ P l , 1 ≤ l ≤ L , \begin{array}{ll} \min _{\mathbf{W}_{l}} & E\left(\mathbf{W}_{l}\right)=L\left(\mathbf{W}_{l}\right)+\lambda R\left(\mathbf{W}_{l}\right) \\ \text { s.t. } & \mathbf{W}_{l}(i, j) \in \mathbf{P}_{l}, 1 \leq l \leq L, \end{array} minWl s.t. E(Wl)=L(Wl)+λR(Wl)Wl(i,j)Pl,1lL,
其中, L ( W l ) L(W_l) L(Wl)表示网络损失, R ( W l ) R(W_l) R(Wl)为正则项, λ \lambda λ为正系数,且所有的权重只能从侯选池中选取。直接对这样的优化式进行求解是有挑战的,很容易会遇到不收敛的问题。

而前面我们提到过所谓的权重划分以及逐组量化,这两个操作可以使得公式(6)进一步变化到以下形式:
min ⁡ W l E ( W l ) = L ( W l ) + λ R ( W l )  s.t.  W l ( i , j ) ∈ P l ,  if  T l ( i , j ) = 0 , 1 ≤ l ≤ L , \begin{array}{ll} \min _{\mathbf{W}_{l}} & E\left(\mathbf{W}_{l}\right)=L\left(\mathbf{W}_{l}\right)+\lambda R\left(\mathbf{W}_{l}\right) \\ \text { s.t. } & \mathbf{W}_{l}(i, j) \in \mathbf{P}_{l}, \text { if } \mathbf{T}_{l}(i, j)=0,1 \leq l \leq L, \end{array} minWl s.t. E(Wl)=L(Wl)+λR(Wl)Wl(i,j)Pl, if Tl(i,j)=0,1lL,
由于 P l P_l Pl T l T_l Tl是已知的,所以该优化式而已直接使用 S G D SGD SGD等优化算法进行求解。换句话说,重训练过程中的权重更新方式为:
W l ( i , j ) ← W l ( i , j ) − γ ∂ E ∂ ( W l ( i , j ) ) T l ( i , j ) \mathbf{W}_{l}(i, j) \leftarrow \mathbf{W}_{l}(i, j)-\gamma \frac{\partial E}{\partial\left(\mathbf{W}_{l}(i, j)\right)} \mathbf{T}_{l}(i, j) Wl(i,j)Wl(i,j)γ(Wl(i,j))ETl(i,j)
其中 λ \lambda λ表示正学习率。注意到二值矩阵 T l T_l Tl的存在会使得只有浮点数才会更新,这类似于某些剪枝方法中只有当前还没有被移除掉的层才会被重训练一样。

INQ的所有流程描述在以下算法中:
在这里插入图片描述

实验

ImageNet 上的结果

下表为将全精度不同的CNN模型通过INQ的方式转换为5比特模型时的掉点情况:
在这里插入图片描述

权重分组策略

权值分组将直接影响到后续的分组量化和重训练操作。分组的候选策略有两种,一种受剪枝算法的启发,认为绝对值较大的权重相对来说更为重要,再一种则是随机划分。

本节对ResNet进行量化,下表总结了INQ使用不同分组策略时5位量化的对比结果,显然,使用由剪枝算法启发的分组策略效果相对于随机划分要好:
在这里插入图片描述
也因此,文章采用了“Pruning-inspired”,即由剪枝算法启发的权值分组策略。

不过,文章也指出如何划分权重可以作为后续值得探索的问题之一。

期望位宽与模型精度之间的trade-off

与章节中3.2的实验设定一样,本节逐渐的减少量化位数(对应地增加迭代次数),观察无损量化的位宽极限。

具体地,有:
在这里插入图片描述
实验结果为:
在这里插入图片描述
尽管看起来量化到2比特的时候,掉点比较厉害,但是相对于当时的SOTA来说,已经有所提升,具体对比结果见下表:
在这里插入图片描述

低比特压缩

在模型压缩角度上,实验与其他模型压缩的方式进行了对比实验,实验表明INQ在5位或4位的量化上几乎没有损失,且相比起其他压缩的方式,比如说剪枝(Han等, 2015)、矢量量化(vector quantization)(Gong等, 2014)、深度压缩(Han等, 2016)等,INQ的最终权值是2的整数次幂或0,其显著优势在于可以用于FPGA等硬件上。

具体的实验结果见下表:
在这里插入图片描述

结论

本文对经典量化方法之一:渐进量化,进行了介绍。该方法依赖三个核心操作:权重分组、分组量化、重训练,对全精度的神经网络模型进行预设位宽的量化。该方法相比起之前的量化方法最大的不同在于并非将所有权重同时进行量化,而是采用了渐进的策略,逐渐地对模型进行量化,与其他SOTA的对比实验结果表现了该策略的优越性。特别地,文章还在实验部分探索了无损量化的极限位宽,结果表明,尽管在两比特(3值)量化的掉点比较严重,却还是相对于当时其他的SOTA要好一些。

参考文献

  1. Matthieu Courbariaux, Bengio Yoshua, and David Jean-Pierre. Binaryconnect: Training deep neural networks with binary weights during propagations. In NIPS, 2015.
  2. Song Han, Jeff Pool, John Tran, and William J. Dally. Learning both weights and connections for efficient neural networks. In NIPS, 2015.
  3. Song Han, Jeff Pool, John Tran, and William J. Dally. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding. In ICLR, 2016.
  4. Wenlin Chen, James T. Wilson, Stephen Tyree, Kilian Q. Weinberger, and Yixin Chen. Compressing neural networks with the hashing trick. In ICML, 2015.
  5. Yunchao Gong, Liu Liu, Ming Yang, and Lubomir Bourdev. Compressing deep concolutional networks using vector quantization. arXiv preprint arXiv:1412.6115v1, 2014.

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~

也可移步微信关注官方公众号 3D视觉开发者社区 ,获取更多干货知识哦。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值