全文概括
该论文主要是介绍了一些训练量化网络的Tricks,其4-bit网络的表现比 5-bit 的INQ网络效果要好一点。
该论文为训练量化网络提供了三个方法:
- 两步优化策略 ,先量化权重,再量化激活值;(Two-step, TS)
- 逐步量化 ,在训练过程中逐步减少量化位宽;(Progressive Quantization, PQ)
- 联合训练 浮点网络和低精度网络;(Guided training with a full-precision network, Guide)
简介
以往的经验告诉我们,当权重和激活值一起量化时,很容易陷入一些比较差的局部最小值,这将带来很大的精度损失。
与同时量化相比,两步量化权重和激活值,更容易优化找到更好的局部最小值;借鉴这种逐步找到更好的局部最小值的想法,逐步降低 bit-width 也是一个好的选择;全精度模型能给低精度模型训练提供指示(但对比时,也需要将全精度模型量化后来对比)
与逐层量化的网络相比,该方法对于更深的网络,其应用性更强。、
方法
量化函数
网络应用量化方法 Q ( ⋅ ) Q (\cdot) Q(⋅)得到量化值: z q = Q ( z r ) = 1 2 k − 1 r o u n d ( ( 2 k − 1 ) z r ) z_q=Q(z_r)=\frac1{2^k-1}round((2^k-1)z_r) zq=Q(zr)=2k−11round((2k−1)zr) 其中, z r ∈ [ 0 , 1 ] z_r\in[0,1] zr∈[0,1],表示全精度值; z q ∈ [ 0 , 1 ] z_q\in[0,1] zq∈[0,1],表示量化值。
权值量化:
w
q
=
Q
(
t
a
n
h
(
w
)
2
m
a
x
(
∣
t
a
n
h
(
w
)
∣
)
+
1
2
)
w_q=Q(\frac{tanh(w)}{2max(|tanh(w)|)}+\frac12)
wq=Q(2max(∣tanh(w)∣)tanh(w)+21) 其中,
t
a
n
h
(
w
)
2
m
a
x
(
∣
t
a
n
h
(
w
)
∣
)
+
1
2
\frac{tanh(w)}{2max(|tanh(w)|)}+\frac12
2max(∣tanh(w)∣)tanh(w)+21 可以看做是将
w
w
w 进行归一化,然后再进行量化;
t
a
n
h
(
⋅
)
tanh(\cdot)
tanh(⋅)是减少较大值的影响。
激活值量化:
在将激活值进行量化时,先将激活值应用 clip function ,从而将激活值限制在 [ 0 , 1 ] [0,1] [0,1],然后再进行量化。 f ( x ) = c l i p ( x , 0 , 1 ) = { 0 , x < 0 x , 0 ≤ x ≤ 1 1 , x > 1 f(x)=clip(x,0,1)=\begin{cases}0, &x<0 \\ x, & 0\leq x\leq 1 \\ 1, & x>1 \end{cases} f(x)=clip(x,0,1)=⎩⎪⎨⎪⎧0,x,1,x<00≤x≤1x>1 x q = Q ( f ( x ) ) x_q=Q(f(x)) xq=Q(f(x))
带有量化函数的反向传播:
一般来说,量化函数是不可微分的,所以不能直接进行网络的反向传播。所以为了解决这个问题,我们直观地将 z r z_r zr 和 z q z_q zq 等同起来,即 ∂ z q ∂ z r ≈ 1 \frac{\partial z_q}{\partial z_r} \approx 1 ∂zr∂zq≈1。因此, ∂ l ∂ z r \frac{\partial l}{\partial z_r} ∂zr∂l 可以被近似为 ∂ l ∂ z r = ∂ l ∂ z q ∂ z q ∂ z r ≈ ∂ l ∂ z q \frac{\partial l}{\partial z_r}=\frac{\partial l}{\partial z_q}\frac{\partial z_q}{\partial z_r}\approx \frac{\partial l}{\partial z_q} ∂zr∂l=∂zq∂l∂zr∂zq≈∂zq∂l
两步优化
由于之前我们都直观地将 ∂ z q ∂ z r ≈ 1 \frac{\partial z_q}{\partial z_r} \approx 1 ∂zr∂zq≈1,所以这必将带来噪声,即梯度方向并不一定是目标方向(如果该公式成立的话,那么直接训练是没有任何问题的)。由于该公式并不完全正确,所以如果同时引入两个该误差,则更可能陷入一个较差的局部最小点。因此,将量化训练分成两个步骤,能减轻训练的困难。
逐步量化
借鉴两步量化的思想,逐渐减少位宽能减轻训练量化网络的难度,比如 32 b i t → 16 b i t → 8 b i t → 4 b i t → 2 b i t 32bit \rightarrow 16bit\rightarrow8bit\rightarrow4bit\rightarrow2bit 32bit→16bit→8bit→4bit→2bit。
使用全精度网络进行引导式培训
该方法是借鉴了信息蒸馏(information distillation)的思想。本文在训练低精度网络的时候,同时训练另一个“引导”网络。“引导网络”和低精度网络拥有一样的网络结构,只是保持全精度权重和全精度激活值(在与低精度网络结果进行对比时,再进行量化比较)。
假设有一些全精度模型,我们所要的低精度网络模型可以直接通过量化其中一个全精度模型得到。
假设 μ ( x ; W f u l l ) \mu(x;W_{full}) μ(x;Wfull) 和 ν ( x ; W l o w ) \nu(x;W_{low}) ν(x;Wlow) 是两个需要对比的 feature map,前者是全精度的,后者是量化后的,这两者不直接比较。将全精度的 feature map 进行量化, Q ( μ ( x ; W f u l l ) ) Q(\mu(x;W_{full})) Q(μ(x;Wfull)) 与 ν ( x ; W l o w ) \nu(x;W_{low}) ν(x;Wlow) 进行量化,其引导损失为: R ( W f u l l , W l o w ) = 1 2 ∥ Q ( μ ( x ; W f u l l ) ) − ν ( x ; W l o w ) ∥ 2 R(W_{full}, W_{low}) = \frac12\|Q(\mu(x;W_{full}))-\nu(x;W_{low})\|^2 R(Wfull,Wlow)=21∥Q(μ(x;Wfull))−ν(x;Wlow)∥2 则两个网络训练时的损失变为: L 1 ( W f u l l ) = L θ 1 + λ R ( W f u l l , W l o w ) L_1(W_{full})=L_{\theta_1}+\lambda R(W_{full},W_{low}) L1(Wfull)=Lθ1+λR(Wfull,Wlow) L 2 ( W f u l l ) = L θ 2 + λ R ( W f u l l , W l o w ) L_2(W_{full})=L_{\theta_2}+\lambda R(W_{full},W_{low}) L2(Wfull)=Lθ2+λR(Wfull,Wlow)
实现细节
在最后一个全连接层之后添加一个标量层(在将low-bit放入softmax层之前);
使用牛顿SGD,batch_size 设置为
256
256
256。
对于全精度基线,初始学习率设为
0.01
0.01
0.01,每
30
30
30个周期衰减为
1
10
\frac1{10}
101;weight_decay 设置为
0.0001
0.0001
0.0001;动量设置为
0.9
0.9
0.9。
对于量化权重和激活值,初始学习率设为
0.001
0.001
0.001,每
10
10
10个周期衰减为
1
10
\frac1{10}
101。
对于 ResNet-50,只在最后两个残差模块使用 guide loss;对于 AlexNet,在最后两个全连接层使用 guide loss。
实验
实验对象为两个网络(AlexNet、ResNet-50);两个数据集(Cifar100、ImageNet)。
实验结果
在AlexNet网络上,4-bit比全精度有所提升;2-bit 比全精度有明显下降;但2-bit 的结果表现的比 直接量化成 2-bit 的基线结果更好。
在 ResNet-50 网络上,4-bit和全精度表现一样;2-bit 比全精度有明显下降;但2-bit 的结果表现的比 直接量化成 2-bit 的基线结果更好。
通过以上两组对比,可以发现:对比直接量化得到的baseline,2-bit的提升要比4-bit的多,说明对于更难优化的问题,该方法更有效。
通过消融学习,发现有的论文提到的“第一层和最后一层不进行量化有助于保持精度”,这个现象对于本文来说不存在,即第一层和最后一层量化与否,都对本方法的结果产生不了较大精度损失。
作者觉得可以通过两方面解释这个问题:1) finetune减少了优化难度;2) PQ + Guide 减轻了优化的不稳定性。