【量化】——LSQ算法原理理解

本文主要内容转载自:https://zhuanlan.zhihu.com/p/406891271
尊重原创,请看原文
参考理解的code:QuantLib

1. Fakequantize

选取合适的scale将float的 weight tensor 转换成低比特的整型数据。一般后量化的算法都是通过找合适的scale

量化:
q = r o u n d ( c l i p ( r i / s c a l e , Q m i n , Q m a x ) ) q=round( clip(r_i / scale, Q_{min}, Q_{max}) ) q=round(clip(ri/scale,Qmin,Qmax))

反量化:
r o = q × s c a l e r_o = q \times scale ro=q×scale

量化 scale:
s c a l e = ( R m a x − R m i n ) / ( Q m a x − Q m i n ) scale = (R_{max} - R_{min} ) / (Q_{max} - Q_{min} ) scale=(RmaxRmin)/(QmaxQmin)

其中:r表示浮点数,q表示低比特的整型数,scale是浮点和整型之间的缩放因子。

2. LSQ

LSQ中tensor的量化过程和伪量化一样,而其核心:scale不是通过tensor计算而来,而是将其作为一个可学习参数,通过训练得来

LSQ的量化,反量化公式和上面一样:
在这里插入图片描述
其中: − Q N , Q P -Q_N,Q_P QN,QP是量化后整型数的最小,最大值。 v v v是原始浮点数, v ^ \hat{v} v^是反量化回来的浮点数。s就是上面提到的 scale 。

将上面图片中的公式1,2合并得到:
在这里插入图片描述
训练时,前向 v − > v ^ v->\hat{v} v>v^会对tensor进行量化,反量化操作,就是上图的公式。

v ^ \hat{v} v^ v , s v,s v,s的倒数为:

δ v ^ δ v = v , − Q N < v < Q P \frac{\delta \hat{v}}{\delta v} = v, -Q_N<v<Q_P δvδv^=v,QN<v<QP
在这里插入图片描述
上面的 δ r o u n d ( v / s ) δ s \frac {\delta round(v/s)} {\delta s} δsδround(v/s),采用STE方式求导,为:
在这里插入图片描述

另外,作者还认为,scale的更新要与权重的更新有一个相似的关系,所以对于scale需要做一个处理,即在前向传播的时候不做处理,在反向传播的时候引入一个因子g,具体的处理过程如下所示。
在这里插入图片描述
g在这里插入图片描述

其中: g = t e n s o r . n u m e l ( ) / Q P g=\sqrt {tensor.numel() / Q_P} g=tensor.numel()/QP 这就是在tensor和scale之间引入的相关性变量。

scale的初值,论文中为: s = 2 × < ∣ v ∣ > / Q p s=2 \times <|v|> / \sqrt {Q_p} s=2×<v>/Qp ,其中的 < ∣ ∣ > <||> <∣∣> 表示一种运算,一般为max,mean。

最后,总的损失L对scale的前向和反向为:
在这里插入图片描述

这就是整个核心部分的原理,包括前向和反向。

3. 疑问

  • conv量化之后,是能变成整数,但是怎么和bn层融合呢?
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值