主要利用神经网络的三个特性:
- 并行计算、数据复用
- 模型具有稀疏性。很多模型中的权值为0或很小,数据经过以后会直接变为无用值
- 深度学习具有鲁棒性,对数据的误差不敏感
测试时固定点神经网络(Test-Time Fixed-Point Neural Networks)
测试时固定点神经网络(Test-Time Fixed-Point Neural Networks)是以低精度运行的网络。它们在推理之前使用浮点数进行预训练,并根据训练后的固定点分析结果进行量化。
- 可以通过对层的输入和权重进行测试时量化。
- 通过跳过冗余的稀疏计算来降低能量消耗。
量化对分类精度的影响
对于[-1,1]区间上的权重或层输入x,通过以下函数进行量化: $$q=clip(\frac{round(2^{Q-1} \times x)}{2^{Q-1}}, -1,1-2^{-(Q-1)})$$
在对权重和输入进行量化之前,根据它们的值分布将它们适当地重新缩放到[-1,1]区间。从数学上讲,这种缩放与将结果乘以2的因子相同,或者在固定点表示中移动数据。这个操作在硬件中可以非常方便地执行。
统一量化与逐层量化
- 统一量化是一种简单直接的方法,它将同样的量化设置应用于所有层。这种方法可以快速实施,并且不需要额外的计算资源。然而,由于每个层的特性和敏感性可能不同,统一量化可能无法充分利用每个层的潜力。
- 逐层量化更加精细和有效。通过为每个层单独选择量化设置,可以根据其特定特征和需求来优化量化过程。这可以提高每个层的准确性,并且通常会导致整体模型的更好性能。
每层量化
网络也可以具有每层量化而不是用相同位数量化网络的所有权重和输入。
优势:
- 可以更精确地设置操作点。
- 更好地权衡能耗与准确性。
为了找到每层的最优量化设置,需要对参数进行贪婪搜索:从第一层开始,将其输入量化,直到准确性降至目标准确性为止。接下来,保持输入的量化设置不变,通过相同的方式最大化权重的量化设置。同样的过程在下一层中应用,直到最后一层。
有一个普遍趋势:网络的较低层所需的位数比较高层要少。部分是由于向前参数扫描,但较低层与较高层之间的输入和权重统计差异也有影响。
训练时量化神经网络(QNN)
注:普通CPU和GPU仅原生支持有限的计算精度设置,如32-64浮点或8-16位整数运算,无法受益于低精度QNN。而在定制设计的ASIC中,可以根据给定条件选择最佳计算精度,以最小化每次网络推理的能量消耗。
输入层
- 第一层输入为int8
- 其他层的所有输入都被量化为intQ
如果M是输入位数,M>Q,那么intQ层可以表示为一系列移位和加法的点积操作。
可以使用以下编码方式在intQ硬件上处理M>Q个输入:
在这里,\(x^{M/Q}\)是输入向量x中最高有效位(Most Significant Bit),而\(x^1\)是最低有效位(Least Significant Bit)。\(w_Q\)是经过intQ量化的权重向量,s是加权和的结果。
训练时量化权重(Train-Time Quantized Weights)
所有权重都使用固定点表示法将其量化为Q位。使用以下确定性量化函数:$$q=clip(\frac{round(2^{Q-1} \times w)}{2^{Q-1}}, -1,1-2^{-(Q-1)})$$
Q=1的情况被视为特例,时q = Sign(w)。使用“直通估计器”(straight-through estimator,STE)函数进行反向传播。如果已经获得了梯度\(\frac{∂C}{∂q}\)的估计器\(g_q\),则\(\frac{∂q}{∂w}\)的STE为:$$STE = hardtanh(w) = clip(w,−1, 1)$$
\(\frac{∂C}{∂w}\)的STE为:$$g_w=g_q \times clip(w,-1,1)$$
根据(Hubara et al. 2016a)的做法,在训练过程中,所有实值权重都被限制在区间[-1, 1]内。否则,实值权重会变得很大,而不会对量化后的权重产生影响。不同Q下的权重量化函数q(w)和STE函数在图3.15中进行了绘制。
\(STE = g_q * hardtanh(w)\)可以简化为:
当 -1 ≤ w ≤ 1 时,STE = \(g_q\)
当 w < -1 或 w > 1 时,STE = 0
训练时量化激活(Train-Time Quantized Activations)
在量化神经网络(QNN)中,所有激活值被量化为 Q 位的定点表示。前向传播中使用以下确定性的量化激活函数:
\[A_{ReLU}=max(0,q(a)) \]\[A_{hardtanh}=qhardtanh(a) \]\[qhardtanh(a) = 2 × hardtanh(round(hardsigmoid(a) × 2^{Q−1})/2^{Q−1}), \]\[hardsigmoid(a) = clip((a + 1)/2, 0, 1) \]反向传播中使用以下STE函数进行梯度估计:
\[g_{ReLU} = max(0, hardtanh(a)) \]\[g_{hardtanh} = hardtanh(a) \]聚类神经网络
- 对权重和激活进行聚类,将浮点数网络进行压缩。一组权重或激活被聚类成n个簇以确保只剩少数不同的权重。然后,每个出现的权重或激活通过\(\log_2(n)\)位的小索引指向一个小的查找表中的实际值。
- 在初始的聚类步骤之后,聚类的值经过重新训练,以提高网络的准确性。
- 实际值以高精度浮点数或定点数的形式存储,计算使用16位,但所有的数据传输和存储成本都被压缩了。
拓展阅读
- 量化神经网络