移位量化(对数量化)

原文链接: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),量化激活值为整数
x ~ i = Q u a n t i z e ( log ⁡ 2 ( x i ) ) \tilde{x}_{i}=Quantize \left(\log _{2}\left(x_{i}\right)\right) x~i=Quantize(log2(xi))
此时与权重之间的乘法计算就可以简化为移位
w T x ≈ ∑ i = 1 n w i × 2 x ~ i = ∑ i = 1 n Bitshift ⁡ ( w i , x ~ i ) \begin{aligned} w^{T} x & \approx \sum_{i=1}^{n} w_{i} \times 2^{\tilde{x}_{i}} \\ &=\sum_{i=1}^{n} \operatorname{Bitshift}\left(w_{i}, \tilde{x}_{i}\right) \end{aligned} wTxi=1nwi×2x~i=i=1nBitshift(wi,x~i)


也可以量化为定点数,此时加上一个常量偏移 F S R FSR FSR,即 x ~ i , F S R = x ~ i + F S R \tilde{x}_{i,FSR} = \tilde{x}_{i} + FSR x~i,FSR=x~i+FSR
此时激活值需要存储一系列的 x ~ i , F S R \tilde{x}_{i, FSR} x~i,FSR和一个共享的 F S R FSR FSR

当然,实际量化还要考虑溢出问题,
{ x ~ i = C l i p ( Q u a n t i z e ( log ⁡ 2 ( x i ) ) , − F S R , − F S R + 2 b i t w i d t h ) x ~ i , F S R = x ~ i + F S R \begin{cases} \tilde{x}_{i} &= Clip \left( Quantize \left(\log _{2}\left(x_{i}\right)\right), -FSR, -FSR + 2^{bitwidth} \right) \\ \tilde{x}_{i,FSR} &= \tilde{x}_{i} + FSR \end{cases} { x~ix~i,FSR=Clip(Quantize(log2(xi)),FSR,FSR+2bitwidth)=x~i+FSR


再来看看 Q u a n t i z e ( ⋅ ) Quantize(\cdot) Quantize()

  1. 最直观:直接向上、向下或四舍五入来取整
  2. 最快(等价向下取整):如图(b),直接取二进制串中最左侧1的位置,比如 x = 15 = 0 b 001111 x=15=0b001111 x=15=0b001111量化为 x ~ = 3 \tilde{x}=3 x~=3

量化权重和激活

权重的量化方式与激活相同,此时乘法计算进一步简化为
s n = w T x ≈ ∑ i = 1 n 2 Q u a n t i z e ( log ⁡ 2 ( w i ) ) + Q u a n t i z e ( log ⁡ 2 ( x i ) ) = ∑ i = 1 n Bitshift ⁡ ( 1 , w ~ i + x ~ i ) \begin{aligned} s_n = w^{T} x & \approx \sum_{i=1}^{n} 2^{Quantize \left(\log _{2}\left(w_{i}\right)\right)+ Quantize \left(\log _{2}\left(x_{i}\right)\right)} \\ &=\sum_{i=1}^{n} \operatorname{Bitshift}\left(1, \tilde{w}_{i}+\tilde{x}_{i}\right) \end{aligned} sn=wTxi=1n2Quantize(log2(wi))+Quantize(log2(xi))=i=1nBitshift(1,w~i+x~i)
写作递推式为
s n = s n − 1 + w n x n ≈ s n − 1 + Bitshift ( 1 , w ~ n + x ~ n ) s_n = s_{n-1} + w_n x_n \approx s_{n-1} + \text{Bitshift} (1, \tilde{w}_n + \tilde{x}_n) sn=

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值