学习对称形式的量化(Learning Symmetric Quantization)

"SYQ: Learning Symmetric Quantization For Efficient Deep Neural Networks"这篇文章提出了基于梯度的对称量化(SYQ: Learning Symmetric Quantization)方法,可以设计高效率的二值化或三值化深度网络(1-bit或2-bit权重量化),并在pixel-wise、row-wise或者layer-wise定义不同粒度的缩放因子(scaling factor)用来估计网络参数。每一层的激活输出则采用线性量化表示为2-8bits定点数值。


量化是一种行之有效的模型压缩方法。如上图所示,权重与激活量化可有效降低网络计算的复杂度(MAC操作数)、并减少硬件实现(以FPGA实现为例)的资源消耗,包括DSP计算资源与存储开销等。尤其是在W1A2量化时,点积运算简化为比特操作,计算开销基本可忽略。否则若涉及乘法操作,计算资源开销基本上与乘法器尺寸的二次方成比例。

权重量化操作将网络层的权重(通常为FP32类型)映射到一个有限精度(1-2bits、int8等)取值的离散数值集合(code-book)上。文章采用二值化或三值化方法用来量化网络权重,并采用STE法直接近似求导:


权重量化之后,通过寻找一个合适的缩放因子(scaling factor),能够进一步降低量化带来的精度损失。通过最小化损失函数可以寻求最优缩放因子


将权重分组、分开量化,能够增强量化后模型的表示能力。文章采用对角矩阵描述pixel-wise、row-wise或者layer-wise的数值缩放操作,有助于权重分组、并控制量化粒度:



针对卷积层,先将权重在pixel-wise或者row-wise进行分组,然后通过对角矩阵执行缩放:

由于FC层对量化操作具有较强的鲁棒性,因此FC层在layer-wise进行缩放,只需保存一个可训练的缩放因子。


针对卷积层(K x K x I x N),上图表示采用不同的分组方式,即在pixel-wise(左边)或row-wise(右边)构建权重量化的缩放操作时,所涉及的code-book及其索引方式。

文章接下来阐述了对称形式的量化学习方法,首先定义了对称量化器具备的特点:


则卷积层的每个权重分组,可按下式计算缩放因子的梯度,进而更新缩放因子:



采用对称分布的code-book,能够提供有序的索引方式、规整的计算形式,有利于降低计算复杂度、减少存储开销,且细粒度的权重量化与缩放能够有效降低STE求导带来的梯度失配。

卷积层每个分组缩放因子的初始化值表示为该组权重绝对值之和的均值:


每一层的激活输出(activation)采用线性均匀方式予以量化,并采用STE方法近似求解导数:


结合权重(binary或ternary方式)、激活(2-8bits线性方式)的量化、缩放因子的构造(分组形式的对角矩阵)、以及求导公式(STE求导),SYQ(Symmetric Quantization)训练如下:


实验部分在ImageNet 2012数据集(1.28M训练图片,50K验证图片)上做了测试,对比了不同量化粒度、量化比特数的实验结果,并与其他量化方法做了比较。Resnet50采用W2-A8量化时,Top-1精度损失为4.8%(相比于baseline)。具体结论与结果见论文。

文章最后探讨了基于SYQ量化(可简化点积运算形式)的网络层硬件实现架构(Architecture),并在Xilinx FPGA上评估了资源消耗(LUT、DSP、BRAM)。如下图所示,PE(Processing Element)首先执行不同分组内输入与权重的乘累加操作(MAC),然后将加法器树输出乘以相应的scaling factor,进而将不同分组的scaling输出累加在一起输入到激活单元:


论文地址:http://phwl.org/papers/syq_cvpr18.pdf

GitHub:https://github.com/julianfaraone/SYQ


猜你喜欢

转载自blog.csdn.net/nature553863/article/details/80476751