上一篇文章介绍了量化训练的基本流程,本文介绍量化中如何把 BatchNorm 和 ReLU 合并到 Conv 中。

Folding BatchNorm
BatchNorm 是 Google 提出的一种加速神经网络训练的技术,在很多网络中基本是标配。
回忆一下,BatchNorm 其实就是在每一层输出的时候做了一遍归一化操作:

其中 x i x_i xi 是网络中间某一层的激活值, μ β \mu_{\beta} μβ、 σ β \sigma_{\beta} σβ 分别是其均值和方差, y i y_i yi 则是过了 BN 后的输出。
一般卷积层与BN合并
Folding BatchNorm 不是量化才有的操作,在一般的网络中,为了加速网络推理,我们也可以把 BN 合并到 Conv 中。
合并的过程是这样的,假设有一个已经训练好的 Conv 和 BN:

假设 Conv 的 weight 和 bias 分别是 w w w 和 b b b。那么卷积层的输出为:
y = ∑ i N w i x i + b (1) y=\sum_{i}^N w_i x_i + b \tag{1} y=i∑Nwixi+b(1)
图中 BN 层的均值和标准差可以表示为 μ y \mu_{y} μy、 σ y \sigma_{y} σy,那么根据论文的表述,BN 层的输出为:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ y_{bn}&=\gamma…
然后我们把 (1) 代入 (2) 中可以得到:
y b n = γ σ y 2 + ϵ ( ∑ i N w i x i + b − μ y ) + β (3) y_{bn}=\frac{\gamma}{\sqrt{\sigma_y^2+\epsilon}}(\sum_{i}^N w_i x_i + b-\mu_y)+\beta \tag{3} ybn=σy2+ϵγ(i∑Nwix