note_三元量化中的Weight Grouping

读在前面:
三元量化中的 group 方法是指,通过逐渐增加全精度权重量化的比例来减小量化带来的误差。量化误差可以表达为:
∥ y − x ⊤ w ∥ 2 2 ≤ ∥ y − x ⊤ ( r w + ( 1 − r ) Q ( w ) ) ∥ 2 2 ≤ ∥ y − x ⊤ Q ( w ) ∥ 2 2 , \begin{gathered} \|\mathbf{y}-\mathbf{x}^{\top}\mathbf{w}\|_{2}^{2} \leq\|\mathbf{y}-\mathbf{x}^{\top}(r\mathbf{w}+(1-r)\mathbb{Q}(\mathbf{w}))\|_{2}^{2} \\ \leq\|\mathbf{y}-\mathbf{x}^{\top}\mathbb{Q}(\mathbf{w})\|_{2}^{2}, \end{gathered} yxw22yx(rw+(1r)Q(w))22yxQ(w)22,其中, r r r 控制着量化的比例。

本博客中文献笔记总结:

文献索引量化精度缩放因子求解量化损失函数定义增加精度方式适用算法
多bit( 2 2 2的幂次)\ E ( W l ) = L ( W l ) + λ R ( W l ) E(\mathbf{W}_l)=L(\mathbf{W}_l)+\lambda R(\mathbf{W}_l) E(Wl)=L(Wl)+λR(Wl)重训练CNN(all)
2/3 bit α l = m e a n ( W l ) + β m a x ( W l ) , β = 0.05 \alpha_{l}=mean(W_{l})+\beta max(W_{l}),\\\beta=0.05 αl=mean(Wl)+βmax(Wl),β=0.05 L ( W l ) + a 1 L p ( W l , W l ^ ) + a 2 E ( W l , W l ^ ) L(W_l)+a_1L_p(W_l,\widehat{W_l})+a_2E(W_l,\widehat{W_l}) L(Wl)+a1Lp(Wl,Wl )+a2E(Wl,Wl )重写量化损失+重训练DNN
\\\重训练all
多bit最小二乘法求解 E x ∼ N ( 0 , 1 ) , x > ϵ [ ( Q ϵ ( x ) − x ) 2 ] , 利用稀疏度 ϵ E_{x\sim\mathcal{N}(0,1),x>\epsilon}[(Q_\epsilon(x)-x)^2], \text{利用稀疏度}\epsilon ExN(0,1),x>ϵ[(Qϵ(x)x)2],利用稀疏度ϵ ∑ { α i } , { w ^ i T } ∥ y i T − Q ϵ ( α i w ^ i T X ) ∥ 2 2 \sum_{\{\alpha_i\},\{\hat{w}_i^T\}}\parallel y_i^T-Q_\epsilon(\alpha_i\hat{w}_i^TX)\parallel_2^2 {αi},{w^iT}yiTQϵ(αiw^iTX)22解耦量化“权重”和“激活”DNN
3 bit α ∗ = ( ∑ i ∈ I Δ ∣ W i ∣ ) / ∣ I Δ ∣ \alpha^{*}=(\sum_{i\in I_{\Delta}}\vert\mathbf{W}_{i}\vert)/\vert I_{\Delta}\vert α=(iIΔWi)/∣IΔ ∑ i argmin ⁡ α i , W ^ ( i ) ∣ W ( i ) − α i W ^ ( i ) ∣ F 2 \sum_{i}\underset{\alpha_{i},\hat{\mathbf{W}}^{(i)}}{\operatorname*{argmin}}|\mathbf{W}^{(i)}-\alpha_{i}\hat{\mathbf{W}}^{(i)}|_{F}^{2} iαi,W^(i)argminW(i)αiW^(i)F2分组解析分析all
3 bit向后传播动态得到\pixel-wise和row-wise两种分组方式DNN(CNN)
3 bitNP问题,贪心策略 minimize ⁡ { x i } , { d i } , { y i } ∥ W − ∑ i k d i x i y i T ∥ F 2 \underset{{\{x_i\},\{d_i\},\{y_i\}}}{\operatorname{minimize}}\parallel W-\sum_i^kd_ix_iy_i^T\parallel_F^2 {xi},{di},{yi}minimizeWikdixiyiTF2权重矩阵的不动点分解all

下面是如下这篇综述中关于“Weight Grouping”部分引用文献的笔记:

作者综述笔记:Ternary Quantization: A Survey
原文链接:Ternary Quantization: A Survey

一、INCREMENTAL NETWORK QUANTIZATION: TOWARDS LOSSLESS CNNS WITH LOW-PRECISION WEIGHTS

Zhou A, Yao A, Guo Y, et al. Incremental network quantization: Towards lossless cnns with low-precision weights[J]. arXiv preprint arXiv:1702.03044, 2017.
ICLR 2017(此会虽无CCF等级,但是是人工智能顶会)

1. 动机和贡献

动机: 虽然 CNN 的量化已经取得了一些进步,但是依然面临着两个重要的问题:

  • CNN量化过程中不可避免的精度损失;
  • 与全精度权重训练模型相比,量化后模型需要增加更多轮数使得模型收敛。

贡献: 本文提出一种 incremental network quantization(INQ)CNN量化框架,在没有对CNN结构做出任何限制性假设的前提下,可以有效地将已经预训练好的全精度CNN模型(例如:32bit)转化为低精度模型(权重值限制到 2 2 2 的幂次或者是 0 0 0)。相比于其他一次性将全部权重都进行量化的技术,本文通过考虑不同网络权重的重要程度不同,对其进行分批次的量化,主要包括如下几个步骤:

  1. weight partition:将全精度权重分为两个互不相交的 “组group”;
  2. group-wise quantization:将一个组中的权重量化,另一个组保持不变;
  3. re-training:固定已量化后的组中的值,重新训练模型,改变另一个组中的值。

注:本文中将权重量化为 2 2 2 的幂次或者是 0 0 0的目的是:将全精度权重的浮点数乘法运算变成二进制移位运算,以达到降低计算复杂度的作用。

2. 算法表示

2.2 weight partition

对于第 l l l 层, weight partition 可以定义为:
A l ( 1 ) ∪ A l ( 2 ) = { W l ( i , j ) } , a n d   A l ( 1 ) ∩ A l ( 2 ) = ∅ , \mathbf{A}_{l}^{(1)}\cup\mathbf{A}_{l}^{(2)}=\{\mathbf{W}_{l}(i,j)\},\mathrm{and}~\mathbf{A}_{l}^{(1)}\cap\mathbf{A}_{l}^{(2)}=\emptyset, Al(1)Al(2)={Wl(i,j)},and Al(1)Al(2)=,同时定义一个二元矩阵 T l ( i , j ) \mathbf{T}_l(i,j) Tl(i,j) 作为掩码,即:
{ T l ( i , j ) = 0 if  W l ( i , j ) ∈ A l ( 1 ) T l ( i , j ) = 1 if  W l ( i , j ) ∈ A l ( 2 ) \left\{\begin{matrix} \mathbf{T}_l(i,j)=0 & \text{if}~\mathbf{W}_l(i,j)\in\mathbf{A}_l^{(1)}\\ \mathbf{T}_l(i,j)=1 & \text{if}~\mathbf{W}_l(i,j)\in\mathbf{A}_l^{(2)} \end{matrix}\right. {Tl(i,j)=0Tl(i,j)=1if Wl(i,j)Al(1)if Wl(i,j)Al(2)

对于分组策略,本文中提出了两种方案:

  • random partition:随机的将待分权重分成不相交的两个组;
  • pruning-inspired partition:给一个以层为单位的阈值,绝对值大于此阈值的权重更有可能被分到同一组进行量化。(原因是:本文认为绝对值大的权重要性更大)

2.2 group-wise quantization: 使用变长编码的权重量化

假设 CNN 模型的权重可以表示为 { W l : 1 ≤ l ≤ L } \{{\mathbf{W}}_{l}:1\leq l\leq L\} {Wl:1lL},其中 W l {\mathbf{W}}_{l} Wl 表示第 l l l 层权重值集合, L L L 表示总层数;量化后低精度模型权重表示为 w ^ l \widehat{\mathbf{w}}_{l} w l,它的每一个元素取值都从集合 P l \mathbf{P}_l Pl 中选取:
P l = { ± 2 n 1 , ⋯   , ± 2 n 2 , 0 } , \mathbf{P}_l=\{\pm2^{n_1},\cdots,\pm2^{n_2},0\}, Pl={±2n1,,±2n2,0},其中, n 1 ≥ n 2 n_1\geq n_2 n1n2 是两个整数。

INQ 的量化规则为:
W ^ l ( i , j ) = { β sgn ( W l ( i , j ) ) if  ( α + β ) / 2 ≤ abs ( W l ( i , j ) ) < 3 β / 2 0 otherwise , \widehat{\mathbf{W}}_l(i,j)=\begin{cases}\beta\text{sgn}(\mathbf{W}_l(i,j))&\text{if}~(\alpha+\beta)/2\leq\text{abs}(\mathbf{W}_l(i,j))<3\beta/2\\0&\text{otherwise},\end{cases} W l(i,j)={βsgn(Wl(i,j))0if (α+β)/2abs(Wl(i,j))<3β/2otherwise,其中, α , β \alpha,\beta α,β 表示集合 P l \mathbf{P}_l Pl 中的相邻的两个元素。那么,如何得到集合 P l \mathbf{P}_l Pl 中的元素,即得到 n 1 , n 2 n_1,n_2 n1,n2 的值?首先,定义 n 1 n_1 n1 的取值为:
n 1 = floor ( log ⁡ 2 ( 4 s / 3 ) ) , n_1=\text{floor}(\log_2(4s/3)), n1=floor(log2(4s/3)),其中,
s = max ⁡ ( abs ⁡ ( W l ) ) . s=\max(\operatorname{abs}(\mathbf{W}_{l})). s=max(abs(Wl)).因此,当确定量化维数 b b b 后,可以得到 n 2 n_2 n2 的值为:
n 2 = n 1 + 1 − 2 ( b − 1 ) 2 , n_2=n_1+1-\frac{2^{(b-1)}}{2}, n2=n1+122(b1),下图是关于上述量化过程的一个示意图:
量化示意图

2.3 re-training

根据上面描述,重训练需要优化的如下目标函数:
min ⁡ W l E ( W l ) = L ( W l ) + λ R ( W l ) s.t. W l ( i , j ) ∈ P l , if  T l ( i , j ) = 0 , 1 ≤ l ≤ L , \begin{array}{rl}\min\limits_{\mathbf{W}_l}&E(\mathbf{W}_l)=L(\mathbf{W}_l)+\lambda R(\mathbf{W}_l)\\\text{s.t.}&\mathbf{W}_l(i,j)\in\mathbf{P}_l,\text{if}~\mathbf{T}_l(i,j)=0,1\le l\le L,\end{array} Wlmins.t.E(Wl)=L(Wl)+λR(Wl)Wl(i,j)Pl,if Tl(i,j)=0,1lL,其中, L ( W l ) L(\mathbf{W}_l) L(Wl) 表示网络损失函数, R ( W l ) R(\mathbf{W}_l) R(Wl) 表示正则项。因此,可以得到如下重训练规则:
W l ( i , j ) ← W l ( i , j ) − γ ∂ E ∂ ( W l ( i , j ) ) T l ( i , j ) , \mathbf{W}_l(i,j)\leftarrow\mathbf{W}_l(i,j)-\gamma\frac{\partial E}{\partial(\mathbf{W}_l(i,j))}\mathbf{T}_l(i,j), Wl(i,j)Wl(i,j)γ(Wl(i,j))ETl(i,j),

综上,总算法流程图为:
在这里插入图片描述

二、Explicit Loss-Error-Aware Quantization for Low-Bit Deep Neural Networks

Zhou, Aojun, et al. “Explicit loss-error-aware quantization for low-bit deep neural networks.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2018.
CVPR 2018 CCF-A

1. 动机和贡献

动机: 现有关于DNN的二元/三元压缩存在测试精度低的问题,可能原因包括:

  • 通过最小化 原始模型和量化后模型的差异 或者 输入与原始模型内积和输入与量化模型内积 这两种方式之一来量化模型;
  • 很多策略都是一次性全部量化模型。

贡献: 本文提出一种基于最小化损失函数的量化技术(ELQ)来解决上述问题:

  • 首先,同时考虑了 “近似误差” 和 “损失扰动” 的影响;
  • 然后,通过增强策略,逐步量化模型参数(仿照“一”中思想)。

2. 主要算法

2.1 预备知识

向量函数的Taylor公式:
带积分余项的泰勒公式

0阶:
f ( x ) = f ( x 0 ) + ⟨ ∫ 0 1 ∇ f ( x 0 + θ ( x − x 0 ) ) d θ , x − x 0 ⟩ f(x)=f(x_0)+\left\langle\int_0^1\nabla f(x_0+\theta(x-x_0))\mathrm{d}\theta,x-x_0\right\rangle f(x)=f(x0)+01f(x0+θ(xx0))dθ,xx0
1阶:
f ( x ) = f ( x 0 ) + ⟨ ∇ f ( x 0 ) , x − x 0 ⟩ + ⟨ ∫ 0 1 ∇ 2 f ( x 0 + θ ( x − x 0 ) ) ( 1 − θ ) d θ ( x − x 0 ) , x − x 0 ⟩ \begin{aligned} f(x)&=f(x_0)+\langle\nabla f(x_0),x-x_0\rangle \\ &+\left\langle\int_{0}^{1}\nabla^{2}f(x_{0}+\theta(x-x_{0}))(1-\theta)\mathrm{d}\theta(x-x_{0}),x-x_{0}\right\rangle \end{aligned} f(x)=f(x0)+f(x0),xx0+012f(x0+θ(xx0))(1θ)dθ(xx0),xx0
带Lagrange余项的泰勒公式

0阶:
f ( x ) = f ( x 0 ) + ⟨ ∇ f ( ξ ) , x − x 0 ⟩ f(x)=f(x_0)+\langle\nabla f(\xi),x-x_0\rangle f(x)=f(x0)+f(ξ),xx0
1阶:
f ( x ) = f ( x 0 ) + ⟨ ∇ f ( x 0 ) , x − x 0 ⟩ + 1 2 ⟨ ∇ 2 f ( ξ ) ( x − x 0 ) , x − x 0 ⟩ f(x)=f(x_0)+\langle\nabla f(x_0),x-x_0\rangle+\frac{1}{2}\left\langle\nabla^2f(\xi)(x-x_0),x-x_0\right\rangle f(x)=f(x0)+f(x0),xx0+212f(ξ)(xx0),xx0
带Peano余项的泰勒公式

0阶:
f ( x ) = f ( x 0 ) + o ( 1 ) f(x)=f(x_0)+o(1) f(x)=f(x0)+o(1)
1阶:
f ( x ) = f ( x 0 ) + ⟨ ∇ f ( x 0 ) , x − x 0 ⟩ + o ( ∥ x − x 0 ∥ ) f(x)=f(x_0)+\langle\nabla f(x_0),x-x_0\rangle+o(\|x-x_0\|) f(x)=f(x0)+f(x0),xx0+o(xx0)
2阶:
f ( x ) = f ( x 0 ) + ⟨ ∇ f ( x 0 ) , x − x 0 ⟩ + 1 2 ⟨ ∇ 2 f ( x 0 ) ( x − x 0 ) , x − x 0 ⟩ + o ( ∥ x − x 0 ∥ 2 ) \begin{gathered}f(x)=f(x_0)+\langle\nabla f(x_0),x-x_0\rangle+\frac{1}{2}\big\langle\nabla^2f(x_0)(x-x_0),x-x_0\big\rangle\\+o(\|x-x_0\|^2)\end{gathered} f(x)=f(x0)+f(x0),xx0+212f(x0)(xx0),xx0+o(xx02)
其中, ⟨ x , y ⟩ \langle x,y\rangle x,y表示 x x x y y y 的内积(i.e. 若 x , y ∈ R d x,y\in\mathbb{R}^d x,yRd,则 ⟨ x , y ⟩ = x T y \langle x,y\rangle=x^Ty x,y=xTy); ∥ x ∥ \|x\| x 表示 x x x 的范数, ∥ x ∥ = ⟨ x , x ⟩ \|x\|=\sqrt{\langle x,x\rangle} x=x,x

简单粗暴地推导Taylor公式的各种形式 - 知乎 (zhihu.com)

2.2 基本 ELQ

首先,定义本文中量化函数的形式为:
Q l = { α l c k ∣ 1 ≤ k ≤ K } {Q_{l}}=\{\alpha_{l}c_{k}|{1}\leq k\leq K\} Ql={αlck1kK}其中, L L L表示量化中心的总个数; α l \alpha_l αl 表示按层收缩因子; c k c_k ck 表示一个正整数。例如,二元量化中, K = 2 , c k ∈ { − 1 , + 1 } K=2,c_k\in\{-1,+1\} K=2,ck{1,+1};三元量化中, K = 3 , c k ∈ { − 1 , 0 , + 1 } K=3,c_k\in\{-1,0,+1\} K=3,ck{1,0,+1}

然后,为了联合考虑“近似误差”和“损失扰动”的影响,ELQ算法中重新定义了优化问题,即:
min ⁡ W l ^ L ( W l ) + a 1 L p ( W l , W l ^ ) + a 2 E ( W l , W l ^ ) s.t. W l ^ ∈ { α l c k ∣ 1 ≤ k ≤ K } , 1 ≤ l ≤ L \begin{array}{ll}\min_{\widehat{W_l}}&L(W_l)+a_1L_p(W_l,\widehat{W_l})+a_2E(W_l,\widehat{W_l})\\\\\text{s.t.}&\widehat{W_l}\in\{\alpha_lc_k|1\le k\le K\},1\le l\le L\end{array} minWl s.t.L(Wl)+a1Lp(Wl,Wl )+a2E(Wl,Wl )Wl {αlck∣1kK},1lL其中, L L L 表示全精度模型的损失函数; L p L_p Lp 表示全精度模型和量化模型损失的差异; E E E 表示全精度模型和量化模型的近似差异; a 1 , a 2 ∈ R + a_1,a_2\in\mathbb{R}^+ a1,a2R+ 表示两个正则化系数。特别的,定义函数 L p , E L_p,E Lp,E 如下:
L p ( W l , W l ^ ) = ∣ L ( W l ) − L ( W l ^ ) ∣ = ( a ) ∣ ∂ L ∂ ( W l ) ∣ δ , E ( W l , W l ^ ) = ∣ ∣ W l − W l ^ ∣ ∣ 2 . \begin{aligned} L_p(W_l,\widehat{W_l})&=|L(W_l)-L(\widehat{W_l})|\overset{(a)}{=}|\frac{\partial L}{\partial(W_{l})}|\delta,\\ E(W_l,\widehat{W_l})&=||W_{l}-\widehat{W_{l}}||^{2}. \end{aligned} Lp(Wl,Wl )E(Wl,Wl )=L(Wl)L(Wl )=(a)(Wl)Lδ,=∣∣WlWl 2.其中,等式 = ( a ) \overset{(a)}{=} =(a) 成立是由于:对函数 L p L_p Lp W l W_l Wl 处进行1阶Taylor展开,得到:
L p ( W l , W ^ l ) = ∣ L ( W l ) − L ( W l ) − ∂ L ∂ ( W l ) ( W l ^ − W l ) ∣ = ∣ ∂ L ∂ ( W l ) ( W l − W l ^ ) ∣ = ∣ ∂ L ∂ ( W l ) ∣ δ , \begin{aligned} L_{p}(W_{l},\widehat{W}_{l})& =|L(W_{l})-L(W_{l})-\frac{\partial L}{\partial(W_{l})}(\widehat{W_{l}}-W_{l})| \\ &=|\frac{\partial L}{\partial(W_{l})}(W_{l}-\widehat{W_{l}})| \\ &=|\frac{\partial L}{\partial(W_{l})}|\delta, \end{aligned} Lp(Wl,W l)=L(Wl)L(Wl)(Wl)L(Wl Wl)=(Wl)L(WlWl )=(Wl)Lδ,其中, δ = ∣ W l − W l ^ ∣ \delta=|W_{l}-\widehat{W_{l}}| δ=WlWl

为了简单起见,本文中假设一个线性关系 ∂ L ∂ ( W l ) ∝ δ \frac{\partial L}{\partial(W_{l})}\propto\delta (Wl)Lδ。因此,得到全精度模型的更新规则是:
W l t = W l t − 1 − γ ∂ L ∂ ( W l t − 1 ) − λ s i g n ( W l t − 1 − W l ^ t − 1 ) , \begin{aligned}W_l^t=W_l^{t-1}-\gamma\frac{\partial L}{\partial(W_l^{t-1})}-\lambda sign(W_l^{t-1}-\widehat{W_l}^{t-1}),\end{aligned} Wlt=Wlt1γ(Wlt1)Lλsign(Wlt1Wl t1),

最后,定义量化函数 Q l Q_l Ql 中的收缩因子 α l \alpha_l αl 为:
α l = m e a n ( W l ) + β m a x ( W l ) , \alpha_{l}=mean(W_{l})+\beta max(W_{l}), αl=mean(Wl)+βmax(Wl),其中, β = 0.05 \beta=0.05 β=0.05表示超参,根据实验所得。那么可以定义二元/三元量化函数为:
W l ^ = { α l if  W l ≥ 0 − α l otherwise , W l ^ = { α l if  W l > 0.5 α l − α l if  W l < − 0.5 α l 0 otherwise . \begin{matrix} \widehat{W_l}=\begin{cases}\alpha_l&\text{if}~W_l\geq0\\-\alpha_l&\text{otherwise},\end{cases} & \widehat{W_l}=\begin{cases}\alpha_l&\text{if}~W_l>0.5\alpha_l\\-\alpha_l&\text{if}~W_l<-0.5\alpha_l\\0&\text{otherwise}.\end{cases} \end{matrix} Wl ={αlαlif Wl0otherwise,Wl = αlαl0if Wl>0.5αlif Wl<0.5αlotherwise.
注:本文没有介绍阈值 Δ \Delta Δ的介绍,只是定义 Δ = 0 \Delta=0 Δ=0或者 Δ = ± 0.5 α l \Delta=\pm0.5\alpha_l Δ=±0.5αl

2.3 ELQ和增量策略的结合

仿照 “一” 中的思想,本文采取逐步量化的策略,即分为 “模型分类、模型量化、重训练” 三个步骤。那么全精度模型的更新规则修改为:
W l t = W l t − 1 − γ ∂ L ∂ ( W l t − 1 ) ⊙ T l − λ s i g n ( W l t − 1 − W l ^ t − 1 ) ⊙ T l W_l^t=W_l^{t-1}-\gamma\frac{\partial L}{\partial(W_l^{t-1})}\odot T_l-\lambda sign(W_l^{t-1}-\widehat{W_l}^{t-1})\odot T_l Wlt=Wlt1γ(Wlt1)LTlλsign(Wlt1Wl t1)Tl其中,矩阵 T l T_l Tl定义为:
T l = { 0 if  W l ⊙ T l ∈ W a , 1 if  W l ⊙ T l ∈ W b , W a ∪ W b = W l   a n d   W a ∩ W b = ∅ . \begin{matrix} T_l=\begin{cases}0&\text{if }W_l\odot T_l\in W_a,\\1&\text{if }W_l\odot T_l\in W_b,\end{cases} & W_a\cup W_b=W_l~\mathrm{and}~W_a\cap W_b=\emptyset. \end{matrix} Tl={01if WlTlWa,if WlTlWb,WaWb=Wl and WaWb=∅.

与 “一” 中的不同点在于 “模型量化” 上。其核心思想是:当权重的训练越靠近量化权重中心时(例如对于三元量化,有3个量化权重中心, − α , 0 , + α -\alpha,0,+\alpha α,0,+α),将更加有利于重训练过程;因此,本文将远离量化权重中心的值量化为中心点,然后进行重训练。这会带来一个问题:如何判断哪些值时远离量化权重中心的呢?本文定义了interval bound factor { σ n ∈ [ 0 , 1 ] ∣ 1 ≤ n ≤ N } \{\sigma_{n}\in[0,1]|1\leq n\leq N\} {σn[0,1]∣1nN}来进行确定。另外,本文根据经验对三元量化选择 { σ 1 = 0.5 , σ 2 = 0.4 , σ 3 = 0.3 , σ 4 = 0.2 , σ 5 = 0.15 , σ 6 = 0.1 , σ 7 = 0.05 , σ 8 = 0 } \{\sigma_{1}=0.5,\sigma_{2}=0.4,\sigma_{3}=0.3,\sigma_{4}=0.2,\sigma_5=0.15,\sigma_6=0.1,\sigma_7=0.05,\sigma_8=0\} {σ1=0.5,σ2=0.4,σ3=0.3,σ4=0.2,σ5=0.15,σ6=0.1,σ7=0.05,σ8=0},文中给出一个示例:
在这里插入图片描述

综上,得出ELQ算法流程为:
在这里插入图片描述

3. 讨论

本文主要创新点如下:

  • 通过综合考虑之前成果中的 近似误差和损失扰动,来重写损失函数,以增加量化后模型的测试精度
  • 模仿 “一” 中的增量量化策略,但修改了分组策略:将远离权重中心点的值最为量化的一组,其余的作为固定的一组,然后精心重训练

缺点如下:

  • 没有详细解释量化函数中的阈值 Δ \Delta Δ,而是直接定义 Δ = 0 \Delta=0 Δ=0或者 Δ = ± 0.5 α l \Delta=\pm0.5\alpha_l Δ=±0.5αl
  • 对新提出的分组策略没有详尽地介绍,即如何得到interval bound factor σ \sigma σ 的取值

三、RPR: Random partition relaxation for training; Binary and ternary weight neural networks

Cavigelli L, Benini L. RPR: Random partition relaxation for training; Binary and ternary weight neural networks[J]. arXiv preprint arXiv:2001.01091, 2020.
arXiv 2020

本文中心思想为:将待量化的权重 W q \mathbb{W}_q Wq 按照 冻结因子 F F = W q c o n s t r W q ∈ [ 0 , 1 ] FF=\frac{\mathbb{W}_q^{constr}}{\mathbb{W}_q}\in[0,1] FF=WqWqconstr[0,1] 随机分为 W q c o n s t r \mathbb{W}_q^{constr} Wqconstr W q r e l a x e d \mathbb{W}_q^{relaxed} Wqrelaxed。首先,选择一个 F F FF FF 的值,将 W q c o n s t r \mathbb{W}_q^{constr} Wqconstr 中的权重量化,然后重训练修改 W q r e l a x e d \mathbb{W}_q^{relaxed} Wqrelaxed,最后重新将为量化之前的 W q c o n s t r \mathbb{W}_q^{constr} Wqconstr 值代入。重复上述过程,直到 F F = 1 FF=1 FF=1 时模型依旧可以收敛,量化后的结果就是最终结果。一个简单的示例如下:
在这里插入图片描述

四、Two-Step Quantization for Low-bit Neural Networks

Wang P, Hu Q, Zhang Y, et al. Two-step quantization for low-bit neural networks[C]//Proceedings of the IEEE Conference on computer vision and pattern recognition. 2018: 4376-4384.
CVPR 2018 CCF-A会

1. 动机和贡献

动机: DNN的量化过程中,需要量化两种参数:“权重”和“激活”,但是当这两种参数同时使用较低精度量化时,模型测试精度下降会十分严重,甚至导致模型不能收敛。
注:和之前不同的是,本文提到了量化“激活”。具体概念在 2.1 中解释。

贡献: 为了解决同时量化 “权重”和“激活” 导致的模型性能下降的问题,本文提出了一种 两步走量化策略TSQ,来解耦权重量化过程和激活量化过程,主要包括如下两个部分:

  1. code learning(量化激活):利用网络中的 “激活稀疏性activation sparsity” 进行量化;
    注:大多文献关注权重的稀疏性,而没有解决激活的稀疏性
  2. transformation function learning(量化权重):当激活量化之后,认为它已经是最忧,然后利用 “最小二乘法” 优化权重。

2. 算法

2.1 量化权重与量化激活

传统DNN的优化问题可以转化为量化后DNN的优化问题,具体表示为:
minimize L ( Z L , y ) subject to Z l = W l A l − 1 A l = ψ ( Z l ) , for l = 1 , 2 , ⋯ L ⇒ t a n s l a t e   i n t o minimize ⁡ { W l } L ( Z L , y ) subject to  W ^ l = Q w ( W l )    Z l = W ^ l A ^ l − 1    A l = ψ ( Z l )    A ^ l = Q a ( A l ) , f o r l = 1 , 2 , ⋯ L \begin{array}{ll}\text{minimize}&\mathcal{L}(Z_L,y)\\\text{subject to}&Z_l=W_lA_{l-1}\\&A_l=\psi(Z_l),\text{for}l=1,2,\cdots L\end{array} \overset{tanslate~into}{\Rightarrow}\quad \begin{aligned} &\operatorname*{minimize}_{\{W_{l}\}} \mathcal{L}(Z_{L},y) \\ &\text{subject to}~ \hat{W}_{l}=Q_{\boldsymbol{w}}(W_{l}) \\ &\qquad\qquad~~ Z_{l}=\hat{W}_{l}\hat{A}_{l-1} \\ &\qquad\qquad~~ A_{l}=\psi(Z_{l}) \\ &\qquad\qquad~~ \hat{A}_{l}={Q}_{\boldsymbol{a}}(A_{l}),\mathrm{for}l=1,2,\cdots L \end{aligned} minimizesubject toL(ZL,y)Zl=WlAl1Al=ψ(Zl),forl=1,2,Ltanslate into{Wl}minimizeL(ZL,y)subject to W^l=Qw(Wl)  Zl=W^lA^l1  Al=ψ(Zl)  A^l=Qa(Al),forl=1,2,L其中, W l W_l Wl 表示第 l l l 层权重, Q w ψ ( ⋅ ) Q_{\boldsymbol{w}}\psi(\cdot) Qwψ() 表示权重量化函数; A l A_l Al 表示第 l l l 层激活( A 0 A_0 A0就是输入数据), Q a {Q}_{\boldsymbol{a}} Qa 表示激活量化函数; ψ ( ⋅ ) \psi(\cdot) ψ() 表示DNN中的激活函数。

2.2 Code Learning(量化激活)

在这个阶段,所有的权重都是全精度的,只有激活会被量化,其核心思想是:绝对值大的激活对网络的左右大于小的,因此,引入稀疏度将所有低于某个阈值的激活设置为 0 0 0,用数学语言定义为:给定一个稀疏阈值(sparse threshold) ϵ \epsilon ϵ,那么量化函数为:
Q ϵ ( x ) = { q i ′ x ∈ ( t i ′ , t i + 1 ′ ] , 0 x ≤ ϵ , \left.Q_\epsilon(x)=\left\{\begin{array}{cl}q_i'&x\in(t_i',t_{i+1}'],\\0&x\leq\epsilon,\end{array}\right.\right. Qϵ(x)={qi0x(ti,ti+1],xϵ,那么,量化函数可以由解决以下优化问题得到:
Q ϵ ∗ ( x ) = a r g m i n Q ϵ E x ∼ N ( 0 , 1 ) , x > ϵ [ ( Q ϵ ( x ) − x ) 2 ] , Q_\epsilon^*(x)=\underset{Q_\epsilon}{\mathrm{argmin}}E_{x\sim\mathcal{N}(0,1),x>\epsilon}[(Q_\epsilon(x)-x)^2], Qϵ(x)=QϵargminExN(0,1),x>ϵ[(Qϵ(x)x)2],最后,稀疏阈值 ϵ \epsilon ϵ定义为:经过 批归一化batch normalization,每层的输出近似为一个标准正太分布 x ∼ N ( 0 , 1 ) x\sim\mathcal{N}(0,1) xN(0,1),因此,给定一个稀疏度 θ \theta θ,稀疏阈值通过解决如下等式得到:
Φ ( ϵ ) = P ( x < = ϵ ) = θ . \Phi(\epsilon)=P(x<=\epsilon)=\theta. Φ(ϵ)=P(x<=ϵ)=θ.

注:上述过程说明,只要获得了稀疏度 θ \theta θ 就可以得到量化函数。那么,如何获得稀疏度 θ \theta θ 呢?本文没有详细说明,我认为是通过预处理过程吗?

2.3 Transformation Function Learning(量化权重)

经过 Code Learning,认为激活的量化已经是最优,表示为 A ^ l \hat{A}_l A^l。这个阶段,主要是考虑如何学习 A ^ l − 1 → A ^ l \hat{A}_{l-1}\rightarrow\hat{A}_{l} A^l1A^l 的转换函数。假设 A ^ l − 1 , A ^ l \hat{A}_{l-1},\hat{A}_l A^l1,A^l 表示为 X , Y X,Y X,Y,那么,转换函数学习问题的解决如同解决如下最小二乘问题:
minimize ∥ Y − Q ϵ ( Λ W ^ X ) ∥ F 2 = minimize ∑ { α i } , { w ^ i T } ∥ y i T − Q ϵ ( α i w ^ i T X ) ∥ 2 2 \begin{aligned}&\text{minimize}\quad\parallel Y-Q_\epsilon(\Lambda\hat{W}X)\parallel_F^2\\=&\text{minimize}\quad\sum_{\{\alpha_i\},\{\hat{w}_i^T\}}\parallel y_i^T-Q_\epsilon(\alpha_i\hat{w}_i^TX)\parallel_2^2\end{aligned} =minimizeYQϵ(ΛW^X)F2minimize{αi},{w^iT}yiTQϵ(αiw^iTX)22其中, α i \alpha_i αi 表示量化后权重 w ^ i \hat{w}_i w^i 的全精度缩放因子。
注:本文中 α i \alpha_i αi 表示为量化后卷积核 w ^ i \hat{w}_i w^i 的全精度缩放因子。

由于量化函数 Q ϵ ( ⋅ ) Q_{\epsilon}(\cdot) Qϵ() 没办法求导,因此本文中,通过引入一个辅助变量 z z z 来解决,即:
minimize ⁡ α . w ^ ∥ y − Q ϵ ( α X T w ^ ) ∥ 2 2 ⇒ minimize ⁡ α , w ^ , z ∥ y − Q ϵ ( z ) ∥ 2 2 + λ ∥ z − α X T w ^ ∥ 2 2 \underset{\alpha.\hat{w}}{\operatorname*{minimize}}\parallel y-Q_{\epsilon}(\alpha X^{T}\hat{w})\parallel_{2}^{2} \quad\Rightarrow\quad \underset{\alpha,\hat{w},z}{\operatorname*{minimize}}\quad\parallel y-Q_{\epsilon}(z)\parallel_{2}^{2}+\lambda\parallel z-\alpha X^{T}\hat{w}\parallel_{2}^{2} α.w^minimizeyQϵ(αXTw^)22α,w^,zminimizeyQϵ(z)22+λzαXTw^22其中, λ \lambda λ 表示惩罚系数。

为了解决上述问题,本文采取交替策略,即:

  1. 固定 z z z,优化 α , w ^ \alpha,\hat{w} α,w^:优化问题转化为
    m i n i m i z e ⁡ α , w ^ J ( α , w ^ ) = ∥ z − α X T w ^ ∥ 2 2 \underset{\alpha,\hat{w}}{\operatorname*{\mathrm{minimize}}}\quad J(\alpha,\hat{w})=\parallel z-\alpha X^{T}\hat{w}\parallel_{2}^{2} α,w^minimizeJ(α,w^)=∥zαXTw^22通过设置 ∂ J / ∂ α = 0 \partial J/\partial\alpha=0 J/α=0,得到
    α ∗ = z T X T w ^ w ^ T X X T w ^ ⇒ 代入原式 w ^ ∗ = a r g m a x w ^ ( z T X T w ^ ) 2 w ^ T X X T w ^ \alpha^*=\frac{z^TX^T\hat{w}}{\hat{w}^TXX^T\hat{w}} \quad\overset{代入原式}{\Rightarrow}\quad \hat{w}^*=\underset{\hat{w}}{\mathrm{argmax}}\frac{(z^TX^T\hat{w})^2}{\hat{w}^TXX^T\hat{w}} α=w^TXXTw^zTXTw^代入原式w^=w^argmaxw^TXXTw^(zTXTw^)2这样,就可以通过 ”暴力搜索“ 的方式,得到最佳的 α , w ^ \alpha,\hat{w} α,w^
  2. 固定 α , w ^ \alpha,\hat{w} α,w^,优化 z z z:优化问题转化为
    min ⁡ z i minimize ( y i − Q ϵ ( z i ) ) 2 + λ ( z i − v i ) 2 , \min_{z_i}\text{minimize}\quad(y_i-Q_\epsilon(z_i))^2+\lambda(z_i-v_i)^2, ziminminimize(yiQϵ(zi))2+λ(zivi)2,其中, v = α X T w ^ v=\alpha X^T\hat{w} v=αXTw^是一个已知向量。为了进一步简化问题,将量化函数 Q ϵ Q_{\epsilon} Qϵ 放缩为 Q ~ ϵ \tilde{Q}_{\epsilon} Q~ϵ:
    Q ~ ϵ ( x ) = { M x > M , x 0 < x ≤ M , 0 x ≤ 0. \left.\tilde{Q}_{\epsilon}(x)=\left\{\begin{array}{cl}M&x>M,\\x&0<x\leq M,\\0&x\leq0.\end{array}\right.\right. Q~ϵ(x)= Mx0x>M,0<xM,x0.那么,上述优化问题可以通过分类讨论得到解:
    { z i ≤ 0 ⇒ z i ( 0 ) = m i n ( 0 , v i ) 0 < z i ≤ M ⇒ z i ( 1 ) = m i n ( M , m a x ( 0 , λ v i + y i 1 + λ ) M < z i ⇒ z i ( 2 ) = m a x ( M , v i ) \begin{cases} z_i\leq 0 &\Rightarrow\quad z_{i}^{(0)}=min(0,v_{i})\\ 0<z_i\leq M &\Rightarrow\quad z_i^{(1)}=min(M,max(0,\frac{\lambda v_i+y_i}{1+\lambda}) \\ M<z_i &\Rightarrow\quad z_{i}^{(2)}=max(M,v_{i}) \end{cases} zi00<ziMM<zizi(0)=min(0,vi)zi(1)=min(M,max(0,1+λλvi+yi)zi(2)=max(M,vi)

关于初始化 α , w ^ \alpha,\hat{w} α,w^ 的方式:本文通过解决如下优化问题,获得初始化值:
minimize ∥ w − α w ^ ∥ 2 2 subject to α > 0 w ^ ∈ { − 1 , 0 , + 1 } m , \begin{array}{ll}\text{minimize}&\parallel w-\alpha\hat{w}\parallel_2^2\\\text{subject to}&\alpha>0\\&\hat{w}\in\{-1,0,+1\}^m\end{array}, minimizesubject towαw^22α>0w^{1,0,+1}m,那么,
α ∗ = w T w ^ w ^ T w ^ w ^ ∗ = a r g m a x w ^ ( w T w ^ ) 2 w ^ T w ^ . \begin{aligned}\alpha^*&=\frac{w^T\hat{w}}{\hat{w}^T\hat{w}}\\\hat{w}^*&=\underset{\hat{w}}{\mathrm{argmax}}\frac{(w^T\hat{w})^2}{\hat{w}^T\hat{w}}\end{aligned}. αw^=w^Tw^wTw^=w^argmaxw^Tw^(wTw^)2.

3. 讨论

本文主要贡献是

  • 通过 ”两步走“ 的策略,当 权重量化和激活量化解耦
  • 本文量化第 l l l 层时,前 l − 1 l-1 l1 层已经量化完毕,表示为
    minimize ⁡ Λ , W ^ ∥ Y − Q ϵ ( Λ W ^ X ~ ) ∥ F 2 \underset{\Lambda,\hat{W}}{\operatorname*{minimize}}\quad\parallel Y-Q_{\epsilon}(\Lambda\hat{W}\tilde{X})\parallel_{F}^{2} Λ,W^minimizeYQϵ(ΛW^X~)F2这就解决了不同层独立量化中出现的 误差积累 的问题

借鉴点:

  • 对不同层之间的量化方式可以不是独立,这样可以缓解误差的积累问题
  • 之前都是考虑量化权重,是否可以考虑量化激活

五、Ternary Neural Networks with Fine-Grained Quantization

Mellempudi N, Kundu A, Mudigere D, et al. Ternary neural networks with fine-grained quantization[J]. arXiv preprint arXiv:1705.01462, 2017.
arXiv 2017

1. 动机和贡献

动机: 低精度模型可以减少计算量和内存消耗,对边缘设备是十分友好的,但是却面临着测试精度下降的问题。

贡献: 本文提出一种细粒度的量化策略FGQ,在没有重训练的情况下,使用三元表示梯度,取得了较好的测试精度。

2. 算法

2.1 问题引出

TWN 中三元量化可以表示为:
α ∗ , Δ ∗ = argmin ⁡ α ≥ 0 , Δ > 0 E ( α , Δ ) = d e f ∥ W − α W ^ ∥ F 2 , s . t .   α ≥ 0 , W ^ i ∈ { − 1 , 0 , + 1 } , i = 1 , 2 , ⋯   , n \alpha^{*},\Delta^{*}=\underset{\alpha\geq0,\Delta>0}{\operatorname*{argmin}}E(\alpha,\Delta)\overset{def}{=}\|\mathbf{W}-\alpha\hat{\mathbf{W}}\|_F^2,\\\mathrm{s.t.}~\alpha\geq0,\hat{\mathbf{W}}_{i}\in\{-1,0,+1\},i=1,2,\cdots,n α,Δ=α0,Δ>0argminE(α,Δ)=defWαW^F2,s.t. α0,W^i{1,0,+1},i=1,2,,n其中, W ∈ R n W\in\mathbb{R}^n WRn;同时,为了更好地表示正负权重的不同分布,通常也会对其使用不同的阈值参数 Δ p  and  Δ n > 0 \Delta_{p}\text{ and }\Delta_{n}>0 Δp and Δn>0。但是使用单一或者少数的阈值 Δ \Delta Δ 和 缩放因子 α \alpha α 会导致量化后权重不能很好表示原始权重之间不同的分布,从而导致量化误差的增大。

基于此,本文提出了一种新的更细粒度的算法。

2.2 算法描述

假设 I I I 表示权重 W ∈ R n W\in\mathbb{R}^n WRn n n n 个索引组成的集合。将 I I I 正交的分为 k k k 个子集,表示为 c 1 , c 2 ⋯ c k c_1,c_2\cdots c_k c1,c2ck,则有 c i ∩ c j = ∅ , ∪ i c i = I , ∑ i n i = n c_{i}\cap c_{j}=\emptyset,\cup_{i}c_{i}=I,\sum_{i}n_{i}=n cicj=,ici=I,ini=n。同理,权重 W W W 也分为 k k k 个正交向量 W ( i ) ∈ R n , i = 1 , 2 , ⋯   , k W^{(i)}\in\mathbb{R}^n,i=1,2,\cdots,k W(i)Rn,i=1,2,,k,且 W j ( i ) = W j  if  j ∈ c i ,  otherwise  0 \mathbf{W}_{j}^{(i)}=\mathbf{W}_{j}\text{ if }j\in c_{i},\text{ otherwise }0 Wj(i)=Wj if jci, otherwise 0,因此有 ∑ i W ( i ) = W \sum_{i}\mathbf{W}^{(i)}=\mathbf{W} iW(i)=W。根据其正交性,可以有:
( W ( i ) − α i W ^ ( i ) ) ⊥ ( W ( j ) − α j W ^ ( j ) ) , f o r   i ≠ j ⇒ ∥ W − ∑ i α i W ^ ( i ) ∥ F 2 = ∑ i ∥ W ( i ) − α i W ^ ( i ) ∥ F 2 (\mathbf{W}^{(i)}-\alpha_{i}\hat{\mathbf{W}}^{(i)})\perp (\mathbf{W}^{(j)}-\alpha_{j}\hat{\mathbf{W}}^{(j)}),\mathrm{for~}i\neq j \quad\Rightarrow\quad \|\mathbf{W}-\sum_{i}\alpha_{i}\hat{\mathbf{W}}^{(i)}\|_{F}^{2}=\sum_{i}\|\mathbf{W}^{(i)}-\alpha_{i}\hat{\mathbf{W}}^{(i)}\|_{F}^{2} (W(i)αiW^(i))(W(j)αjW^(j)),for i=jWiαiW^(i)F2=iW(i)αiW^(i)F2那么上述优化问题转换为:
α 1 ∗ , . . , α k ∗ , W ^ ( 1 ) ∗ , . . , W ^ ( k ) ∗ = argmin ⁡ α i , W ^ ( i ) ∥ W − ∑ i α i W ^ ( i ) ∥ F 2 = ∑ i argmin ⁡ α i , W ^ ( i ) ∥ W ( i ) − α i W ^ ( i ) ∥ F 2 \alpha_{1}^{*},..,\alpha_{k}^{*},\hat{\mathbf{W}}^{(1)*},..,\hat{\mathbf{W}}^{(k)*}=\underset{\alpha_{i},\hat{\mathbf{W}}^{(i)}}{\operatorname*{argmin}}\|\mathbf{W}-\sum_{i}\alpha_{i}\hat{\mathbf{W}}^{(i)}\|_{F}^{2}=\sum_{i}\underset{\alpha_{i},\hat{\mathbf{W}}^{(i)}}{\operatorname*{argmin}}\|\mathbf{W}^{(i)}-\alpha_{i}\hat{\mathbf{W}}^{(i)}\|_{F}^{2} α1,..,αk,W^(1),..,W^(k)=αi,W^(i)argminWiαiW^(i)F2=iαi,W^(i)argminW(i)αiW^(i)F2这样,就可以单独解决 k k k 个子问题。

另外,如果对正负权重使用不同的阈值,则优化问题是:
α ∗ , Δ p ∗ , Δ n ∗ = argmin ⁡ α ≥ 0. Δ n > 0. Δ n > 0 ∥ W − α W ^ ∥ F 2 , s . t . W ^ i ∈ { − 1 , 0 , + 1 } , i = 1 , ⋯   , n . \alpha^{*},\Delta_{p}^{*},\Delta_{n}^{*}=\underset{\alpha\geq0.\Delta_{n}>0.\Delta_{n}>0}{\operatorname*{argmin}}\|\mathbf{W}-\alpha\hat{\mathbf{W}}\|_{F}^{2},\quad\mathrm{s.t.}\quad\hat{\mathbf{W}}_{i}\in\{-1,0,+1\},i=1,\cdots,n. α,Δp,Δn=α0.Δn>0.Δn>0argminWαW^F2,s.t.W^i{1,0,+1},i=1,,n.

根据 TWN 中给出的解析解,有:
α ∗ = ( ∑ i ∈ I Δ ∣ W i ∣ ) / ∣ I Δ ∣ , Δ ∗ = a r g m a x Δ > 0 ( ∑ i ∈ I Δ ∣ W i ∣ ) 2 / ∣ I Δ ∣ \alpha^{*}=(\sum_{i\in I_{\Delta}}|\mathbf{W}_{i}|)/|I_{\Delta}|,\quad\Delta^{*}=\mathop{\mathrm{argmax}}_{\Delta>0}(\sum_{i\in I_{\Delta}}|\mathbf{W}_{i}|)^{2}/|I_{\Delta}| α=(iIΔWi)/∣IΔ,Δ=argmaxΔ>0(iIΔWi)2/∣IΔ或者
Δ p ∗ , Δ n ∗ = a r g m a x Δ p > 0 , Δ n > 0 ( ∑ i ∈ I Δ + ∣ W i ∣ + ∑ i ∈ I Δ − ∣ W i ∣ ) 2 ∣ I Δ + ∣ + ∣ I Δ − ∣ , α ∗ = ∑ i ∈ I Δ + ∣ W i ∣ + ∑ i ∈ I Δ − ∣ W i ∣ ∣ I Δ + ∣ + ∣ I Δ − ∣ \Delta_{p}^{*},\Delta_{n}^{*}=\mathop{\mathrm{argmax}}_{\Delta_{p}>0,\Delta_{n}>0}\frac{(\sum_{i\in I_{\Delta}^{+}}|\mathbf{W}_{i}|+\sum_{i\in I_{\Delta}^{-}}|\mathbf{W}_{i}|)^{2}}{|I_{\Delta}^{+}|+|I_{\Delta}^{-}|},\quad\alpha^{*}=\frac{\sum_{i\in I_{\Delta}^{+}}|\mathbf{W}_{i}|+\sum_{i\in I_{\Delta}^{-}}|\mathbf{W}_{i}|}{|I_{\Delta}^{+}|+|I_{\Delta}^{-}|} Δp,Δn=argmaxΔp>0,Δn>0IΔ++IΔ(iIΔ+Wi+iIΔWi)2,α=IΔ++IΔiIΔ+Wi+iIΔWi

那么,如何进行分组?
原文中没有详细给出分组策略,只是给出分组需要遵守的原则是:尽可能使组中权重有着相同的数据分布。
原文中也提到了使用K-means聚类方法,只不过对算力有一定要求。

六、SYQ: Learning Symmetric Quantization For Efficient Deep Neural Networks

Faraone, Julian, et al. “Syq: Learning symmetric quantization for efficient deep neural networks.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
CVPR 2018 CCF-A会

1. 动机和贡献

动机: 由于量化导致DNN前馈和后馈过程中大量梯度的错配,因此导致推理过程中模型精度的大幅度下降。

贡献: 本文提出一种 “对称性三元量化”策略SYQ。首先通过权重的位置对其进行分组,然后对不同组权重给出不同的缩放因子。
注:本文中主要关心DNN中的 “卷积层CONV”。

2. 算法

2.1 权重量化

根据 TWN 中的描述,三元量化函数定义为:
Q l = s i g n ( W l ) ⊙ M l , Q_l=sign(W_l)\odot M_l, Ql=sign(Wl)Ml,其中,权重 W l ∈ R K × K × I × N W_l\in\mathbb{R}^{K\times K\times I\times N} WlRK×K×I×N K K K表示卷积核大小, I I I表示输出特征数, N N N表示输出特征数;掩码矩阵定义为:
M l i , j = { 1 if ∣ W l i , j ∣ ≥ η l 0 if − η l < W l i , j < η l M_{l_{i,j}}=\begin{cases}\quad1&\quad\text{if}\quad|W_{l_{i,j}}|\geq\eta_l\\\quad0&\quad\text{if}\quad-\eta_l<W_{l_{i,j}}<\eta_l\end{cases} Mli,j={10ifWli,jηlifηl<Wli,j<ηl根据 TTQ 中定义,阈值 η = 0.05 × max ⁡ ( ∥ W l ∥ ) \eta=0.05\times\max{(\|W_l\|)} η=0.05×max(Wl)。类似于TTQ中解决梯度消失的方式,本文中也采用STE的方式,即:
∂ E ^ ∂ W l i , j = ∂ E ^ ∂ Q l i , j , \frac{\partial\hat{E}}{\partial W_{l_{i,j}}}=\frac{\partial\hat{E}}{\partial Q_{l_{i,j}}}, Wli,jE^=Qli,jE^,其中, E ^ \hat{E} E^ 表示没有缩放因子的误差函数

2.2 收缩因子定义和分组

收缩因子 c i c_i ci 采用和TWN中相同的对称收缩因子的定义方式,本文采用的数学语言描述为:
∀ c i ∈ C p , ∃ ∣ c j ∣ ∈ C n where c i = ∣ c j ∣ , \forall c_i\in C^p,\quad\exists|c_j|\in C^n\quad\text{where}\quad c_i=|c_j|, ciCp,∃∣cjCnwhereci=cj,其中, C p = { c i ∣ c i > 0 } , C n = { c j ∣ c j < 0 } C^{p}=\{c_{i}|c_{i}>0\},C^n=\begin{Bmatrix}c_j|c_j<0\end{Bmatrix} Cp={cici>0},Cn={cjcj<0}。因此,使用STE方法有:
∂ E ∂ W l i , j = ∂ E ∂ Q l i , j = α l i ∂ E ^ ∂ Q l i , j . \frac{\partial E}{\partial W_{l_{i,j}}}=\frac{\partial E}{\partial Q_{l_{i,j}}}=\alpha_{l}^{i}\frac{\partial\hat{E}}{\partial Q_{l_{i,j}}}. Wli,jE=Qli,jE=αliQli,jE^.
因此,本文可以采用和TWN、TTQ相同的思路,采用向后传播的方式逐步更新缩放因子,其初始值定义为相对应权重绝对值的均值,即:
α l 0 i = ∑ j ∈ S l i ∣ W ~ l i , j ∣ I × N . \alpha_{l_{0}}^{i}=\frac{\sum_{j\in S_{l}^{i}}\left|\tilde{W}_{l_{i,j}}\right|}{I\times N}. αl0i=I×NjSli W~li,j .

分组方式: 本文中的分组方式是一个比较新颖的点,包括两种方式,c。但是对于这两种方式的具体优势,本文没有给出。下图是这种分组方式的示意图:
在这里插入图片描述

3. 讨论

本文基本采用TWN、TTQ这两篇文章的中心思想,有所不同的是给出两种权重分组策略,所以我认为创新性不太充足。

缺点:

  • 本文中对误差函数的定义没有详细说明,可能采用与TWN、TTQ中相同的定义方式,即 J ( α , W ^ = ∥ W − α W ^ ∥ 2 2 ) J(\alpha,\hat{W}=\|W-\alpha\hat{W}\|_2^2) J(α,W^=WαW^22)
  • 对收缩因子的定义不清,似乎本文收缩因子绝对值采用 “绝对值权重和的平均” 来定义;
  • 对于文中所提到的pixel-wise和row-wise的两种分组方式,都是适用于卷积层CONV,对于其他类型的学习算法,并不适用。

七、Fixed-point factorized networks

Wang P, Cheng J. Fixed-point factorized networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 4012-4020.
CVPR 2017 CCF-A会

1. 动机和贡献

动机: 为了压缩DNN模型,并加快其训练过程,同时尽可能地减少推理精度损失。

贡献: 本文提出了一种基于矩阵不动点分解网络模型 FFN,将原始全精度权重使用 ( − 1 , 0 , + 1 ) (-1,0,+1) (1,0,+1) 三元组表示,具体分为如下三个部分:

  • direct fixed-point factorization:基于矩阵不动点分解,FFN分解原始全精度权重,这种分解方式十分灵活且准确;
  • full precision weight recovery:进行梯度累加时,如果直接使用量化值进行相加,会损失重要信息,因此,本文将量化值重新恢复为(伪)全精度值进行梯度累加;
  • weight balancing:由于分解形式不是唯一的,使用分解技术通常会产生权重不平衡问题,因此,本文提出了一种有效的权重平衡策略。

2. 算法

2.1 Fixed-point Factorization of Weight Matrices

假设全精度权重矩阵为 W ∈ R m × n W\in R^{m\times n} WRm×n,那么其半离散分解SDD可以表示为:
minimize ⁡ X , D , Y ∥ W − X D Y T ∥ F 2 = minimize ⁡ { x i } , { d i } , { y i } ∥ W − ∑ i k d i x i y i T ∥ F 2 \begin{equation*} \begin{split} &\qquad\underset{{X,D,Y}}{\operatorname{minimize}}\parallel W-XDY^T\parallel_F^2\\\\&=\underset{{\{x_i\},\{d_i\},\{y_i\}}}{\operatorname{minimize}}\parallel W-\sum_i^kd_ix_iy_i^T\parallel_F^2 \end{split} \end{equation*} X,D,YminimizeWXDYTF2={xi},{di},{yi}minimizeWikdixiyiTF2其中, X ∈ { − 1 , 0 , + 1 } m × k , Y ∈ { − 1 , 0 , + 1 } n × k X\in\{-1,0,+1\}^{m\times k},Y\in\{-1,0,+1\}^{n\times k} X{1,0,+1}m×k,Y{1,0,+1}n×k D ∈ R + k × k D\in R^{k\times k}_+ DR+k×k 是一个对角矩阵, k k k 代表了SDD分解的维数(选择不同的 k k k可以尽可能准确的模拟原始全精度权重,注意到 k k k可以比 m , n m,n m,n都要大)。

由于上述优化问题的三元值限制,这是一个NP问题,本文借用[19]中的内容,使用贪心策略得到其近似解,具体过程见如下算法:
在这里插入图片描述

2.2 Full-precision Weight Recovery

假设 X , Y X,Y X,Y 的全精度表示为 X ^ , Y ^ \hat{X},\hat{Y} X^,Y^,注意到 X ^ , Y ^ \hat{X},\hat{Y} X^,Y^ 必须量化到 X , Y X,Y X,Y。本文中,将全精度权重恢复技术视为量化过程的逆过程,描述为:
m i n i m i z e ∥ W − X ^ D Y ^ T ∥ F 2 s u b j e c t   t o ∣ X ^ i j − X i j ∣ < 0.5 , ∀ i , j ∣ Y ^ i j − Y i j ∣ < 0.5 , ∀ i , j \begin{array}{rl}{\mathrm{minimize}}&{\parallel W-\hat{X}D\hat{Y}^{T}\parallel_{F}^{2}}\\{\mathrm{subject~to}}&{\mid\hat{X}_{ij}-X_{ij}\mid<0.5,\forall i,j}\\&{\mid\hat{Y}_{ij}-Y_{ij}\mid<0.5,\forall i,j}\end{array} minimizesubject toWX^DY^TF2X^ijXij∣<0.5,i,jY^ijYij∣<0.5,i,j这里的两个限制条件是为了 X ^ , Y ^ \hat{X},\hat{Y} X^,Y^ 可以量化到 X , Y X,Y X,Y。注意到 X ^ , Y ^ ∈ [ − 1.5 , 1.5 ] \hat{X},\hat{Y}\in[-1.5,1.5] X^,Y^[1.5,1.5],同时一开始原始权重也限制到 [ − 1.5 , 1.5 ] [-1.5,1.5] [1.5,1.5] 之内。因此, X ^ , Y ^ \hat{X},\hat{Y} X^,Y^ 的量化可以是:
q ( A i j ) = { + 1 0.5 < A i j < 1.5 0 − 0.5 ≤ A i j ≤ 0.5 − 1 − 1.5 < A i j < − 0.5 \left.q(A_{ij})=\left\{\begin{array}{cc}+1&\quad0.5<A_{ij}<1.5\\0&-0.5\leq A_{ij}\leq0.5\\-1&-1.5<A_{ij}<-0.5\end{array}\right.\right. q(Aij)= +1010.5<Aij<1.50.5Aij0.51.5<Aij<0.5

2.3 Weight Balancing

这是由于 “矩阵的不动点分解不存在唯一的分解形式” 所导致的问题。由于不是本阶段关注重点,所以此部分略过。

3. 讨论

和传统量化方式不同,本文利用 矩阵的不动点分解进行量化,使得量化过程更加灵活、准确。

可参考的点儿:

  • 在梯度累加时使用(伪)全重精度权重,可以降低损失;
  • 由于(伪)全精度权重恢复的需要,原始权重可以归一到区间 [ − 1.5 , 1.5 ] [-1.5,1.5] [1.5,1.5],而不是传统意义上的 [ − 1.1 ] [-1.1] [1.1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java8,可以使用Stream APIgroupingBy方法进行多字段分组求和。下面是一个示例代码: 假设有一个包含以下数据的List: ``` List<Record> records = Arrays.asList( new Record("A", "X", 10), new Record("A", "Y", 20), new Record("B", "X", 30), new Record("B", "Y", 40) ); ``` 其Record为以下类: ``` class Record { private String group1; private String group2; private int value; public Record(String group1, String group2, int value) { this.group1 = group1; this.group2 = group2; this.value = value; } public String getGroup1() { return group1; } public String getGroup2() { return group2; } public int getValue() { return value; } } ``` 如果要按group1和group2字段进行分组,并对value字段求和,可以使用以下代码: ``` Map<String, Map<String, Integer>> result = records.stream() .collect(Collectors.groupingBy(Record::getGroup1, Collectors.groupingBy(Record::getGroup2, Collectors.summingInt(Record::getValue)))); ``` 这将返回一个Map,其第一层Map的键为group1字段的值,第二层Map的键为group2字段的值,值为对应的value字段求和的结果。例如,上面的示例代码将返回以下Map: ``` { "A": { "X": 10, "Y": 20 }, "B": { "X": 30, "Y": 40 } } ``` 在以上示例,我们使用了两个groupingBy方法进行多字段分组,第一个groupingBy方法根据group1字段进行分组,第二个groupingBy方法根据group2字段进行分组,并在最后一个参数使用summingInt方法对value字段求和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值