现在“边缘计算”越来越重要,真正能落地的算法才是有竞争力的算法。随着卷积神经网络模型堆叠的层数越来越多,网络模型的权重参数数量也随之增长,专用硬件平台可以很好的解决计算与存储的双重需求,但目前还不成熟,存在些亟待解决的问题,没能大规模商用。对模型进行参数量化的主要目的是减小模型存储体积,加速运算,能够将算法应用在通用的嵌入式移动平台。陆陆续续阅读了关于模型量化的论文,通过这篇博客做一个小结吧,欢迎交流讨论。

      模型量化目前主要有两个究方向,一个研究方向是权值共享,基本思想是多个网络连接的权重共用一个权值,还有一个是权值精简,既权值的低比特表示。

1、权值共享

       主要代表性研究工作如下:

1.1 聚类方式共享

       文献【1】是深鉴科技的韩松大佬写的,论文质量非常高,是ICLR2016的best
paper,有幸使用过他们公司的定点工具,虽然精度有一定损失,但还是可以接受的。论文对每一层weight矩阵利用K-means聚类算法聚类成若干个cluster,用每个cluster的聚类中心值代表该cluster的权重,由于同一cluster的weight共享一个权重大小,因此我们只需要存储权值的cluster的index即可,通过查表获取该index对应的value,为了减少精度损失,再通过训练微调的方式对权重进行补偿,所有的梯度信息按照权重矩阵之前的分组进行。下图很形象的说明了聚类量化与训练过程



   
 文献【2】提出一个量化神经网络架构(Q-CNN),基于k-means聚类算法加速和压缩模型的卷积层和全连接层,通过减小每层输出响应的估计误差可实现更好的量化结果,并提出一种有效的训练方案抑制量化后的多层累积误差 。

1.2 哈希方式共享

      文献【3】设 计 了 一 种新型网络架构hashnet,利用哈希函数随机将网络连接权重分组到哈希桶(hash
bucket),每个哈希桶内的网络连接共享相同的权重参数,该方法与特征哈希类似(feature
hashing),将高维数据降到低维空间,该方法可显著减小模型体积,并对输出精度影响较小。

2、权值精简

       
我们知道,现在神经网络的weight和bias都是用单精度4字节的float32或者双精度8字节的float64的表示,为了降低模型的存储空间而达到模型压缩加速的目的,越来越多的学者企图通过更少的bit位来表示模型实际的浮点型权值。

       
这种权值精简的方法之所以有效,从广义上讲,有两个原因:首先DNN经过训练后,对噪声和较小的扰动是非常鲁棒的,这就意味着,即使我们巧妙的将数据四舍五入,仍然可以得出一个相当准确的结果(手动滑稽.jpg);其次,我们将训练好模型的权重和激活进行可视化会发现,每层权重和激活通常处于较小的范围内,这样我们可以将较小的bit集中在较小的范围内,当然准确了解这个范围是至关重要的。

       这方面又可以分为定点和动态定点两个小方向

2.1定点:

         文献【4】发表于2011年,主要介绍了在X86
CPU下大大降低计算成本的一些技术,其中提到了8位定点化技术,应该是最早一篇介绍8位定点论文了。论文采用线性定点化的方法,将激活值定点化位unsigned
char,权值定点化位signed char,将bias定点化位32bit
int,输入层仍然采用浮点数(这个应该跟他做的是语音识别实验有关),实验结果表明8bit定点化在模型精度不受什么影响的前提下大幅度提升速度(2.5x)

       
 文献【5】开发并测试8-bit近似算法,将32bit的梯度和激活值压缩到8-bit,这里的8bit用来表示浮点数,并通过动态确定指数位和小数位的范围来减少误差,利用GPU集群测试模型和数据的并行化性能,在保证模型预测精度的条件下,提出的方法取得2x的数据传输加速

         文献【6】表明,使用随机取整(stochastic rounding)时,仅
16位定点表示法,可以显著降低内存和浮点运算,而在分类精度方面几乎不会降低。具体做法是首先正常训练神经网络模型(按
float32全精度),接下来,我们使用16位定点计算对网络进行retrain。不过该论文没有开源代码,且该论文验证性能的硬件平台是FPGA,并为矩阵乘法设计了一个高吞吐、高性能的体系结构,并不适用于通用的ARM
CPU,不过这种随机取整的方法或许值得借鉴:

     
文献【7】是今年CVPR谷歌推出的量化论文,受文献【4】和文献【6】的启发。提出了仅整数算术推理的量化方法,将weights和input量化位uint8,bias量化位unit32,并将unit32的accumulators量化位unit8,与文献【4】不同,这里采用的不是线性量化方法,而是非线性量化,通过缩放系数S(scale)和零点Z(zero-point)确定实际值r对应的量化值q,即  
,权重和输入的S和Z根据每一层的权值范围确定:scale = (max - min) / (qmax - qmin),zero_point = qmin –
min /
scale,偏置的S=S1*S2(S1、S2分别为权值和输入的scale),Z=0。同时作者协同设计了一个模拟量化训练框架来保证端到端的精度。训练期间,反向和普通一样,用浮点数保存权值和偏置,前向的时候采用伪量化,反向的误差修正不量化,且BN层融入了conv层一起做量化,节省了单独做BN的计算,如下图所示





作者还提出模型量化时,用ReLU6代替ReLU,可以增加精度。

   
说句题外话,目前成熟的量化方案都是8bit量化,主要是NVIDIA的tensorRT方案,直接量化,无需训练;还有就是google的那套方案,也就是是文献[7]中提到的,需要retain,比NVIDIA的那套麻烦点。不过精度有保障。NVIDIA的那套量化方案下载地址如下
http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf

<http://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf>

 

      文献【8】提出一种模型近似框架
ristretto,用于分析模型卷积层和全连接层的权重和输出的数值分辨率,进而将浮点型参数转化为定点型数值,并通过训练过程对定点型模型进行微调,在容许误差为1%的条件下,将
caffenet和 squeezenet压缩到8-bit参数形式

      除了把参数量化为8或者16bit,也有一些论文将其量化为2的幂次,有利于在硬件上通过通过位移操作表示乘法过程

      文献【9】提出渐进式网络量化(Incremental Network Quantization,INQ)无损低比特权重量化技术(5
bit),可将浮点型深度神经网络模型转化为无损的低比特二进制化数据模型,在硬件通过移位计算实现乘法过程,有利于在移动平台的部署和加速,该方法首先将模型的每一层参数按照其绝对值分为两组,将权重值较大一组的参数量化后保持固定,另外一组参数通过再训练过程进行调整,以补偿参数量化所造成的精度损失,重复该过程直到权重全部量化完毕。

     文献【10】也是采用移位和加法来实现乘法,从而减少计算量。比如计算 y=wx, 而 ww 通过量化已经被我们表示成了类似于 这种形式,于是 

     除了将参数量化为8bit 16bit或者2的幂次,现在学术界把更多精力放在2值
3值或者XNOR经网络这种极限的bit压缩上。中且这方面的论文解读比较多,再这里就不多说了。这种方法往往精度损失比较大实用性不强,虽然乘法变为了位操作,理论上速度提升很大,但在ARM上实际并没有,应该是需要专门的硬件平台(fpga)支持才行,而且ARM对乘法操作做了优化,速度其实也很快,另外,在ARM上现在也没有很好用的2值库,这些都限制了2值网络在ARM上的应用

       
但是 ,文献【11】(Face++提出的 DoReFa-Net)利用低比特的梯度参数训练低比特的模型权重,且激活值也为低比特数据,该技术可对训练和预测过程进行加速,并可有效地应用到CPU,FPGA,ASIC和
GPU等硬件。DoReLa-Net 的贡献在于提供了不同量化因子的实验结果,即 2,4,8,16,32 bit
的权重、激活函数量化,同时在后向反馈中也实现了梯度的量化


2.2动态定点:

     卷积神经网络中,网络各层数值动态范围存在差异,例如在普遍采用 ReLu作为激活函数的网络模型中,当该神经元输出大于 0
时,该值等于上层的输出与权重的点积,其输出数据范围远大于当前层权重。定点表示的数值范围有限,因此采用动态定点(Dynamic fixed
point)来表示网络的权重和激活函数,具体可见文献【12】【13】

先简单说一下,以后有时间在慢慢补充完善,欢迎交流讨论

--------------------------------------------------------------------------------------------------------------------

参考文献

[1]Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks
with pruning, trained quantization and huffman coding[J]. arXiv preprint
arXiv:1510.00149, 2015.

[2]Wu J, Cong L, Wang Y, et al. Quantized Convolutional Neural Networks for
Mobile Devices[C]// IEEE Conference on Computer Vision and Pattern Recognition.
IEEE Computer Society, 2016:4820-4828.

[3]Chen W, Wilson J, Tyree S, et al. Compressing neural networks with the
hashing trick[C]//International Conference on Machine Learning. 2015: 2285-2294.

[4]Vanhoucke V, Senior A, Mao M Z. Improving the speed of neural networks on
CPUs[J]. in Deep Learning and Unsupervised Feature Learning Workshop, NIPS,
2011.

[5]Dettmers T. 8-bit approximations for parallelism in deep learning[J]. arXiv
preprint arXiv:1511.04561, 2015.

[6]Gupta S, Agrawal A, Gopalakrishnan K, et al. Deep learning with limited
numerical precision[C]//International Conference on Machine Learning. 2015:
1737-1746.

[7]Jacob B, Kligys S, Chen B, et al. Quantization and training of neural
networks for efficient integer-arithmetic-only inference[J]. arXiv preprint
arXiv:1712.05877, 2017.

[8]Gysel P, Motamedi M, Ghiasi S. Hardware-oriented approximation of
convolutional neural networks[J]. arXiv preprint arXiv:1604.03168, 2016.

[9]Zhou A, Yao A, Guo Y, et al. Incremental Network Quantization: Towards
Lossless CNNs with Low-Precision Weights[J]. 2017.

[10]Gudovskiy D A, Rigazio L. ShiftCNN: Generalized Low-Precision Architecture
for Inference of Convolutional Neural Networks[J]. arXiv preprint
arXiv:1706.02393, 2017.

[11]Zhou S, Wu Y, Ni Z, et al. DoReFa-Net: Training Low Bitwidth Convolutional
Neural Networks with Low Bitwidth Gradients[J]. 2016.

[12]Courbariaux M, Bengio Y, David J P. Training deep neural networks with low
precision multiplications[J]. Computer Science, 2014.

[13]Williamson D. Dynamically scaled fixed point arithmetic[C]//
Communications, Computers and Signal Processing, 1991. IEEE Pacific Rim
Conference on. IEEE, 1991:315-318 vol.1.

 

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信