yahei · 2020年03月08日

移位量化(对数量化)

原文链接:https://www.yuque.com/yahei/hey-yahei/shift_quantization

移位量化也可以称为对数量化,将数值从浮点数的形式量化为一个整数或定点数,但它与线性量化不同,两个相邻数之间是在以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)

推荐阅读
关注数
286
内容数
26
计算机视觉相关学习笔记,欢迎关注。[链接]
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息