论文(ICLR 2021):https://arxiv.org/abs/2011.06751v2
暂无源码
PFQ 概要
Motivation
- Conv层往往和BN层同时出现,实际加速推理时还必须对BN层参数进行量化,然后利用“Fold”操作将BN层参数嵌入到Conv层中。但是这样做可能会增加新的Weight分布的动态范围,增大量化误差。作者认为应该先“Fold”,然后再对得到的新的Weight进行统一量化,这样就能降低量化误差。
- 一些权重对于学习都是不必要的,或者实际上干扰了学习过程,干扰了量化DNN的微调。那么可以通过某些手段(比如Pruning)来去除这些权重,以减少干扰。
为了更详细地说明Motivation 1,作者给出了卷积和BN的有关计算公式。首先是卷积方程的描述:
其中
C
(
o
,
j
,
k
)
C_{(o,j,k)}
C(o,j,k)为第
o
o
o个Output channel下的Feature矩阵的第
j
j
j行
k
k
k列像素点,
w
(
o
,
i
,
u
,
v
)
w_{(o,i,u,v)}
w(o,i,u,v)为第
o
o
o个Output channel下的第
i
i
i个Input channel下的Weight矩阵的第
u
u
u行
v
v
v列的权值点,
x
(
i
,
j
+
u
,
k
+
v
)
x_{(i,j+u,k+v)}
x(i,j+u,k+v)为第
i
i
i个Input channel下的Data矩阵的第
j
+
u
j+u
j+u行
k
+
v
k+v
k+v列的像素点。
b
(
o
)
b_{(o)}
b(o)为第
o
o
o个Output channel下的Bias。为了简便,接下来用
C
(
o
)
=
(
c
(
o
,
1
)
,
.
.
.
,
c
(
o
,
N
)
)
C_{(o)}=(c_{(o,1)},...,c_{(o,N)})
C(o)=(c(o,1),...,c(o,N))表示
C
(
o
,
j
,
k
)
C_{(o,j,k)}
C(o,j,k),用
w
(
o
,
i
)
w_{(o,i)}
w(o,i)表示
w
(
o
,
i
,
u
,
v
)
w_{(o,i,u,v)}
w(o,i,u,v)。
进一步地,BN的计算公式为:
其中
B
(
o
)
B_{(o)}
B(o)是第
o
o
o个BN输出特征。
μ
(
o
)
\mu_{(o)}
μ(o)和
(
σ
(
o
)
)
2
(\sigma_{(o)})^2
(σ(o))2分别为Training Mean和Training Variance,由公式 (3) (4)给出。
γ
(
o
)
\gamma_{(o)}
γ(o)和
β
(
o
)
\beta_{(o)}
β(o)分别为BN层的缩放因子和位移因子。
在用模型进行推理时,会将公式 (1) 代入公式 (2)中,实现“Fold”操作,将BN折叠进卷积操作中,得到新的卷积权值
w
^
(
o
,
i
,
u
,
v
)
\hat{w}_{(o,i,u,v)}
w^(o,i,u,v)和偏差
b
^
(
o
)
\hat{b}_{(o)}
b^(o):
其中
M
(
o
)
(
τ
)
M_{(o)}^{(\tau)}
M(o)(τ)和
V
(
o
)
(
τ
)
V_{(o)}^{(\tau)}
V(o)(τ)为BN在推理时的Running Mean和Running Variance。
τ
\tau
τ为迭代索引(有时文章会省略)。
ρ
\rho
ρ为BN的超参数,有
0
<
ρ
<
1
0 < \rho < 1
0<ρ<1。
至此,根据公式(5) (6)可知,当Conv和BN分开量化并“Fold”到一起时,新的 w ^ \hat{w} w^和 b ^ \hat{b} b^的量化误差会明显变化甚至增大,远不如先“Fold”再做一次量化来得稳定。
为了对Motivation 2 做详细阐述,作者又进一步分析原因。当第
L
L
L个BN层的第
c
c
c个通道的Running Variance在多次迭代
τ
\tau
τ后仍近似为0时,即:
那么这就会使得公式 (8) 中的左边的项和右边的第一项都近似等于零。那么自然在公式 (8)中就有
(
σ
(
o
)
)
2
≃
0
(\sigma_{(o)})^2\simeq0
(σ(o))2≃0。也就是说在公式 (4) 中会得到:
接着由公式 (2) (10) 可得:
即此时BN的输出为常量。那么在这种条件下,公式 (1) 的卷积操作可以重写为:
而公式 (14) 的Bias的迭代更新公式有:
其中
A
c
t
(
⋅
)
Act(·)
Act(⋅)表示激活函数作用,
τ
\tau
τ是迭代索引,
Δ
\Delta
Δ为Gradient提供的更新量。在量化的步骤中,由于公式 (14) 的右边第一项、第二项都被量化了,得到的量化误差往往比只量化公式 (14)整体时更大。此外,除公式 (14) 的量化误差外,公式 (16) 中的Gradient更新量往往是近似得到的,引入了近似误差。由此可见,
b
^
(
o
)
(
L
+
1
)
\hat{b}_{(o)}^{(L+1)}
b^(o)(L+1)的量化误差在量化DNN的微调过程中往往大于其他权重的量化误差。
由上可知,满足公式 (9) 的卷积核对微调有干扰,体现在增大量化误差,体现在公式 (5) 中分母接近 ϵ \epsilon ϵ而导致的Wight的dynamic range增大。
Method
Proposal:Pruning for Quantization
鉴于Motivation,作者提出了剪枝辅助量化(PFQ)方法,描述如Fig 1 所示。
图中左图当BN输出的Feature Map的对应的Running Variance为
V
≃
0
V\simeq0
V≃0时,可以认为该Feature Map为常量矩阵(在Motivation的阐述中已解释过原因),即矩阵内元素均为
β
i
\beta_{i}
βi。那么在右图中常量矩阵经激活函数输出后得到的仍是常量矩阵,写作
A
c
t
(
β
)
Act(\beta)
Act(β),再进一步量化后得到
Q
(
A
c
t
(
β
)
)
Q(Act(\beta))
Q(Act(β))。而PFQ会将
Q
(
A
c
t
(
β
)
)
Q(Act(\beta))
Q(Act(β))对应的输入通道给裁掉,同时也会将对应的Weight矩阵给裁掉,将二者的卷积计算得到的结果(只要计算一次)融于
b
^
\hat{b}
b^中,即可达到降低参数量、加速、减小量化误差(公式 (16) 中右边的第四项因剪枝而消除,也即是梯度估计误差被消除)和避免Wide dynamic range的效果。
实际中,PFQ删除满足下面条件的Weight:
那么BN层的
β
\beta
β变成:
当然在对Activation进行量化操作后,公式 (15) (18) 中的
A
c
t
(
β
(
c
)
(
L
)
)
Act(\beta_{(c)}^{(L)})
Act(β(c)(L))会被
Q
(
A
c
t
(
β
(
c
)
(
L
)
)
)
Q(Act(\beta_{(c)}^{(L)}))
Q(Act(β(c)(L)))取代。
Proposal:Quantization Workflow
进一步地,为了在实际Fine-tune中使用PFQ,作者提出了自己的量化流程,分为主要的两个stage,均进行PFQ。
- Stage 1:实行PFQ操作(剪枝、替换),然后只对Activation进行量化,最后进行微调。
- Stage 2:再次实行PFQ操作(剪枝、替换),然后Fold BN,最后同时将BN对Activation和Weight均进行量化,最后进行微调。
进行两次PFQ是因为,第一次PFQ针对的是正常的QAT过程,并初步剔除正常情况下满足公式 (17) 的Weight。而第二次PFQ是为了考虑实际部署时的情况,同时删除因为仅Activation量化导致新出现满足公式 (17)的Weight,完成Activation和Weight量化。
Ablation Study
PFQ Works for Accuracy
为了验证PFQ是否真实有效,作者在Cifar-100下对MobileNet-v1、MobileNet-v2进行了有关实验,如Table 1 所示,其中w/o表示“Without”。
可见仅进行PFQ的剪枝而不校正Bias的时候,准确度就已经有更好的趋势。完全使用PFQ时准确度更进一步提升。这说明PFQ确实起到作用了。
PFQ Solve Dynamic Range Problem
接着作者继续做实验,如Fig 2 所示,红条为使用PFQ,蓝条为没有使用PFQ。验证了PFQ确实改善了Fold后新的Weight的动态范围。
Effect of Proposed Quantization Workflow
作者最后对所提出的量化流程做了有关实验,如Table 2 所示。可见确实进行两个stage的PFQ是比只进行一个stage要好的且更合理的。“w/ PfQ”指的是“With OFQ”
Experiment
作者在Cifar-100上对MobileNet-v1、MobileNet-v2进行了有关实验,并与DFQ做了比较,如Table 3 所示。可见作者的方法比DFQ好。“w/fine-tune”指的是“with fine-tune”。
作者在Imagenet上对MobileNet-v2进行了有关实验,并与DFQ、PACT、DSQ做了比较,如Table 4 所示。可见作者的方法比其他方法要好得多。“w/fine-tune”指的是“with fine-tune”。
个人思考
- 这篇文章的论证逻辑还是很完整的,充分说明了方法的可行性和意义。
- 但是有个问题,一般带有BN层的Conv层是没有Bias的(具体可看博客),也就是说一般不会考虑对bias的量化。但因为PFQ有 b ^ \hat{b} b^的存在,则一定会引入bias,那么bias的量化就成了问题(该论文作者似乎没有提到对 b ^ \hat{b} b^进行量化,应该是默认 b ^ \hat{b} b^是全精度fp32)。