(本文首发于公众号,没事来逛逛)
这篇文章简单聊聊后训练量化的一些常规操作。
一些基础知识
在此之前,还是需要先了解一下后训练量化 (下面简称 PTQ,Post-training Quantization) 是啥?具体细节这里就不展开了,不熟悉的读者欢迎看回我之前的文章 (神经网络量化入门–后训练量化。简单来说,后训练量化就是在不重新训练网络 (即不更新 weight) 的前提下,获取网络的量化参数。
说到量化参数,就不得不祭出量化的基本公式了 (假设用非对称量化,8bit):
r = S ( q − z ) (1) r=S(q-z) \tag{1} r=S(q−z)(1)
q = c l i p ( r o u n d ( r S + Z ) , 0 , 255 ) (2) q=clip(round(\frac{r}{S}+Z),0,255) \tag{2} q=clip(round(Sr+Z),0,255)(2)
这里面的 r r r 和 q q q 分别表示量化前的浮点数和量化后的定点数。而 S S S 和 Z Z Z 就是两个重要的量化参数 scale (步长) 和 zero point (零点)。除此之外,还有两个非常重要的量化参数: r m i n r_{min} rmin、 r m a x r_{max} rmax,分别表示浮点数 r r r 的数值范围。
S S S、 Z Z Z、 r m i n r_{min} rmin、 r m a x r_{max} rmax 构成了网络量化里面四个最重要的量化参数,几乎所有后训练量化算法,都是为了找到这几个东西。这里面, S S S、 Z Z Z 和 r m i n r_{min} rmin、 r m a x r_{max} rmax 之间又是可以相互转换的:
S = r m a x − r m i n q m a x − q m i n (3) S = \frac{r_{max}-r_{min}}{q_{max}-q_{min}} \tag{3} S=qmax