(本文首发于公众号,没事来逛逛)
之前写的关于网络量化的文章都是基于 per-layer 实现的,最近有小伙伴询问关于 per-channel 量化的问题,我发现有些同学对这个东西存在一些误解,包括我以前也被 per-channel 的字面意义误导过,所以今天简单聊一下 per-channel 量化是怎么回事。
回顾一下Per-layer量化
在介绍 per-channel 量化之前,我们先回顾一下 per-layer 量化是怎么做的。
假设 r 1 r_1 r1、 r 2 r_2 r2 分别表示输入的 feature 和卷积的 kernel, r 3 r_3 r3 表示输出,那么卷积运算可以表示为:
r 3 i , j , o c = ∑ i c ∑ m ∑ n r 1 i − m , j − n , i c r 2 i − m , j − n , i c (1) r_3^{i,j,oc}=\sum_{ic}\sum_{m}\sum_{n}r_1^{i-m,j-n,ic}r_2^{i-m,j-n,ic} \tag{1} r3i,j,oc=ic∑m∑n∑r1i−m,j−n,icr2i−m,j−n,ic(1)
公式里面, o c oc oc 表示输出通道的 index, i c ic ic 表示输入通道的 index。下面为了公式简洁,我会省略 i i i、 j j j 这些跟位置相关的 index。
per-layer 量化下,整个 tensor 会共用一个 scale 和 zero point。
就像下面这张图给出的这样:
![](https://img-blog.csdnimg.cn/ba9b1f8ea0e54e9b81cf26c72859654a.png)
因此量化后的卷积运算为:
S 3 ( q 3 o c − Z 3 ) = ∑ i c ∑ m ∑ n S 1 ( q 1 i c − Z 1 ) S 2 ( q 2 i c − Z 2 ) (2) S_3(q_3^{oc}-Z_3)=\sum_{ic}\sum_{m}\sum_{n}S_1(q_1^{ic}-Z_1)S_2(q_2^{ic}-Z_2) \tag{2} S3(q3oc−Z3)=ic∑m∑n∑S1(q1ic−Z