全文概括
本文目的是将 activation 和 weight 一起量化,其结果能量化 activation 和 weight 到 4-bit 大小,且准确度能和 full precision 媲美(在一系列流行的模型和数据集上)。
该方法是提出一个新的激活函数,即PACT(PArameterized Clipping Activation),其作用在训练阶段,即该方案是从头开始训练的。
提出该激活函数的背景是作者发现:“在运用权重量化方案来量化 activation 时,传统的RELU的量化结果和全精度结果相差较大,在分类任务上”。作者发现是量化时,activation的量化误差能很大(相较于 weight 基本在 ( 0 , 1 ) (0,1) (0,1),activation的值是无限大的,这是RELU的结果),所以提出 截断式RELU 的激活函数。该截断的上界,即文中的 α \alpha α 是可学习的参数,这保证了每层都能有不一样的量化范围。
新添的参数 α \alpha α,在训练时使用 L 2 L_2 L2 正则化,使其快速收敛的同时,保持一个较小的值,以限制量化时产生的量化误差。
结果展示:
- 对于极端小的bit( ≤ 2 − b i t s \leq 2-bits ≤2−bits),PACT表现得比已提出其他量化方法要好;
- PACT的 4-bit 量化结果表现得和原 floating point版本差不多。PACT的 4-bit 量化结果表现得和原 floating point版本差不多。
该方法,对大的网络,如ResNet-50效果很好,和baseline差不多。
该方法是从头开始训练的,暂时不知道其是不是在训练网络的同时,使用量化方案,如果不是同时使用量化方案的话,是不是可以使用 pre-trained model ,然后使用PACT进行“微调”,再进行量化。
激活量化的挑战
量化传统的 activation,不像量化 weight 一样,可以通过学习去补偿,其量化的误差结果只能加重 weight 的补偿学习。
传统的 RELU 是无界的,这代表着其结果能有很大的范围。通过截断式RELU,给 activation 添加一个上界,可以部分环节量化误差的损失,但其结果仍显著不如全精度版本。
PACT
PACT工作流程
PACT激活函数: y = P A C T ( X ) = 0.5 ( ∣ X ∣ − ∣ X − α ∣ + α ) = { 0 , x ∈ ( − ∞ , 0 ) x , x ∈ [ 0 , α ) α , x ∈ [ α , + ∞ ) y=PACT(X)=0.5(|X|-|X-\alpha|+\alpha)=\begin{cases} 0, & x \in (-\infty,0) \\ x, & x \in [0, \alpha) \\ \alpha, &x \in [\alpha, +\infty) \end{cases} y=PACT(X)=0.5(∣X∣−∣X−α∣+α)=⎩⎪⎨⎪⎧0,x,α,x∈(−∞,0)x∈[0,α)x∈[α,+∞)
该激活函数的输出,量化到 k-bits上的结果为: y q = r o u n d ( y ∗ 2 k − 1 α ) ∗ α 2 k − 1 y_q=round(y*\frac{2^k-1}\alpha)* \frac {\alpha}{2^k-1} yq=round(y∗α2k−1)∗2k−1α α 2 k − 1 \frac {\alpha}{2^k-1} 2k−1α 是 step-size 。
反向传播学习 α \alpha α 的过程: ∂ y q ∂ α = ∂ y q ∂ y = { 0 , x ∈ ( − ∞ , α ) 1 , x ∈ [ α , + ∞ ) \frac{\partial y_q}{\partial \alpha}=\frac{\partial y_q}{\partial y}=\begin{cases} 0, x \in (-\infty , \alpha) \\ 1, x \in [\alpha , +\infty) \end{cases} ∂α∂yq=∂y∂yq={0,x∈(−∞,α)1,x∈[α,+∞) 其中,梯度 ∂ y q ∂ α \frac{\partial y_q}{\partial \alpha} ∂α∂yq通过"straight-through estimator(STE)"随机离散化神经元来进行梯度计算和反向传播工作,作者将 ∂ y q ∂ α \frac{\partial y_q}{\partial \alpha} ∂α∂yq估计为 1 1 1。
PACT工作的理解
作者使用带参数的截断式RELU,即PACT来模拟RELU,来看其作用(在作用于某一层时,我们只需看这一层的 α \alpha α的效果,其他的参数,如其它层的 α \alpha α、所有的参数weight和bias,BacthNorm参数 ( β , γ ) (\beta,\gamma) (β,γ)都保持不变)
可以发现,除了第一层和最后一层,其它层导致的交叉熵损失函数变化都是随着 α \alpha α的增大而降低,这表示着:若没有应用量化方案时,RELU是一个好的激活函数。但也可以发现,在全精度版本中,并不是所有层都是喜欢“较大的上界”的(比如上面的act0、act6)。
在量化时,可以发现,所有的层都喜欢一个较低的
α
\alpha
α,这意味着无上界的 RELU 在量化过程不太合适:
我们也可以发现,不同层的最优上界
α
\alpha
α都不同,所以这激励着我们去学习上界
α
\alpha
α
但可以从上图看出,在activation上应用量化时,
α
\alpha
α调整的振荡幅度较大,这激励着适用正则化方案使其加速收敛:
PACT额外参数的设定
该方案多了两种参数:每层的上界 α \alpha α,以及正则化参数 λ \lambda λ。
作者将每层的 α \alpha α都初始化为一个较大的数(让其减小收敛),每层的正则化参数都使用同一个超参数 λ \lambda λ。
在应用方案时,和很多其他CNN量化方案一样,第一层和最后一层不进行量化,因为量化这两层会造成很大的精确度损失。这两层,一个是基础、低级特征提取,一个是直接影响预测
实验结果
以下实验全部是重头开始训练的
PACT与其他几个量化方法在AlexNet、ResNet18、ResNet50上的对比:
DoReFa与PACT的对比: