神经网络压缩(8)Incremental Network Quantization: Towards Lossless CNNs with Low-precision Weights

转自:https://blog.csdn.net/cookie_234/article/details/75386737

Incremental Network Quantization: Towards Lossless CNNs with Low-precision Weights
Intro
英特尔中国研究院:INQ神经网络无损低比特量化技术 
给定任意结构的全精度浮点神经网络模型,能将其转换成无损的低比特二进制模型; 
文章分析现有的量化压缩方法有两点不足:1.量化过程中的精度损失仍然不可忽视;2.大多数量化压缩方法只适用于处理特定的模型结构和特定类型的层,一定程度限制了泛化能力和量化压缩的性能(这里指的是很多方法对fc层的压缩比较有效,最终得到的比较大的压缩率很大一部分贡献是fc);另外还有重训练时间长等问题;

Method
提出了渐进式神经网络量化的思想,引入了三种操作:参数分组,量化,重训练。
简单的说就是在训练得到一个网络模型后,首先将这个全精度浮点网络模型中的每一层参数分为两组,第一组中的参数直接被量化固定,另一组参数通过重训练来补偿量化给模型造成的精度损失。然后这三个操作依次迭代应用到刚才的第二组完成重训练之后的全精度浮点参数部分,直到模型全部量化为止。 
可以说参数分组分成的这两个部分是互补的作用,一个建立低精度模型的基础,另一个通过retrain补偿精度损失;这样迭代最终得到渐进式的量化和精度提升。 
 
图中,绿线代表当前已经被量化的网络连接,蓝线代表需要重新训练的网络连接。

Weight partition
分组的方式文中讨论了两种:random strategy 和 pruning-inspired strategy。 
random strategy:随机的把权值分成两个不重叠的部分,相当于是按相等的概率对待每一个值,有同等的概率被分到两组中;
pruning-inspired strategy:基于prune的策略是:逐层确定每层自己的thresholds(一般是given splitting ratio),取weights的绝对值和thresholds比较,最后分成两个不重叠的组。 
给出了两种分组方法的一个比较,毫无疑问选取了基于prune的策略。 
 
分成的两部分肯定一组值大一点一组值小一点,那么该选取哪部分先做quant呢?文中说取大的部分去做quant,大的这部分被认为是low-precision base: 
the weights with larger absolute values are more important than the smaller ones to form a low-precision base for the original CNN model.
Group-wise quantization
量化的目的是给定一个训练好的全精度的CNN网络模型,将全部的weights从32位浮点数转为2的整数次幂或者0,而不损失精度。 
文章中采用的量化的形式是:量化最后Wl的每个值是和Pl中的值对应的,也就是2的整数次幂或0;其中只有n1一个超参数,n1是根据这个公式得到的,s就是简单的对所有weights取绝对值取最大。。。bitwidth=b是由我们设定的,n1知道了,n2可以通过n1和b求得 
 
最终convert every entry of Wl (按上面的公式)into a low-precision one。

Re-training
INQ渐进式网络量化示例:第一行:依次为参数分组、量化、重训练;第二行:迭代过程 
(绿色区域表示当前已经被量化的网络参数,浅紫区域表示需要重新训练的网络参数) 


Incremental network quantization algorithm
优化的目标函数,以及参数更新策略 

其中,Pl是由前面的分组量化所确定的取值;Tl是一个mask,他代表了每一步weights的分组:T=0表示是已经quant的部分,T=1表示需要retrain的部分; 
在retrain时只更新retrain部分(T=1)对应的部分也就是还保持32位的weights。(和韩松只更新没有被remove的连接的思想类似)

全部流程 
 
梳理: 
1.输入是training data,pre-trained model,每步迭代有百分之多少weights做quant,就是用于确定2.每层的threshold进而分组的; 
3.根据delta逐层确定weights的分组,更新A1A2也就是分组,Tl也就是分组的mask; 
4.在A1上逐层确定每一层自己的Pl集合; 
5.逐层量化; 
6.计算loss,更新A2部分的参数;
Experiments
 
图1:INQ应用在主流的深度神经网络上,和全精度浮点模型对比,5bit量化,INQ模型分类精度超越了原始的全精度浮点模型; 
图2:不同比特长度,参数二进制化的神经网络模型性能

 
图1:三值,二值神经网络性能比较 
图2:和韩松的文章比,韩松的是把三种不同的方法融合到了一起 
另外本文的方法还有一点好处:之前这些方法最后的weights还是浮点数,但是INQ得到的是二进制化的参数,可以用简单的二进制移位运算代替原来的浮点数乘法运算,简化硬件计算 
the final weights for vector quantization (Gong et al., 2014), network pruning (Han et al., 2015) and deep compression (Han et al., 2016) are still floating-point values, but the final weights for our INQ are in the form of either powers of two or zero. The direct advantage of our INQ is that the original floating-point multiplication operations can be replaced by cheaper binary bit shift operations on dedicated hardware like FPGA.

Future Work
 
进一步将INQ技术从只量化模型参数推广到不但量化模型参数,还量化网络每一层的输入和输出 
VGG-Net为例,首次实现了无损的、低比特、全量化的神经网络模型 
图表:输入输出及参数均二进制化的神经网络模型性能
————————————————
版权声明:本文为CSDN博主「cookie_234」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cookie_234/article/details/75386737

发布了227 篇原创文章 · 获赞 231 · 访问量 169万+

猜你喜欢

转载自blog.csdn.net/haima1998/article/details/103366178