Quantizing deep convolutional networks for efficient inference: A whitepaper

本文是对当前量化方法的一个总结。

量化设计

统一仿射量化

它将浮点数量化到(0,Nlevel-1),这里Nlevel是2的bit次方。
Quantizing deep convolutional networks for efficient inference: A whitepaper_第1张图片
对cnn来说,卷积操作变为:
Quantizing deep convolutional networks for efficient inference: A whitepaper_第2张图片
这种方法在推断时能够取得更快的速度,因为它的激活值求和以及权重值都是常量。

统一对称量化

Quantizing deep convolutional networks for efficient inference: A whitepaper_第3张图片

随机量化

在这里插入图片描述
随机量化是将量化器视作一个round操作内的加性噪音,因为很多硬件并不支持随机采样,因此它往往并不在推断时使用。

Note that in expectation,the stochastic quantizer reduces to a pass-through of the floating point weights, with saturation for values outside the range. (没看懂)因此用它来计算梯度效果很好。

反向传播

作者接下来介绍了quantization-aware训练。大意就是在反向传播时,使用浮点型更新梯度,也就是STE方法。

量化参数的选择

量化粒度

可以对每层权重使用相同的量化参数(scale和zero-point),但对每个通道使用不同的参数效果会更好。一般对激活值使用每层不同的量化参数,因为这样会导致很大的计算消耗。

量化推断

作者这里介绍了几种常见的量化方式:

前向训练量化

只量化权重

这种方式不需要验证集,直接进行量化即可。

实验表明逐层量化的效果不如逐通道,同是逐通道时,对称量化效果不如不对称量化(不对称量化指使用浮点数的最大/最小值作为量化范围。而对称量化则使用浮点数的最大值和最小值的绝对值的最大值的正负值作为量化范围)。

同时量化权重和激活值

因为要量化激活值,因此要考虑它的动态范围,因此往往需要一些批量样本来估计激活值的范围。
Quantizing deep convolutional networks for efficient inference: A whitepaper_第4张图片
这里逐层量化了激活值,结果表明逐层量化激活值,逐通道量化权重效果最好。当使用不对称量化时,效果甚至还有轻微的提升。

作者说激活值的动态范围很小是因为在bn层里没有使用γ来放缩;且使用ReLU6代替了其它激活函数。

大的网络因为有更多的网络层和参数来弥补量化导致的精度损失,因此对量化的鲁棒性更好,但这些网络的计算效率往往更高,所以在选取网络时要有所权衡。

量化的主要损失来自权重,所以应该探索更好的量化权重的方法。

BN层量化

在推断时,对权重和偏置做如下处理:

Quantizing deep convolutional networks for efficient inference: A whitepaper_第5张图片
作者一开始的量化方案是:
Quantizing deep convolutional networks for efficient inference: A whitepaper_第6张图片
但是bn层在训练和推断时的不同会导致振荡,一个简单的解决方案是在训练时使用变化的长期均值,但这会消除bn的效果,且会在训练时引入不稳定性。

于是作者引入了如下的解决方案:

Quantizing deep convolutional networks for efficient inference: A whitepaper_第7张图片
作者始终使用校正因子来将权重缩放到长期统计数据:
Quantizing deep convolutional networks for efficient inference: A whitepaper_第8张图片

训练时则分两个阶段,开始阶段时取消对权重的缩放来使它和传统的bn操作保持一致。
Quantizing deep convolutional networks for efficient inference: A whitepaper_第9张图片
在进行了充足的训练后(作者说是大概几十万次训练后),开始从使用批次统计值来bn变成使用变化的长期均值。
Quantizing deep convolutional networks for efficient inference: A whitepaper_第10张图片
作者指出,训练的好处是,它能够缩小对称量化和不对称量化的距离。它还使得低位(如4位)网络和逐层量化方案获得接近浮点数的精度。但高位和逐通道量化的网络还是取得了更好的效果。

调参对低位网络的效果更好些。

低位激活值量化会导致精度大幅下降,作者猜测这是因为各个图片的激活模式并不相同,而权重的模式却是确定的。网络可以通过学习权重的模式来弥补这个确定的扭曲,但却不能通过学习激活模式来弥补(但是ACIQ不是对激活值的学习吗?)。

另外,作者发现从头开始训练量化网络的精度要比微调一个浮点型模型的效果差。

你可能感兴趣的:(Quantizing deep convolutional networks for efficient inference: A whitepaper)