Any-Precision Deep Neural Networks

文章目录


任意精度深度神经网络

3.1 预览

神经网络通常是一层一层地构造。 x i x_i xi​表示神经网络第 i i i层的输入。该层的权值为 w i w_i wi​偏差为 b i b_i bi​。则这一层的输出可以表示为:
Any-Precision Deep Neural Networks不失一般性,以全连接层的一个通道为具体例子,为简单起见,去掉下标 i i i。
Any-Precision Deep Neural Networks其中, 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),计算可以通过利用位操作(和,xnorbit-count),甚至专用的DNN硬件来加速。

早期的工作(Tang, Hua, and Wang 2017)表明,通过添加逐层实值缩放因子 s s s,可以很大程度上减少输出范围的变化,从而获得更好的模型精度。由于比例因子在同一层内的通道之间共享,计算代价是小数。在这个设置之后,有了量化的权值和输入,就有
Any-Precision Deep Neural Networks然后将激活 y ′ \mathbf{y}^{\prime} y′量化为 N − b i t N-bit N−bit定点整数作为下一层的输入。

3.2 推理

我们将在下一节详细讨论量化函数。这里我们描述一个训练过的任何精度的深度神经网络的运行时间。
Any-Precision Deep Neural Networks

图1 将训练模型中的核权重量化为不同的精度级别:由于我们遵循统一的量化模式,当用带符号整数表示权值时,量化可以实现为简单的比特移位。

一但训练完成时,我们可以将权重保存在较的精度水平进行存储。如下图所示,我们可以通过比特移位简单地将权重量化为更低的位宽度。我们通过实验观察到,在提出的训练框架下,模型精度变化平稳且一致,与以相同位宽训练的专用模型不相上下,甚至优于专用模型。

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],即
Any-Precision Deep Neural Networks然后我们将标准化值量化为 N − b i t N-bit N−bit位整数 w Q ′ \mathrm{w}_{\mathbf{Q}}^{\prime} wQ′​和缩放因子 s s s,其中
Any-Precision Deep Neural Networks这里 M A X N \mathrm{MAX}_{\mathrm{N}} MAXN​表示 N − b i t N-bit N−bit位整数的上界, I N T ( ⋅ ) \mathrm{INT}(\cdot) INT(⋅)将浮点值转换为整数。

最后,这些值被重新映射回近似浮点值的范围,以获得Any-Precision Deep Neural Networks其中 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定点表示
Any-Precision Deep Neural Networks在实际中,我们只将整数部分计算为 y Q \mathbf{y}_{\mathbf{Q}} yQ​,将常数比例因子吸收到下一层的持久网络参数中,将恒定比例因子吸收到下一层的持久网络参数中。

设 L L L表示最终损失函数,则关于激活 y Q \mathbf{y}_{\mathbf{Q}} yQ​的梯度近似为Any-Precision Deep Neural Networks其中Any-Precision Deep Neural Networks 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在学习模型时会产生冲突,而该模型在我们的实验中无法收敛。Any-Precision Deep Neural Networks

图2 权重和输入在不同位宽下的激活分布:我们随机生成一个单通道全连接层和1000个16维输入;然后将权值和输入分别量化为1、2、4、8位,并总结了不同位宽下的激活分布;如图所示,与8位模型相比,1位量化导致了显著的分布漂移,2位下的差异也很明显。

调整内部特征/激活分布的广泛采用的技术之一是批量归一化(BatchNorm) (Ioffe and Szegedy 2015) 。它的工作原理是跨批次维度对图层输出进行归一化,如下所示:
Any-Precision Deep Neural Networks其中 B B B是批次大小, i i i表示当前批次内的索引, ϵ \epsilon ϵ是为避免数值问题而添加的小值, µ µ µ和 σ 2 σ^2 σ2分别定义为平均值和方差:
Any-Precision Deep Neural Networks在训练过程中,BatchNorm Layer不断计算 µ µ µ和 σ 2 σ^2 σ2的运行平均值,即
Any-Precision Deep Neural Networks其中 µ 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具有灵活的运行时位宽调整能力。
Any-Precision Deep Neural Networks

算法1:对所提出的任意精度DNN进行训练
要求:给定的候选位宽 P ← { n k } k = 1 K P \leftarrow\left\{n_{k}\right\}_{k=1}^{K} P←{nk​}k=1K​

  1. 使用浮点值参数初始化模型 M \mathcal{M} M
  2. 初始化 K K K个BatchNorm层: Φ k = 1 K \Phi_{k=1}^{K} Φk=1K​
  3. for t = 1 , … , T i t e r s t=1, \ldots, T_{i t e r s} t=1,…,Titers​ do
  4.   采样批次数据集 ( x , y ) (x,y) (x,y)来自训练集 D t r a i n D_{train} Dtrain​
  5.   for n p n_p np​ in P P P do
  6.     设置量化位宽 N ← n p N \leftarrow n_{p} N←np​
  7.     前馈传递: y n p ← M ( x ) y_{n_{p}} \leftarrow \mathcal{M}(x) ynp​​←M(x)
  8.     设置Batchnorm层 M.replace ( Φ p ) \left(\Phi_{p}\right) (Φp​)
  9.      L ← L + loss ⁡ ( y n p , y ) L \leftarrow L+\operatorname{loss}\left(y_{n_{p}}, y\right) L←L+loss(ynp​​,y)
  10.    end for
  11. 返回传播以更新网络参数
  12. 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%。

上一篇:PTA 6-1 歌唱比赛打分(函数题)题解


下一篇:DMPQ2Iracac红光铱(Ir)配合物|Ir(dfbpy)2(bpy)+PF6-|Ir(dfbpy)2(pyq)+PF6-|Ir(dfbpy)2(quqo)+PF6-科研试剂