Paper Reading||Differentiable Dynamic Quantization with Mixed Precision and Adaptive Resolution

论文(ICML 2021 Accepted):https://arxiv.org/abs/2106.02295
暂无源码

1 Motivation

  1. 不同的网络架构在不同的层中分配的内存和计算复杂度是不同的
    ,会导致量化处于次优状态,特别是当量化参数(如比特宽度、动态范围和步长)逐层冻结训练时(可以参考 PROFIT)。
  2. (在没有 STE 之前,)基于梯度的低比特宽度模型训练是困难的,因为先前量化函数的梯度可能会消失,即量化后的 DNN 在反向传播时可能返回零梯度。
  3. 量化往往会在轻量级架构上表现较差,如 MobileNet 系列。这主要因为这些模型已经是高效和紧凑的,没有太多的量化空间。

  作者主要讨论了 Motivation 3。一般大家认为模型中的 Weight 统计分布都是钟形分布,这就不适用于 MobileNet 系列、EfficientNet 系列、ShuffleNet 系列,如 Fig 1 (b)(c)(d) 的分布图均是 MobileNet 系列中可能的 Weight 分布。这些不常规的分布尤其出现在深度可分离卷积层和组卷积层中。一个直观的感受是,这些不同的分布形状会偏好不同的量化参数,如位宽(Bit-width)、量化电平(Quantization Level)、量化间隔(Interval)、动态范围(Dynamic Range)等。
在这里插入图片描述

  综上所述,作者提出了自己的方法,DDQ:可以针对不同的模型架构来可微地学习对应的量化参数,包括位宽、量化电平和动态范围。形象的解释还是如 Fig 1 所示。图中 (a) 列比较了均匀量化曲线和二的幂次量化曲线,意在说明,二的幂次量化往往能更有效地作用于钟形分布,以减小量化误差。而 (b)(c)(d) 列的量化曲线均来自于 DDQ,也就是说 DDQ 会根据数据的分布情况,找出 Dense Region,然后做出类似二的幂次量化的量化。Dense Region 可以有多个,如 (d) 中的双峰分布,就导致了曲线中有两个 Dense Region。

  作者提到 DDQ 的三个好处:

  • 其适用于高效且紧凑的模型框架,能根据不同的层的情况来定制不同的量化参数以达到更高的准确度。
  • 其对硬件友好,很容易利用通用矩阵乘(GEMM,General Matrix Multiplication)来部署在 ARM 架构上。设 b b b 为位宽,DDQ还能利用矩阵再参数化的方法将矩阵的储存空间从 O ( 2 2 b ) O(2^{2b}) O(22b) 压缩至 O ( l o g 2 b ) O(log2^{b}) O(log2b)
  • 广泛的实验表明 DDQ 在 ImageNet 和 CIFAR10 上比以往的量化算法表现要好,且第一次能在 MobileNet 上几乎不损失准确度地量化到 4-bit。

2 Method

2.1 Preliminary and Notations

  在模型量化中,一个连续的值 x ∈ R x \in \mathbb{R} xR 会被量化成离散的值 x q x_{q} xq ,来自于集合 q = [ q 1 , q 2 , . . . , q n ] T \bm{q}=[q_{1}, q_{2}, ..., q_{n}]^{\mathsf{T}} q=[q1,q2,...,qn]T 。集合 q \bm{q} q 内的元素就是量化电平,其中 x q ∈ q x_{q} \in \bm{q} xqq n = 2 b n=2^{b} n=2b b b b 为位宽。目前的量化方法就是通过均匀量化或二的幂次量化来映射 q \bm{q} q 。设量化有关参数集为 θ = { b , c } T \bm{\theta}=\{b,c\}^{\mathsf{T}} θ={b,c}T c c c 为表征对称范围的截断阈值, x ˉ \bar{x} xˉ 为量化零点。

  • 均匀量化:虽然均匀量化可能简单有效,但它假设权重分布是均匀的,这在许多 DNN 中是不可靠的。一个 b-bit 对称均匀量化器的量化电平 q u q_{u} qu 为:

在这里插入图片描述

  • 二的幂次量化:其可以产生一个 Dense Region 来集中表达单峰钟形分布。当然通过预定义组合方案也可以产生多个 Dense Region、表达多个峰。一个 b-bit 对称的二的幂次量化器的量化电平 q p q_{p} qp 为:

在这里插入图片描述
  以上这两个量化器均会固定码本 q \bm{q} q 然后优化量化尺度(或称为量化步长) d d d 和截断阈值 c c c 。但它们有一个明显的缺点——即量化电平是预定义的,这就无法适应训练期间每个层的权重或激活的不同分布。

2.2 Dynamic Differentiable Quantization (DDQ)

Formulation for Arbitrary Quantizaion

  DDQ 则会学习所有的量化参数,即还会学习量化电平。设有一个函数 Q ( x ; θ ) Q(x;\bm{\theta}) Q(x;θ) 能将连续值 x x x 转换成 x q x_{q} xq x q ∈ q x_{q}\in \bm{q} xqq ,即 x q = Q ( x ; θ ) x_{q}=Q(x;\bm{\theta}) xq=Q(x;θ) ,其中 q \bm{q} q 初始化为均匀量化的格式。设 x o i ∈ x o x^{i}_{o} \in \bm{x_{o}} xoixo x o ∈ { 0 , 1 } n × 1 \bm{x_{o}} \in \{0, 1\}^{n \times 1} xo{0,1}n×1 ,其中 x o \bm{x_{o}} xo 为二进制 One-hot 向量,用于选取量化电平。设 U ∈ { 0 , 1 } n × n \bm{U} \in \{0, 1\}^{n \times n} U{0,1}n×n 为二进制分块对角矩阵, n n n 为量化电平个数, Z U Z_{U} ZU 为一个用于均衡离散值的常数标准化因子。DDQ 就由下面的低精度矩阵向量乘积公式表示:

在这里插入图片描述
  其中 q \bm{q} q 会被 q ~ \bm{\tilde{q}} q~ 重新设置,如下:

在这里插入图片描述

  其中 R ( ⋅ ) R(\cdot) R() 为将 q ~ \tilde{\bm{q}} q~ 变为 b q b_{q} bq 比特表征数的均匀量化函数( b q < b b_{q} < b bq<b)。于是公式 (3) 就有可学习参数 θ = { q ~ , U } \bm{\theta}=\{\tilde{\bm{q}},\bm{U}\} θ={q~,U} ,接受 SGD 梯度更新,让 DDQ 能自动捕获全精度的权重分布,如 Fig (b) (c) (d) 所示的那样。直观地说,就是不同的 x o , U , q x_{o}, \bm{U}, \bm{q} xo,U,q 使得 DDQ 能实现不同的量化方法。为了方便理解,Fig 2 (a) 比较了 DDQ 和 其他 Rounding-based 方法的计算图。可以发现 DDQ 的所有量化电平都会被学习,而不是像现有技术那样仅学习量化尺度 d d d

在这里插入图片描述

Discussions of Representation Capacity

  DDQ能够表征成的量化方法非常广泛。当 公式 (1)中的 q = q u \bm{q}=\bm{q}_{u} q=qu Z U = 1 Z_{U}=1 ZU=1 U = I \bm{U}=\bm{I} U=I I \bm{I} I 为单位矩阵时,公式 (3) 就可以表示成均匀量化。当 公式 (2) 的 q = q p \bm{q}=\bm{q}_{p} q=qp Z U = 1 Z_{U}=1 ZU=1 U = I \bm{U}=\bm{I} U=I 时,公式 (3) 就可以表示成二的幂次量化。当 q \bm{q} q 被梯度更新时,DDQ 就可以表示具有不同密集区域的任意量化电平。
  此外,当 U \bm{U} U 为分块对角阵时,DDQ 就可以表示成混合精度量化。例如,如 Fig 2 (b) 所示,当 q \bm{q} q 的长度为8(即位宽为 3 bit ), Z U = 1 2 Z_{U}=\frac{1}{2} ZU=21 U = D i a g ( 1 2 × 2 , ⋅ ⋅ ⋅ , 1 2 × 2 ) \bm{U}=\mathrm{Diag}(\bm{1}_{2 \times 2}, ···, \bm{1}_{2 \times 2}) U=Diag(12×2,,12×2) D i a g ( ⋅ ) \mathrm{Diag}(\cdot) Diag() 能够产生对角分块并填入相应值的矩阵(其余位置为0), 1 2 × 2 \bm{1}_{2 \times 2} 12×2 表示一个 2 × 2 2 \times 2 2×2 的值为1的矩阵,于是在公式 (3) 中 U \bm{U} U 能通过加权 q \bm{q} q 中相邻的离散值来表征成一个 2-bit 量化器。再例如,当 U = D i a g ( 1 4 × 4 , ⋅ ⋅ ⋅ , 1 4 × 4 ) \bm{U}=\mathrm{Diag}(\bm{1}_{4 \times 4}, ···, \bm{1}_{4 \times 4}) U=Diag(14×4,,14×4) Z U = 1 4 Z_{U}=\frac{1}{4} ZU=41 时,公式 (3) 就会变成一个 1-bit 量化器。并且,当 x o \bm{x_{o}} xo 为软 One-hot 向量(即有多个元素是非零的)时,公式 (3) 就能表示成软量化(Soft Quantization)。

Efficient Inference on Hardware

  DDQ 是一个统一的量化器,既支持自适应梯度更新的 q \bm{q} q 又支持预定义成均匀量化或二的幂次量化的超参数的 q \bm{q} q 。其对资源有限的硬件很友好。当 DDQ 作为均匀量化,部署要硬件上时,会用正常的 Round 操作和 Scale 操作来完成量化,而没有 U \bm{U} U 和矩阵-向量乘积。并且,当 DDQ 的 q \bm{q} q 为自适应梯度更新时,还可以使用 通用矩阵乘(GEMM)。例如,设 y y y 为神经元的 Activation, x q x_{q} xq 为上一层的 Feature Map 离散值, w w w 为待量化的连续权重值, U \bm{U} U 为二进制矩阵, w o \bm{w}_{o} wo 为 One-hot 向量,那么就有公式 y = Q ( w ; θ ) x q = q T U Z U w o x q y=Q(w; \bm{\theta})x_{q}=\bm{q}^{\mathsf{T}} \frac{\bm{U}}{Z_{U}}\bm{w}_{o}x_{q} y=Q(w;θ)xq=qTZUUwoxq 。于是就能利用 GEMM 来加速 U Z U w o x q \frac{\bm{U}}{Z_{U}}\bm{w}_{o}x_{q} ZUUwoxq 的计算,然后再乘与 1-d 向量 q \bm{q} q。这个 q \bm{q} q 是所有的卷积权重共享的,其可以在所要求的硬件环境中置为 Float32、Float16 或 INT8。

2.3 Matrix Reparameterization of U

  在公式 (3) 中, U \bm{U} U 是一个可学习矩阵变量,其比较棘手,表现在两方面:

  • 为了保证 DDQ 为一个有效的量化器, U \bm{U} U 必须为二进制的块对角结构,而直接使用 SGD 作用于整个矩阵则会破坏这个结构。
  • 当位宽增大(如 2 2 b 2^{2b} 22b), U \bm{U} U 的参数个数也会增多。
    为了解决以上问题,作者通过一系列的小矩阵来显示合成构造 U \bm{U} U ,再用于前向传播。

A Kronecker Composition for Quantization

   U \bm{U} U 的参数可以由 2 2 b 2^{2b} 22b 减少成 l o g 2 b \mathrm{log}2^{b} log2b 。设一系列 2 × 2 2 \times 2 2×2 大小的矩阵构成集合 { U 1 , U 2 , ⋅ ⋅ ⋅ , U b } \{\bm{U}_{1}, \bm{U}_{2}, ···,\bm{U}_{b}\} {U1,U2,,Ub} ,那么 U \bm{U} U 就可以写成 U = U 1 ⊗ U 2 ⊗ ⋅ ⋅ ⋅ ⊗ U b \bm{U}=\bm{U}_{1} \otimes \bm{U}_{2} \otimes··· \otimes \bm{U}_{b} U=U1U2Ub ,其中 ⊗ \otimes 指的是克罗内克积(Kronecker Product)。每个 U i ( i = 1 , ⋅ ⋅ ⋅ , b ) \bm{U}_{i} (i=1, ···,b) Ui(i=1,,b) 要么为单位矩阵(定义为 I I I),要么为全1矩阵(定义为 1 2 × 2 \bm{1}_{2\times2} 12×2 ),共同组成块对角矩阵 U \bm{U} U
  为了进一步压缩储存空间,作者为每个 U i \bm{U}_{i} Ui 定义了可学习的门值参数(Gate Value),表示为 U i = g i I + ( 1 − g i ) 1 2 × 2 \bm{U}_{i}={g}_{i}\bm{I}+(1-{g}_{i})\bm{1}_{2\times2} Ui=giI+(1gi)12×2 ,其中 g i = H ( g i ^ ) {g}_{i}=H(\hat{{g}_{i}}) gi=H(gi^) H ( ⋅ ) H(\cdot) H() 为海维赛德阶跃函数(输入大于等于0则输出为1,反之为输出为0),也就是说 g i {g}_{i} gi 为二进制值。形象展示如 Fig 2 (c) 所示。也就是说,可学习参数不是整个 U \bm{U} U,而是 { g ^ i } i = 1 b \{\hat{{g}}_{i} \}^{b}_{i=1} {g^i}i=1b ,就能显著地减少参数量,从 2 b × 2 b = 2 2 b 2^{b} \times 2^{b}=2^{2b} 2b×2b=22b 变为 b b b
  在克罗内克积作用下,DDQ 的量化参数变为 θ = { q , { g ^ i } i = 1 b } \bm{\theta}=\{ \bm{q}, \{\hat{{g}}_{i} \}^{b}_{i=1}\} θ={q,{g^i}i=1b} ,可以根据 Per-channel 或 Per-tensor 力度来独立设置。

2.4 Discussions of Relationship between U \bm{U} U and g \bm{g} g

  设 g = [ g 1 , ⋅ ⋅ ⋅ , g b ] T \bm{g}=[g_{1}, ···, g_{b}]^{\mathsf{T}} g=[g1,,gb]T ,在用 g \bm{g} g 来表征 U \bm{U} U 时,需要注意以下两点:

  • 排序。如 Fig 2 (c) 所示, g \bm{g} g 内元素的不同的排序会导致不同的 U \bm{U} U。当 g \bm{g} g 内元素按照降序排列时,得到的 U \bm{U} U 就是个正常合法的量化器;反之,当 g \bm{g} g 内元素没有降序排列时,得到的 U \bm{U} U 就不是块对角矩阵了,这就不正常,不能称作量化器了。
  • 门值加和。设门值总和为 s = ∑ i = 1 b g i s=\sum_{i=1}^{b}g_{i} s=i=1bgi 0 ≤ s ≤ b 0\le s\le b 0sb U \bm{U} U 是有 2 s 2^{s} 2s 个对角块的块对角矩阵,那么 U T q \bm{U}^{\mathsf{T}}q UTq 就有 2 s 2^{s} 2s 个不同的离散值,表征一个 s-bit 量化器。需要提的一点是,DDQ 允许在给定内存条件下约束每一力度(Per-tensor 或 Per-channel)的 s s s 值,以便可以将最佳比特宽度分配给 DNN 的不同层或核。

3 Training DNN with DDQ

  DDQ 取得的结果一般是混合精度的,以最大化限定储存空间下的性能。

3.1 DNN with Memory Constraint

  假设一个 DNN 有 L L L 层,那么每一层的前向传播计算公式如下:
在这里插入图片描述
  其中 ∗ * 指卷积计算, y l \bm{y}^{l} yl y l − 1 \bm{y}^{l-1} yl1 分别指 l l l-th 层的输出和输入。 F {F} F 为激活函数, Q {Q} Q 为 DDQ 的量化操作。设 W l ∈ R C o u t l × C i n l × K l × K l \bm{W}^{l} \in \mathbb{R}^{C^{l}_{out} \times C^{l}_{in} \times K^{l} \times K^{l}} WlRCoutl×Cinl×Kl×Kl 为核权重, b l \bm{b}^{l} bl 为 Bias, C o u t C_{out} Cout 为输出通道数, C i n C_{in} Cin 为输入通道数, K K K 为卷积核尺寸。 { g i l } i = 1 b \{g_{i}^{l} \}^{b}_{i=1} {gil}i=1b l l l-th 层的门值集,而该层的位宽设为 s l = ∑ i = 1 b g i l s^{l}=\sum_{i=1}^{b}g_{i}^{l} sl=i=1bgil。设一个模型的所有 Weight 占用的储存空间为 ζ \zeta ζ ,则有:

在这里插入图片描述
  如果说给定最大限度的储存空间为 ζ ( b 1 , ⋅ ⋅ ⋅ , b L ) \zeta (b^{1},···,b^{L}) ζ(b1,,bL) ,由帕累托最优解课近似损失函数为:

在这里插入图片描述
  可见损失函数被重新加权过了。 α \alpha α 是超参数,当满足储存限制时,置 α = 0 \alpha=0 α=0 ;当惩罚机制起作用时,置 α < 0 \alpha <0 α<0

3.2 Updating Quantization Parameters

  该章节详细描述了各个量化参数的更新方式。往后的公式里为了简便会忽略 ‘ l ’ ‘l’ l 上标。

Gradients with Respect to q \bm{q} q

  为了更新 q \bm{q} q,作者又设了个可学习参数 q ~ \tilde{\bm{q}} q~,有 q = R ( q ~ ) ( x m a x − x m i n ) 2 b − 1 + x m i n \bm{q}=\frac{R(\tilde{\bm{q}})(x_{max}-x_{min})}{2^{b}-1}+x_{min} q=2b1R(q~)(xmaxxmin)+xmin ,以保证每个量化电平均在 [ x m i n , x m a x ] [x_{min}, x_{max}] [xmin,xmax] 中,其中 x m a x x_{max} xmax x m i n x_{min} xmin 为一个层的 Weight 的原精度最值。 R ( ⋅ ) R(\cdot) R() 定义为均匀量化函数,能将 q ~ \tilde{q} q~ 转换为 b q b_{q} bq 比特 ( b q < b ) (b_{q}<b) (bq<b) 。对于 q \bm{q} q 中的每一个 q k q_{k} qk,有如下梯度:

在这里插入图片描述
  其中 x q i = Q ( x i ; θ ) x_{q}^{i}=Q(x^{i}; \bm{\theta}) xqi=Q(xi;θ) ,是 DDQ 量化器的输出。 S k \mathcal{S}_{k} Sk 表示离散到对应量化级别 q k q_{k} qk 的值的索引集。观察 公式 (8),可以发现 q k q_{k} qk 的梯度是 ∂ L ∂ x q i \frac{\partial \mathcal{L}}{\partial x_{q}^{i}} xqiL ,即说明在 Dense Region 中的量化级别将具有更大的梯度。

  至于门值 { g i } i = 1 b \{ g_{i}\}_{i=1}^{b} {gi}i=1b 的梯度,会在 Appendix A 中展示(附录没找到)。

Gradient Correction for x q \bm{x}_{q} xq

  为了减少量化误差 ∣ ∣ x q − x ∣ ∣ 2 2 ||\bm{x}_{q}-\bm{x}||_{2}^{2} xqx22,作者提出了一个“梯度修正项”来正则化 x q \bm{x}_{q} xq 的梯度:

在这里插入图片描述
  上式的第一个公式使用到了 STE。如此一来,修正过的梯度就能通过反向传播到公式 (8) 里的 q \bm{q} q { g i } i = 1 b \{ g_{i}\}_{i=1}^{b} {gi}i=1b 上,且不会影响 x \bm{x} x 的梯度。该梯度修正项是有效的,可以被理解为对 ∣ ∣ x q − x ∣ ∣ 2 2 ||\bm{x}_{q}-\bm{x}||_{2}^{2} xqx22 做了 ℓ 2 \ell_{2} 2 正则化。但是这不等价于直接在损失函数上施加 ℓ 2 \ell_{2} 2 正则化,否则由于 STE 作用,其会无效。

Implementation Details

  DDQ 可以很容易地在 Pytorch、TensorFlow 等框架上实现。需要注意的是,以下梯度用到了 STE 思想:

  • ∂ x q ∂ x = 1 \frac{\partial x_{q}}{\partial x}=1 xxq=1 q ^ m i n ≤ x ≤ q ^ m a x \hat{q}_{min} \le x \le \hat{q}_{max} q^minxq^max q ^ m i n \hat{q}_{min} q^min q ^ m a x \hat{q}_{max} q^max q ^ = U T q \hat{\bm{q}}=\bm{U}^{\mathsf{T}} \bm{q} q^=UTq
  • ∂ g k ∂ g ^ k = 1 \frac{\partial g_{k}}{\partial \hat{g}_{k}}=1 g^kgk=1 ∣ g ^ k ∣ ≤ 1 |\hat{g}_{k}| \le 1 g^k1

  更多细节展示在 Algorithm 1 中。
在这里插入图片描述

4 Experiments

  如果没有特殊说明,作者的所有实验都是在 b q = 8 b_{q}=8 bq=8 下进行的。

4.1 Evaluation on ImageNet

在这里插入图片描述
  Table 1 比较了 DDQ 和现有模型。

在这里插入图片描述
  Fig 3 展示了DDQ训练的MobileNetv2和ResNet18的每层的 Weight 的位宽的收敛结果(初始化为 8-bit)。作者发现:

  • 这两种网络都倾向于在较浅的层中应用更多的比特宽度,较浅的层具有较少的参数,因此较少受到内存约束的影响。这允许学习更好的功能表示,从而减少性能下降。
  • 深度卷积比常规卷积具有更大的比特宽度。不规则权重分布的深度卷积是导致MobileNet量化困难的主要原因。通过混合精度训练,DDQ为深度卷积分配了更多的比特宽度,以缓解这一困难。

  Fig 4 更细致地展现了 ResNet18 下 DDQ 通过减小逐层位宽度,为每个层分配适当精度的过程(作者说这是 4-bit 的结果,我觉得有点不太理解,每一层的位宽都不一样呀,怎么能统称为 4-bit 呢)。
在这里插入图片描述

4.2 Ablation Study

Ablation Study I: mixed versus fixed precision

  还是参考 Table 1,同时作者也做了有关实验,如 Table 2 所示。

在这里插入图片描述

Ablation Study II: adaptive resolution

  接着作者固定 U \bm{U} U (即位宽固定了),只更新 q \bm{q} q,实验结果展示于 Table 3 中。

在这里插入图片描述

Ablation Study III: gradient correction

  Fig 5 (a) 展示的是量化误差收敛曲线。Fig 5 (b) 展示的是量化电平的可视化结果。当然作者的实验也部分展示在 Table 3 中。

在这里插入图片描述

4.3 Evaluation on Mobile Devices

  作者在 Table 4 中进一步评估了移动平台上的DDQ对准确性和延迟的权衡表现。具体细节展示在 Appendix C 中。

在这里插入图片描述

个人思考

  • 个人感觉作者写的不是很好,比如一张图里的信息量太大了,居然需要三、四个小节的上下文串联才能看懂在干嘛,比如 Fig 2 (c) 中,非块对角矩阵居然是错误示例,但是一开始我一直以为是对的,直到我看到了 2.3 节。
  • 首先比较好奇的是 x o i x^{i}_{o} xoi 是怎么来的,但作者没有先阐述,导致接下来的阅读中一直在想这个事情。
  • 梯度修正项好像有问题。个人感觉吧,或许是因为我笨没理解到位。
  • 为什么是对硬件友好呢?作者的部署应该是利用了 FBGEMM,利用通用矩阵乘?部署在手机上?
  • 作者对所有的层的 Weight 都进行量化了,但是作者自己跑了其他方法的实验,其他方法的实验也是Weight全都量化吗?
  • 附录没找着在哪里获取,有机会看见了再整理了。
  • 公式 (4) 的 R ( ⋅ ) R(\cdot) R() 函数公式是什么,这我有点不太明白。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值