32、高效神经网络推理量化方法综述

高效神经网络推理量化方法综述

1. 知识蒸馏

知识蒸馏是一种利用高精度大模型作为教师模型来辅助紧凑学生模型训练的方法。在学生模型训练过程中,不只是使用真实类别标签,还利用教师模型产生的软概率,这些软概率可能包含输入的更多信息。整体损失函数结合了学生损失和蒸馏损失,通常公式如下:
[L = \alpha H(y, \sigma(z_s)) + \beta H(\sigma(z_t, T), \sigma(z_s, T))]
其中,(\alpha) 和 (\beta) 是调整学生模型损失和蒸馏损失的加权系数,(y) 是真实类别标签,(H) 是交叉熵损失函数,(z_s) 和 (z_t) 分别是学生模型和教师模型生成的对数几率,(\sigma) 是 softmax 函数,(T) 是温度,定义如下:
[p_i = \frac{\exp(\frac{z_i}{T})}{\sum_j \exp(\frac{z_j}{T})}]

以往的知识蒸馏方法主要探索不同的知识源。有些方法使用对数几率(软概率)作为知识源,有些则尝试利用中间层的知识。在教师模型的选择上,也有多种方式,如使用多个教师模型联合监督学生模型,或进行无额外教师模型的自蒸馏。

2. 极端量化

极端量化中,二值化是最极端的量化方法,将量化值限制为 1 位表示,能大幅减少 32 倍的内存需求。除了内存优势,二进制(1 位)和三进制(2 位)运算通常可以通过位运算高效计算,比 FP32 和 INT8 等更高精度的运算有显著加速。例如,NVIDIA V100 GPU 上的峰值二进制运算速度比 INT8 高 8 倍。然而,简单的二值化方法会导致显著的精度下降,因此有大量工作提出了不同的解决方案。

以下是一些重要的极端量化工作:
- BinaryConnect :将权重限制为 +1 或 -1。权重保持为实值,仅在正向和反向传播时进行二值化以模拟二值化效果。在正向传播中,根据符号函数将实值权重转换为 +1 或 -1,然后使用标准训练方法和 STE(Straight-Through Estimator)来传播梯度。
- Binarized NN (BNN) :扩展了 BinaryConnect 的思想,不仅对权重进行二值化,还对激活值进行二值化。联合二值化权重和激活值可以提高延迟,因为昂贵的浮点矩阵乘法可以被轻量级的 XNOR 运算和位计数替代。
- Binary Weight Network (BWN) 和 XNOR-Net :通过引入缩放因子到权重中,使用 +α 或 -α 代替 +1 或 -1,以提高精度。α 是选择的缩放因子,用于最小化实值权重和二值化权重之间的距离。
- Ternarization :受许多学习到的权重接近零的观察启发,尝试将网络的权重/激活值约束为三值,如 +1、0 和 -1,从而明确允许量化值为零。三值化也能像二值化一样大幅减少推理延迟。
- Ternary-Binary Network (TBN) :结合二进制网络权重和三进制激活值,可以在精度和计算效率之间实现最佳平衡。

为了减少极端量化中的精度下降,相关工作将解决方案大致分为三个分支:
- 量化误差最小化 :目标是最小化实值和量化值之间的差距。例如,HORQ 和 ABC-Net 使用多个二进制矩阵的线性组合来表示实值权重/激活值,以减少量化误差。此外,对更宽的网络进行二值化可以在精度和模型大小之间取得良好的平衡。
- 改进损失函数 :关注损失函数的选择。如损失感知的二值化和三值化方法直接最小化关于二值化/三值化权重的损失,而不是仅近似权重。从全精度教师模型进行知识蒸馏也是恢复二值化/三值化后精度下降的有效方法。
- 改进训练方法 :旨在为二进制/三进制模型找到更好的训练方法。例如,BNN+ 引入了符号函数导数的连续近似,有些方法用平滑、可微的函数代替符号函数。Bi-Real Net 引入了连接连续块中激活值的恒等捷径,以传播 32 位激活值。DoReFa-Net 除了对权重和激活值进行量化外,还对梯度进行量化,以加速训练。

极端量化在计算机视觉任务中的许多 CNN 模型上成功地大幅减少了推理/训练延迟和模型大小。最近,也有尝试将这一思想扩展到自然语言处理(NLP)任务中。

3. 向量量化

量化并非机器学习领域的发明,在过去一个世纪里,它在信息理论,特别是数字信号处理领域作为一种压缩工具得到了广泛研究。机器学习中的量化方法与传统方法的主要区别在于,其目标是找到一种低精度表示,使损失尽可能小,而不是以最小的变化/误差压缩信号。因此,量化后的权重/激活值与未量化的值相差较大也是可以接受的。

经典 DSP 量化方法中的许多有趣思想已应用于神经网络量化,特别是向量量化。相关工作将权重聚类成不同的组,并在推理时使用每组的质心作为量化值。使用 k-means 聚类足以将模型大小减少 8 倍而不会显著降低精度。此外,将基于 k-means 的向量量化与剪枝和霍夫曼编码结合使用可以进一步减小模型大小。

产品量化是向量量化的扩展,将权重矩阵划分为子矩阵,并对每个子矩阵应用向量量化。更细粒度的聚类使用可以进一步提高精度,例如对 k-means 产品量化后的残差进行递归量化,或对更重要的量化范围应用更多的聚类以更好地保留信息。

4. 量化与硬件处理器

量化不仅可以减小模型大小,还能实现更快的速度和更低的功耗,特别是对于具有低精度逻辑的硬件。因此,量化对于物联网和移动应用中的边缘部署尤为关键。边缘设备通常具有严格的资源限制,包括计算、内存和重要的功率预算,许多深度神经网络模型难以满足这些要求。此外,许多边缘处理器不支持浮点运算,特别是在微控制器中。

以下是不同硬件平台在量化方面的情况:
|硬件平台|特点|量化方式|
| ---- | ---- | ---- |
|ARM Cortex-M|32 位 RISC ARM 处理器核心,用于低成本和低功耗嵌入式设备|使用 CMSIS-NN 库进行定点量化,利用 2 的幂次缩放因子,通过位运算高效进行量化和反量化|
|GAP-8|用于边缘推理的 RISC-V SoC,带有专用 CNN 加速器|仅支持整数运算|
|Google Edge TPU|用于边缘推理的专用 ASIC 芯片|仅支持 8 位运算,使用 TensorFlow 的量化感知训练或训练后量化|

量化结合高效的低精度逻辑和专用的深度学习加速器,是边缘处理器发展的重要驱动力。同时,量化也能为非边缘处理器带来显著改进,如 NVIDIA Turing GPU 中的 T4 GPU 包含的 Turing Tensor Cores 可进行高效的低精度矩阵乘法。

5. 未来研究方向

量化研究的未来方向主要包括以下几个方面:
- 量化软件 :目前将不同的神经网络模型量化并部署到 INT8 比较容易,且有多个软件包支持,实现也较为优化。但低比特精度量化的软件并不广泛可用,例如 Nvidia 的 TensorRT 目前不支持低于 INT8 的量化,TVM 最近才添加了对 INT4 量化的支持。因此,开发高效的低精度量化软件 API 将具有重要影响。
- 硬件和神经网络架构协同设计 :神经网络参数在量化后可能有非常不同的值,但仍能有相似的泛化能力。可以利用这种自由度,在量化时调整神经网络架构,如改变网络宽度可以减少/消除量化后的泛化差距。未来的工作可以联合调整其他架构参数,如深度或单个内核,还可以将这种协同设计扩展到硬件架构,特别是在 FPGA 部署中。
- 耦合压缩方法 :量化只是高效部署神经网络的方法之一,还包括高效的神经网络架构设计、硬件和神经网络架构协同设计、剪枝和知识蒸馏等。目前很少有工作探索这些方法的最佳组合,例如剪枝和量化的最佳结合方式,以及这些方法与其他方法的耦合。
- 量化训练 :量化在加速神经网络训练方面的重要应用是使用半精度进行训练,但将其进一步推进到 INT8 精度训练非常困难。虽然有一些相关工作,但这些方法通常需要大量的超参数调整,或者只适用于一些相对简单的学习任务。解决 INT8 精度训练的不稳定性问题将对多个应用产生重大影响,特别是在边缘训练中。

量化在神经网络中是一个高度活跃的研究领域,从浮点表示转向低精度固定整数值表示具有减少内存占用和延迟的潜力。通过本次综述,希望能为当前的量化研究提供一个有用的快照,并为未来的研究评估提供清晰的组织框架。

高效神经网络推理量化方法综述(续)

6. 量化的重要性及优势

量化在神经网络领域具有至关重要的地位,这主要源于神经网络自身的一些特性。首先,神经网络的计算量极大,高效的数值表示对于减少计算负担、提高计算速度至关重要。例如,在大规模图像识别任务中,神经网络需要处理大量的图像数据,若能采用量化技术减少数据的表示位数,就能显著降低计算量。其次,当前大多数神经网络模型存在严重的参数冗余,这为降低比特精度提供了空间,在不影响模型精度的前提下,可大幅减少模型的存储和计算需求。最后,神经网络的分层结构为量化提供了更多的探索维度,不同层对损失函数的影响不同,这促使了混合精度量化等有趣方法的出现。

从实际效果来看,量化能够带来显著的性能提升。例如,使用 TVM 量化库对流行的计算机视觉模型进行 INT8 推理,ResNet50、VGG - 19 和 inceptionV3 在 NVIDIA GTX 1080 上分别能实现 3.89×、3.32× 和 5.02× 的加速。进一步采用 INT4 推理,ResNet50 在 NVIDIA T4 和 RTX 上相比 INT8 推理还能额外带来 50 - 60% 的加速。此外,混合精度量化也能在不损失精度的情况下提高效率,如通过混合精度量化,ResNet50 可实现 23% 的加速。在不同的硬件平台上,量化都展现出了强大的优势,无论是 GPU 还是非 GPU 架构,都能通过量化实现显著的延迟加速。

7. 量化方法总结

量化方法涵盖了多个方面,下面通过一个流程图来总结其主要类型和关系:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A([量化方法]):::startend --> B(知识蒸馏):::process
    A --> C(极端量化):::process
    A --> D(向量量化):::process
    B --> B1(不同知识源):::process
    B --> B2(不同教师模型选择):::process
    C --> C1(二值化):::process
    C --> C2(三值化):::process
    C1 --> C11(BinaryConnect):::process
    C1 --> C12(BNN):::process
    C1 --> C13(BWN 和 XNOR - Net):::process
    C2 --> C21(Ternarization):::process
    C2 --> C22(TBN):::process
    C --> C3(减少精度下降的解决方案):::process
    C3 --> C31(量化误差最小化):::process
    C3 --> C32(改进损失函数):::process
    C3 --> C33(改进训练方法):::process
    D --> D1(k - means 聚类):::process
    D --> D2(产品量化):::process

知识蒸馏利用高精度大模型辅助紧凑学生模型训练,通过结合学生损失和蒸馏损失来优化训练过程。极端量化包括二值化和三值化等方法,为了减少精度下降,有量化误差最小化、改进损失函数和改进训练方法等解决方案。向量量化则通过聚类权重并使用质心作为量化值,产品量化是其扩展。

8. 未来研究展望

未来量化研究面临着诸多挑战和机遇,下面详细阐述各个方向的具体情况:

8.1 量化软件

目前虽然 INT8 量化软件相对成熟,但低比特精度量化软件的发展还很不足。例如,Nvidia 的 TensorRT 不支持 sub - INT8 量化,TVM 对 INT4 量化的支持也是近期才添加的。未来需要开发高效的低精度量化软件 API,以满足不同应用场景对低比特精度量化的需求。开发过程可以参考以下步骤:
1. 需求分析 :明确不同应用对低比特精度量化的具体要求,如精度、速度、内存占用等。
2. 算法设计 :研究适合低比特精度量化的算法,确保在减少比特位数的同时尽量减少精度损失。
3. API 开发 :根据算法设计开发相应的软件 API,提供简洁易用的接口供开发者使用。
4. 测试优化 :对开发的 API 进行全面测试,根据测试结果进行优化,提高其稳定性和性能。

8.2 硬件和神经网络架构协同设计

当前神经网络参数在量化后具有一定的自由度,可利用这一特性在量化时调整网络架构。未来可以联合调整更多的架构参数,如网络深度、单个内核等。对于 FPGA 部署,可探索不同的硬件配置,将硬件架构与神经网络架构和量化进行协同设计。具体操作步骤如下:
1. 分析量化特性 :研究量化对神经网络参数和性能的影响,了解量化后的自由度范围。
2. 架构参数调整 :根据量化特性,尝试调整神经网络的架构参数,如改变网络宽度、深度等,观察性能变化。
3. 硬件配置探索 :针对 FPGA 等硬件平台,探索不同的硬件配置,如不同的微架构、乘法累加单元等。
4. 协同设计优化 :将硬件架构、神经网络架构和量化方法进行协同优化,找到最佳的组合方案。

8.3 耦合压缩方法

量化可以与其他方法如高效神经网络架构设计、剪枝、知识蒸馏等相结合,但目前对这些方法的最佳组合研究较少。未来需要深入研究不同方法之间的耦合关系,例如确定结构化/非结构化剪枝和量化的最佳组合方式。具体研究步骤如下:
1. 方法分析 :对量化、剪枝、知识蒸馏等方法的原理和特点进行深入分析。
2. 组合实验 :设计不同的方法组合实验,如先剪枝后量化、同时进行剪枝和量化等。
3. 性能评估 :对不同组合实验的结果进行性能评估,包括模型大小、精度、推理速度等指标。
4. 最佳组合确定 :根据性能评估结果,确定不同场景下的最佳方法组合。

8.4 量化训练

虽然半精度量化在加速神经网络训练方面取得了一定成果,但将其推进到 INT8 精度训练仍面临诸多困难,如训练不稳定和发散等问题。解决这些问题将对多个应用,特别是边缘训练产生重大影响。解决 INT8 精度训练问题的步骤如下:
1. 问题分析 :深入分析 INT8 精度训练不稳定和发散的原因,如梯度消失、梯度爆炸等。
2. 方法研究 :研究适合 INT8 精度训练的方法,如改进的优化算法、特殊的损失函数等。
3. 实验验证 :通过实验验证所研究方法的有效性,不断调整和优化方法。
4. 应用推广 :将有效的方法应用到实际的边缘训练等场景中,评估其性能和效果。

量化在神经网络领域具有巨大的潜力和广阔的发展前景。通过不断探索和研究量化软件、硬件和神经网络架构协同设计、耦合压缩方法以及量化训练等方面,有望进一步提高神经网络的效率和性能,推动其在更多领域的应用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值