高通Data free quantization保姆级讲解( 三 )


(注意这个式子的s s s 必须是正数)
对于卷积来说 , 在卷积核上乘以放缩系数 , 等效于在输出上乘以同样的放缩系数 。全连接层同理 。(简单起见 , 上图中的 bias 被省略了)
如果卷积后跟着一个类 ReLU 的激活函数 (ReLU、 等) , 那么 (2) 式也是成立的 , 因为 ReLU 这类激活函数本质上也是分段线性的 。
R e L U ( s x ) = s R e L U ( x ) (3) ReLU(sx)=sReLU(x) \tag{3} ReLU(sx)=sReLU(x)(3)

高通Data free quantization保姆级讲解

文章插图
其实不只是 ReLU , 任何分段线性的函数 , 都满足。不过由于我们大部分时候使用的都是类 ReLU 的函数 , 所以这里就不再延伸了 。
有了以上这些性质后 , 我们就可以在下一个卷积核上 , 乘以一个逆放缩系数 , 从而抵消第一个卷积核放缩的影响 , 实现计算上的等效性 。
这一切成立的前提都在于 conv 和类 ReLU 函数满足公式 (2) , 从而可以把缩放系数等价地作用到下一层输入上 , 并进一步被下一层卷积的逆缩放系数吸收掉 。需要注意的是 , 第一个卷积的缩放系数是乘在每个上 , 而第二个卷积的逆缩放系数则是乘在每个的上的 。
这个过程总结一下就得到了论文中的公式:
y = f ( W ( 2 ) f ( W ( 1 ) x + b ( 1 ) ) + b ( 2 ) ) = f ( W ( 2 ) S f ^ ( S ? 1 W ( 1 ) x + S ? 1 b ( 1 ) ) + b ( 2 ) ) = f ( W ^ ( 2 ) f ^ ( W ^ ( 1 ) x + b ^ ( 1 ) ) + b ( 2 ) ) (4) \begin{} y&=f(W^{(2)}f(W^{(1)}x+b^{(1)})+b^{(2)}) \\ &=f(W^{(2)}S\hat{f}(S^{-1}W^{(1)}x+S^{-1}b^{(1)}) +b^{(2)}) \\ &=f(\hat{W}^{(2)}\hat{f}(\hat{W}^{(1)}x+\hat{b}^{(1)}) +b^{(2)}) \tag{4} \end{} y?=f(W(2)f(W(1)x+b(1))+b(2))=f(W(2)Sf^?(S?1W(1)x+S?1b(1))+b(2))=f(W^(2)f^?(W^(1)x+b^(1))+b(2))?(4)
如何找到放缩系数S
下一步就是如何找出合适的放缩系数S S S 。
回到开头 , 我们在上乘以S S S 的目的是为了让不同之间的数值尽可能相同 , 从而达到均衡化 。为此 , 论文定义了一个指标来描述这种均衡化的程度 (称为均衡化系数):
p i ( 1 ) = r i ( 1 ) R ( 1 ) (5) p_i^{(1)}=\frac{r_i^{(1)}}{R^{(1)}} \tag{5} pi(1)?=R(1)ri(1)??(5)
这里面 ,  r i ( 1 ) r_i^{(1)} ri(1)?表示第一个卷积核的第 i 个的数值范围 ,  R ( 1 ) R^{(1)} R(1) 则表示第一个卷积核整体的数值范围 。理想情况下 , 当然是每个的数值范围都近似整个卷积核的数值范围 (即p i ( 1 ) p_i^{(1)} pi(1)? 的数值越大) , 均衡化的程度越好 。
不过 , 由于我们把缩放的代价转移到了下一个卷积核上了 , 因此 , 我们同时要让这种代价越小越好 。所以 , 对于下一个卷积核来说 , 它那些被缩放的权重也应该尽可能地均衡 。
需要注意的是 , 在计算下一个卷积核的均衡化系数时 , 不能像第一个卷积核一样每个单独计算 , 而应该把相同缩放系数的通道重新排列后 , 再按照前者的方式计算 。(只是求解缩放系数的时候需要这么处理 , 正常卷积运算还是按照原来的卷积核来算)
这种处理方法在数学优化以及代码实现上都能带来极大的方便 。卷积核重新排列后 , 第二个卷积核的数就和第一个相同了 。
由此 , 论文给出了最终的优化函数:
max ? S ∑ i p i ( 1 ) p i ( 2 ) (8) \{S}{\{max}} \sum_i p_i^{(1)}p_i^{(2)} \tag{8} Smax?i∑?pi(1)?pi(2)?(8)
这个式子翻译成人话就是 , 第一个卷积核和第二个卷积核 (重排后) , 它们每个的均衡化系数要尽可能大 , 而让所有的系数之和最大的那个缩放系数S S S , 就是我们想要的 。