文章目录
任意精度深度神经网络
3.1 预览
神经网络通常是一层一层地构造。
x
i
x_i
xi表示神经网络第
i
i
i层的输入。该层的权值为
w
i
w_i
wi偏差为
b
i
b_i
bi。则这一层的输出可以表示为:
不失一般性,以全连接层的一个通道为具体例子,为简单起见,去掉下标
i
i
i。
其中,
y
,
w
∈
R
D
\mathbf{y}, \mathbf{w} \in \mathbb{R}^{D}
y,w∈RD,
b
b
b是一个标量。
为了提高计算效率,我们希望避免
D
−
d
i
m
D-dim
D−dim向量的浮点积。相反,我们使用
N
−
b
i
t
N-bit
N−bit定点整数将权重表示为
w
Q
\mathbf{w}_\mathbf{Q}
wQ,激活值表示为
x
Q
\mathrm{x}_{\mathrm{Q}}
xQ,此后,我们假设
w
Q
\mathbf{w}_\mathbf{Q}
wQ和
x
Q
\mathrm{x}_{\mathrm{Q}}
xQ以其按位格式存储为有符号整数。注意在一些相关工作中 (Courbariaux et al. 2016 )
。
w
Q
\mathbf{w}_\mathbf{Q}
wQ和
x
Q
\mathrm{x}_{\mathrm{Q}}
xQ的元素可以表示为向量{−1,1},这两种格式之间的转换很简单。
N
−
b
i
t
N-bit
N−bit整数的权值和激活,如先前技术中所讨论的 (Zhou et al. 2016; Rastegariet al. 2016)
,计算可以通过利用位操作(和,xnor,bit-count),甚至专用的DNN硬件来加速。
早期的工作(Tang, Hua, and Wang 2017)
表明,通过添加逐层实值缩放因子
s
s
s,可以很大程度上减少输出范围的变化,从而获得更好的模型精度。由于比例因子在同一层内的通道之间共享,计算代价是小数。在这个设置之后,有了量化的权值和输入,就有
然后将激活
y
′
\mathbf{y}^{\prime}
y′量化为
N
−
b
i
t
N-bit
N−bit定点整数作为下一层的输入。
3.2 推理
我们将在下一节详细讨论量化函数。这里我们描述一个训练过的任何精度的深度神经网络的运行时间。
一但训练完成时,我们可以将权重保存在较的精度水平进行存储。如下图所示,我们可以通过比特移位简单地将权重量化为更低的位宽度。我们通过实验观察到,在提出的训练框架下,模型精度变化平稳且一致,与以相同位宽训练的专用模型不相上下,甚至优于专用模型。
3.3 训练 (Training)
在文献中已经分别提出了用于权重和激活的多个量化函数。给定一个预先训练的DNN模型,可以将其权重量化为低位,并相应地对激活应用一定的量化函数,然而,当比特数变小时,由于权重的粗略近似和激活的较大变化,准确度迅速下降,为获得低比特位模型最广泛采用的框架是量化感知训练。该方法遵循量化感知的训练框架。
我们以同样的完全连接层为例。在训练中,我们保持浮点值权重
w
\mathbf{w}
w作为实际层权重
w
Q
\mathbf{w}_{\mathbf{Q}}
wQ。在前馈传递中,给定输入
x
Q
\mathbf{x}_{\mathbf{Q}}
xQ,我们按照公式(3)计算原始输出
y
′
\mathbf{y}^{\prime}
y′。现有技术表明了批归一化(BN) (Ioffe和Szegedy 2015)
层在低精度DNN训练中的重要性,我们据此进行研究。然后将
y
′
\mathbf{y}^{\prime}
y′传递到BN层,然后量化为
y
Q
\mathbf{y}^{\mathbf{Q}}
yQ作为下一层的输入。
Weights. 我们使用类似于Zhou et al.
的统一量化策略,并使用比例因子来近似权重。我们首先应用tanh函数将其标准化
[
−
1
,
1
]
[−1,1]
[−1,1],然后将其转化为
w
′
∈
[
0
,
1
]
\mathbf{w}^{\prime} \in[0,1]
w′∈[0,1],即
然后我们将标准化值量化为
N
−
b
i
t
N-bit
N−bit位整数
w
Q
′
\mathrm{w}_{\mathbf{Q}}^{\prime}
wQ′和缩放因子
s
s
s,其中
这里
M
A
X
N
\mathrm{MAX}_{\mathrm{N}}
MAXN表示
N
−
b
i
t
N-bit
N−bit位整数的上界,
I
N
T
(
⋅
)
\mathrm{INT}(\cdot)
INT(⋅)将浮点值转换为整数。
最后,这些值被重新映射回近似浮点值的范围,以获得其中 E \mathbb{E} E是同一层中所有浮点值权重绝对值的平均值。最终,我们用 s ∗ w Q s * \mathbf{w}_{\mathbf{Q}} s∗wQ来近似 w \mathbf{w} w,并用量化的权重执行前馈过程。如等式3所示,比例因子可以应用于所有整数向量的点积之后。
在后向春播中,将相对于基础浮点值变量
w
\mathbf{w}
w计算梯度,并将更新应用于
w
\mathbf{w}
w。以这种方式,将逐渐累积相对不可靠性和细微的信号,因此这将稳定整体训练过程。由于并非所有涉及的操作都是支持反向传播的平滑函数,我们使用直接通过估计器(STE) (Hinton 2012)
来近似梯度。例如,方程5中的
r
o
u
n
d
round
round运算几乎处处导数为零。对于STE,我们分配
∂
round
(
x
)
/
∂
x
:
=
1
\partial \operatorname{round}(x) / \partial x:=1
∂round(x)/∂x:=1。
Activations. 对于前行传播中的激活量化,我们首先将值裁剪到
[
0
,
1
]
[0,1]
[0,1]范围内,然后得到
N
−
b
i
t
N-bit
N−bit定点表示
在实际中,我们只将整数部分计算为
y
Q
\mathbf{y}_{\mathbf{Q}}
yQ,将常数比例因子吸收到下一层的持久网络参数中,将恒定比例因子吸收到下一层的持久网络参数中。
设 L L L表示最终损失函数,则关于激活 y Q \mathbf{y}_{\mathbf{Q}} yQ的梯度近似为其中 r o u n d round round函数的梯度用STE近似为1。
Dynamic Model-wise Quantization. 在以往的低精度模型中,位宽 N N N在训练过程中是固定的。在运行时,如果我们更改 N N N,则模型精度会急剧下降。为了促使产生的模型具有灵活性,在这里,提议在训练阶段动态改变 N N N,以使训练和推理过程保持一致。然而,激活的分布在不同的位宽N下不同,特别是当N很小时(例如,1位),如图3所示。因此,在没有特殊处理的情况下,动态变化的N在学习模型时会产生冲突,而该模型在我们的实验中无法收敛。
调整内部特征/激活分布的广泛采用的技术之一是批量归一化(BatchNorm) (Ioffe and Szegedy 2015)
。它的工作原理是跨批次维度对图层输出进行归一化,如下所示:
其中
B
B
B是批次大小,
i
i
i表示当前批次内的索引,
ϵ
\epsilon
ϵ是为避免数值问题而添加的小值,
µ
µ
µ和
σ
2
σ^2
σ2分别定义为平均值和方差:
在训练过程中,BatchNorm Layer
不断计算
µ
µ
µ和
σ
2
σ^2
σ2的运行平均值,即
其中
µ
t
µ_t
µt和
σ
t
2
σ_t^2
σt2是当前更新之前的值,衰减率
λ
λ
λ为先验超参数集。但是,即使使用BatchNorm
层,由于图3示例中所示的值分布变化,动态变化的
N
N
N也会导致训练中的收敛失败。
在我们提出的框架中,我们采用动态变化的BatchNorm layer
来处理训练中不同的
N
N
N。更具体地说,假设我们具有位宽候选列表
{
n
k
}
k
=
1
K
\left\{n_{k}\right\}_{k=1}^{K}
{nk}k=1K,我们保留
∣
K
∣
|K|
∣K∣副本的BatchNorm层参数和内部状态
Φ
k
=
1
K
\Phi_{k=1}^{K}
Φk=1K。当当前的训练迭代在
N
=
n
k
N = n_k
N=nk下进行时,我们用来自
Φ
k
\Phi_{k}
Φk的数据重置BatchNorm层,并更新相应的副本。
Yu et al.等人 (Yu and Huang 2019)
在处理不同的网络架构时也采用了类似的技术。训练后保留所有BatchNorm
层的参数,用于推理。注意,与网络参数的总数相比,BatchNorm
层的附加数量可以忽略不计。我们在算法1中总结了所提出的方法。利用该算法,我们可以训练DNN具有灵活的运行时位宽调整能力。
算法1:对所提出的任意精度DNN进行训练
要求:给定的候选位宽 P ← { n k } k = 1 K P \leftarrow\left\{n_{k}\right\}_{k=1}^{K} P←{nk}k=1K
- 使用浮点值参数初始化模型 M \mathcal{M} M
- 初始化 K K K个
BatchNorm
层: Φ k = 1 K \Phi_{k=1}^{K} Φk=1K- for t = 1 , … , T i t e r s t=1, \ldots, T_{i t e r s} t=1,…,Titers do
- 采样批次数据集 ( x , y ) (x,y) (x,y)来自训练集 D t r a i n D_{train} Dtrain
- for n p n_p np in P P P do
- 设置量化位宽 N ← n p N \leftarrow n_{p} N←np
- 前馈传递: y n p ← M ( x ) y_{n_{p}} \leftarrow \mathcal{M}(x) ynp←M(x)
- 设置
Batchnorm
层 M.replace ( Φ p ) \left(\Phi_{p}\right) (Φp)- L ← L + loss ( y n p , y ) L \leftarrow L+\operatorname{loss}\left(y_{n_{p}}, y\right) L←L+loss(ynp,y)
- end for
- 返回传播以更新网络参数
- end for
我们方法中的另一个可选组件是在培训中添加知识蒸馏(Hinton、Vinyals and Dean 2015)
。知识提炼的工作原理是匹配两个网络的输出。在训练网络时,我们可以使用一个更复杂的模型或一组模型来产生软目标,通过调整最终Softmax层的温度来产生软目标,然后用软目标来指导网络学习。
在我们的框架中,我们通过从高精度模型生成软目标来应用这一思想。更具体地说,在每次训练迭代中,我们首先将量化位宽设置为最高候选 n K n_K nK,并运行前馈传递以获得软目标 y s o f t y_{soft} ysoft。之后,我们不再对每个精度候选项累积交叉熵损失,而是使用模型预测的KL散度和 y s o f t y_{soft} ysoft作为损失。在我们的实验中,我们观察到,一般来说,知识蒸馏在低位精度水平下会带来更好的性能。
4 实验
我们首先在几种网络结构和数据集上对我们的方法进行了验证。这些网络包括一个8层的CNN、AlexNet、MobileNetV2(、RESNET-8、RESNET-18、RESNET-20和RESNET-50。数据集包括Cifar-10、SVHN和ImageNet,我们也评价了我们的方法在图像分割任务,以证明其泛化。
4.2 Comparison to Dedicated Models
对于我们测试的每个位宽,我们都按照相同的训练管道专门训练一个低精度的模型,并为权重和激活设置固定的位宽。例如,在Cifar-10上,我们的1-bit基线达到了92.07%的准确率,而Ding et al. (Ding et al. 2019)
最近的工作报告了89.90%。