date: 2020/02/22

朝焼けと熱帯魚(朝霞和热带鱼) - ぼくのりりっくのぼうよみ(我的歌词平淡无奇):bokuriri的卷舌辨识度好高 


移位量化也可以称为对数量化,将数值从浮点数的形式量化为一个整数或定点数,但它与线性量化不同,两个相邻数之间是在以2为底的对数域上均匀分布的,这使得实际推理当中可以直接通过移位运算来快速实现,同时也拥有随比特数增长而指数增长的大动态范围。

移位量化既可以只量化权重(对激活值移位),也可以只量化激活(对权重值移位),当然也可以同时量化权重和激活(对值1移位)。由于涉及底层的位移运算,可以设计出各种比较花哨的近似位移或并行位移的技巧,这些方案大多更适用于FPGA。

此外,ShiftCNN也采用了一种不完全的移位相加形式来替代乘法,也算是相对折中的一种处理方案。


LogNN

论文:《Convolutional Neural Networks using Logarithmic Data Representation (2016)

image.png


仅量化激活

如图(b),量化激活值为整数

此时与权重之间的乘法计算就可以简化为移位


也可以量化为定点数,此时加上一个常量偏移,即

此时激活值需要存储一系列的和一个共享的


当然,实际量化还要考虑溢出问题,


再来看看

  1. 最直观:直接向上、向下或四舍五入来取整
  2. 最快(等价向下取整):如图(b),直接取二进制串中最左侧1的位置,比如量化为


量化权重和激活

权重的量化方式与激活相同,此时乘法计算进一步简化为

写作递推式为

,则可以推导出对数域的近似累加公式,

在对数域上直接近似累加,比原始的“累加+量化”过程更加高效


ShiftCNN

论文:《ShiftCNN: Generalized Low-Precision Architecture for Inference of Convolutional Neural Networks (2017)


表示形式

为权重设置子码本(codebook),每个码本包含个码字,每个码字位宽 bits,此时量化后的权重可以如此表示:

其中个子码本的第在第个子码本上对应的索引;

假设,那么码本可以表示为

显然,

  • 且码本不包含0值时,退化为二值量化
  • 时,退化为三值量化

image.png


量化方案

image.png

简单来说,就是先对权重作归一化,然后逐个码本去找误差最小的位移方案,然后保留索引idx


推理细节

本质是用移位替代乘法。

假定乘法已经被量化为若干求和的形式,那么乘法过程就可以被简化成移位相加的形式。

比如对于的码本有

那么乘法就优化为


考虑到多码本的情况下可能同一个数值存在多种表示的情况

比如

那么既可以量化为,也可以量化为但如果按照前述的算法进行量化,那么只会量化成

所以实际上只有种不同的码字,那么对于一个输入,它只有种移位情况(忽略零码);

对于的输入特征图,可能存在的移位组合只有种,也就是说我们可以预设好所有情况,然后通过查表直接并行得到移位结果,直接按元素加和起来作为输出特征图。

image.png

image.png


INQ

论文:《Incremental Network Quantization: Towards Lossless CNNs with Low-Precision Weights (ICLR2017)

实现:https://github.com/AojunZhou/Incremental-Network-Quantization

image.png


量化方案

仅量化权重。

把第层卷积的权重量化为 bits的,其中1bit用来表示权重值是否为0,另外bits用来存储非零权重的量化结果,其余量化形式与LogNN相类似,记偏移量为,那么将在如下里取值:

接下来确定

对于每个权重值,

其中是排序好的中相邻的两个值     ——(这波量化怎么有点云里雾里)


增量式量化

作者参考增量式裁剪,设计了增量式量化的方案。先对权重取绝对值,取比较大的一批先量化,其他权重值保持浮点数,然后对浮点数权重做恢复训练;如此反复,逐渐扩大量化的范围直到所有权重都完成量化(如50%->75%->87.5%->100%)。

另外按照作者的实验,根据绝对值的尺度来确定哪些权重需要量化效果要比随机挑选的好。

image.png


DeepShift

论文:《DeepShift: Towards Multiplication-Less Neural Networks (2019)

参考:《把CNN里的乘法全部去掉会怎样?华为提出移动端部署神经网络新方法 | 机器之心

实现:https://github.com/mostafaelhoushi/DeepShift


也不算有很多花样,依旧是对数形式的量化,只量化权重,提出两种形式的训练过程DeepShift-Q和DeepShift-PS,但效果都差不多。但用CUDA在GPU上实现了移位版本的全连接、卷积,算是也有不少工作吧。

image.png


image.png


DeepShift-Q

Q指的是Quantization,也即传统的将量化操作纳入训练过程的形式。

函数的求导依旧是采用STE近似,也即


DeepShift-PS

PS指的是Power、Sign,顾名思义,不再保留浮点数的权重,而是直接训练参数,训练过程中参数均用浮点数存储,训练完毕后再固定为整数。

注意使用L2惩罚时,惩罚项应为而不是


其他

LogQuant:《A Deep Look into Logarithmic Quantization of Model Parameters in Neural Networks (IAIT2018)