高效神经网络架构构建与量化方法综述
1. 高效移动架构构建
1.1 架构调整基本方案
为了使神经网络适应定制硬件和部署要求,可以采用以下基本方案来修改现有架构:
1.
检查内存需求
:如果硬件的峰值内存有限,可使用空间到深度(space-to-depth)或下采样技术来减少早期层的内存占用,因为早期层的峰值内存通常最高。
2.
使用自定义非线性函数
:若自定义非线性函数性能足够好,就使用它们;若成本过高,通常仍可将其应用于最后几层。
3.
检查最后几层
:特别关注预嵌入层,这一层常被忽视,但通常可以大幅减小其规模而不会显著降低精度。
4.
按需调整嵌入大小
。
5.
固定嵌入大小的同时应用乘数
:按需应用宽度、深度和分辨率乘数。之所以最后应用这些乘数,是因为它们对延迟、模型大小和峰值内存的影响明确,因此可在过程结束时最轻松地微调资源使用。
1.2 相关术语解释
| 术语 | 解释 |
|---|---|
| 嵌入层(Embedding layer) | 也称为预逻辑层(pre-logits),是直接连接到逻辑层的最后一层的输出。该层很重要,因为它保留了当前任务类别之外的信息,这个向量可用于将模型微调至不同任务。 |
| 输入分辨率乘数(Input resolution multiplier) | 应用于输入大小的缩放系数,随后会缩放其余层的分辨率。若大于 1,通常使用更高分辨率的图像,简单的双线性上采样通常就足够了。这是一种在不改变模型大小的情况下提高模型精度的常用技术。 |
| 内部分辨率(Internal Resolution) | 特征平均池化之前最后一层的分辨率。例如,输入分辨率为 224x224 的典型 ImageNet 模型的内部分辨率为 7x7。对于等距模型,内部分辨率就是所有层的分辨率。 |
| 等距模型(Isometric models) | 一类神经网络架构,在对输入进行初始调整后,其隐藏层的分辨率保持恒定。 |
| 逻辑值(Logits) | 未归一化的类别预测向量,通常后跟 softmax 运算符以生成概率向量。 |
| MAdd | 乘法累加的缩写。一个由乘法和将结果累加到累加器组成的单一操作。MAdd 的数量常被用作衡量架构计算成本的代理指标。 |
| 模型大小(Model size) | 架构使用的参数总数。 |
| 网络深度乘数(Network depth multiplier) | 也称为深度乘数,是应用于层数的系数,用于调整架构的深度。 |
| 网络宽度乘数(Network width multiplier) | 也称为宽度乘数,是均匀应用于每层大小的系数,用于调整架构的大小。 |
| 通道数(Number of channels) | 卷积层或全连接层的特征数量。 |
| 峰值激活内存(Peak activation memory) | 对图像进行单次推理时,用于激活存储所需的 RAM 量。 |
| 跳过步长方法(Skip-stride method) | 一种模型修改过程,使用低分辨率图像(如 32x32)与原本设计用于处理高分辨率图像的模型。该过程通过将前几层的步长更改为 1,使最后一层的空间分辨率保持不变。例如,若新输入分辨率为 56x56,而原始分辨率为 224x224,此方法将消除前两层中步长为 2 的步长。 |
| 空间到深度(Space-to-depth) | 对于核大小为 k、通道数为 c、大小为 n × n × c 的图像,该操作通过将每个 k × k × c 块展平为 1 × 1 × ck2 张量,并将它们排列成 n/k × n/k,生成 n/k×n/k×nk2 张量。 |
1.3 架构调整流程
graph LR
A[检查内存需求] --> B[使用自定义非线性函数]
B --> C[检查最后几层]
C --> D[调整嵌入大小]
D --> E[应用乘数]
2. 神经网络推理量化方法概述
2.1 量化的重要性
随着数字计算机的发展,高效表示、处理和传输数值的问题随之而来,量化问题也变得尤为重要。在内存和计算资源严重受限的情况下,量化问题更加突出。近年来,由于神经网络模型在计算机视觉、自然语言处理等领域的卓越表现,量化成为了高效实现神经网络计算的重要研究子领域。从浮点表示转换为 4 位或更低精度的固定整数值,有望将内存占用和延迟降低 16 倍,在实际应用中通常能实现 4 到 8 倍的降低。
2.2 提高神经网络效率的方法分类
为了实现高效、实时且精度最优的神经网络,需要重新思考神经网络模型的设计、训练和部署。相关工作主要可以分为以下几类:
1.
设计高效的神经网络模型架构
:
-
传统方法
:通过手动搜索找到新的架构模块,如优化微架构(如深度卷积或低秩分解等核类型)和宏架构(如残差或 Inception 等模块类型),但这种方法可扩展性较差。
-
新方法
:设计自动化机器学习(AutoML)和神经架构搜索(NAS)方法,旨在在给定模型大小、深度和/或宽度的约束下,自动找到合适的神经网络架构。
2.
神经网络架构与硬件协同设计
:将神经网络架构适配特定的目标硬件平台。由于神经网络组件的开销(如延迟和能量)与硬件相关,因此这种协同设计很重要。最初的方法是手动调整架构,后来发展为使用自动化的 AutoML 和/或 NAS 技术。
3.
剪枝
:通过移除显著性(敏感性)较小的神经元来减少神经网络的内存占用和计算成本,从而得到稀疏计算图。剪枝方法可大致分为非结构化剪枝和结构化剪枝:
-
非结构化剪枝
:移除任何位置的显著性较小的神经元,可进行激进的剪枝,对模型泛化性能影响较小,但会导致稀疏矩阵运算,难以加速且通常受内存限制。
-
结构化剪枝
:移除一组参数(如整个卷积滤波器),会改变层和权重矩阵的输入和输出形状,仍允许进行密集矩阵运算,但激进的结构化剪枝通常会导致显著的精度下降。
4.
知识蒸馏
:训练一个大型模型作为教师,然后用它来训练一个更紧凑的学生模型。关键思想是利用教师产生的“软”概率,因为这些概率可以包含更多关于输入的信息。然而,仅靠知识蒸馏实现高压缩比具有挑战性,与量化和剪枝相比,激进压缩时知识蒸馏方法往往会导致不可忽视的精度下降,但与量化和剪枝结合使用时已取得了很大成功。
5.
量化
:在神经网络模型的训练和推理中都取得了显著且一致的成功。虽然数值表示和量化问题与数字计算一样古老,但神经网络为改进提供了独特的机会。尽管本综述主要关注推理量化,但量化在神经网络训练中也取得了重要成功,如半精度和混合精度训练提高了 AI 加速器的吞吐量。然而,在不进行大量调优的情况下,低于半精度的量化非常困难,因此最近的量化研究大多集中在推理上。
2.3 量化与神经科学的联系
神经科学的研究表明,人类大脑以离散/量化的形式存储信息,而非连续形式。这一观点的一个常见理由是,连续形式存储的信息不可避免地会受到噪声的干扰,而离散信号表示对这种低水平噪声更具鲁棒性。此外,离散表示还具有更高的泛化能力和在有限资源下的更高效率。
2.4 量化方法的历史
量化作为一种将大(通常是连续)集合中的输入值映射到小(通常是有限)集合中的输出值的方法,有着悠久的历史。以下是量化方法发展的重要节点:
1.
早期应用
:量化与微积分的基础相关,在 19 世纪初(甚至更早)的最小二乘法和大规模数据分析技术中就可以看到相关方法。1867 年,离散化被用于近似积分计算;1897 年,Shappard 研究了舍入误差对积分结果的影响。
2.
数字计算机时代
:1948 年,Shannon 发表了关于通信数学理论的开创性论文,正式提出了量化的影响及其在编码理论中的应用。他在无损编码理论中提出了可变速率量化的概念,即根据事件的概率改变比特数,Huffman 编码就是受此启发。1959 年,Shannon 引入了失真率函数和向量量化的概念,这些概念在后续的实际通信应用中得到了扩展和应用。
3.
信号处理和数值分析
:量化在数字信号处理中也很重要,因为将信号以数字形式表示通常涉及舍入。在数值分析和数值算法的实现中,使用有限精度算术进行实数计算也会遇到量化问题。此外,量化还引出了算法数值稳定性的概念,包括前向误差和后向误差。
2.5 神经网络量化与早期工作的区别
虽然早期有大量关于量化的研究,但神经网络量化有其独特之处。神经网络为量化提供了新的应用场景和改进机会,尤其是在处理大规模数据和复杂模型时。与早期工作相比,神经网络量化更关注如何在降低精度的同时保持模型的性能,以适应资源受限的环境。
2.6 量化方法综述结构
本综述将首先介绍量化的简要历史,然后引入量化的基本概念,这些概念是大多数量化算法共有的,对于理解和部署现有方法至关重要。接着讨论更高级的主题,主要涉及最近的最先进方法,特别是低/混合精度量化。之后探讨量化在硬件加速器(特别是边缘处理器)中的影响。最后进行总结和结论。
graph LR
A[设计高效架构] --> B[协同设计架构与硬件]
B --> C[剪枝]
C --> D[知识蒸馏]
D --> E[量化]
3. 量化的基本概念
3.1 问题设定与符号表示
量化是将连续的实数集合映射到有限的离散集合的过程。在神经网络中,通常需要对权重、激活值等进行量化。为了准确描述量化过程,需要明确一些符号和问题设定。例如,设 $x$ 为原始的连续实数,$x_q$ 为量化后的离散值,量化过程可以表示为 $x_q = Q(x)$,其中 $Q$ 是量化函数。
3.2 均匀量化
均匀量化是最常见的量化方式之一。在均匀量化中,量化区间被等分为若干个小区间,每个小区间对应一个离散值。设量化范围为 $[a, b]$,量化级数为 $N$,则量化间隔 $\Delta$ 可以表示为:
$\Delta = \frac{b - a}{N - 1}$
量化后的离散值 $x_q$ 可以通过以下公式计算:
$x_q = \text{round}(\frac{x - a}{\Delta}) \times \Delta + a$
3.3 对称和非对称量化
- 对称量化 :对称量化假设量化范围关于原点对称,即 $a = -b$。这种量化方式在计算上较为简单,因为可以利用对称性减少计算量。例如,对于 8 位对称量化,量化范围通常为 $[-127, 127]$。
- 非对称量化 :非对称量化不要求量化范围关于原点对称,$a$ 和 $b$ 可以取任意值。非对称量化可以更好地适应数据的分布,尤其是当数据分布不均匀时。例如,某些激活值可能只在正数范围内有值,此时使用非对称量化可以更准确地表示数据。
3.4 范围校准算法:静态与动态量化
- 静态量化 :在静态量化中,量化范围在训练或推理之前就已经确定。通常通过收集训练数据的统计信息(如最大值、最小值)来确定量化范围。静态量化的优点是计算简单,不需要在推理过程中进行额外的计算,但可能无法适应数据分布的变化。
- 动态量化 :动态量化在推理过程中实时确定量化范围。例如,可以根据当前输入数据的统计信息来调整量化范围。动态量化可以更好地适应数据分布的变化,但会增加推理过程中的计算开销。
3.5 量化粒度
量化粒度指的是量化操作所作用的范围。常见的量化粒度有:
-
层粒度
:对整个层的权重或激活值进行统一量化。这种方式计算简单,但可能无法充分利用数据的局部信息。
-
通道粒度
:对每个通道的权重或激活值分别进行量化。通道粒度量化可以更好地适应不同通道的数据分布,但计算量相对较大。
-
张量粒度
:对每个张量的元素分别进行量化。张量粒度量化可以提供最高的量化精度,但计算复杂度也最高。
3.6 非均匀量化
与均匀量化不同,非均匀量化的量化间隔不是相等的。非均匀量化可以根据数据的分布来调整量化间隔,使得在数据分布较密集的区域使用较小的量化间隔,在数据分布较稀疏的区域使用较大的量化间隔。常见的非均匀量化方法有对数量化等。
3.7 微调方法
3.7.1 量化感知训练
量化感知训练是在训练过程中模拟量化的影响,使得模型在训练时就适应量化后的环境。具体做法是在训练过程中插入伪量化节点,将浮点数运算转换为量化运算。通过这种方式,模型可以学习到如何在量化的情况下保持较好的性能。
3.7.2 训练后量化
训练后量化是在模型训练完成后进行量化。这种方法不需要重新训练模型,只需要根据训练数据的统计信息来确定量化参数。训练后量化的优点是简单快速,但可能会导致一定的精度损失。
3.7.3 零样本量化
零样本量化是一种不需要额外训练数据的量化方法。它通过分析模型的结构和权重分布来确定量化参数。零样本量化可以在没有训练数据的情况下进行量化,但精度可能相对较低。
3.8 随机量化
随机量化是在量化过程中引入随机性。例如,在量化时可以根据一定的概率将量化值向上或向下取整。随机量化可以减少量化误差的累积,提高量化的稳定性。
3.9 量化基本概念总结
| 量化概念 | 解释 |
|---|---|
| 均匀量化 | 量化区间等分为若干小区间,每个小区间对应一个离散值 |
| 对称量化 | 量化范围关于原点对称 |
| 非对称量化 | 量化范围不关于原点对称 |
| 静态量化 | 量化范围在训练或推理前确定 |
| 动态量化 | 量化范围在推理过程中实时确定 |
| 层粒度量化 | 对整个层进行统一量化 |
| 通道粒度量化 | 对每个通道分别量化 |
| 张量粒度量化 | 对每个张量元素分别量化 |
| 非均匀量化 | 量化间隔不相等 |
| 量化感知训练 | 训练中模拟量化影响 |
| 训练后量化 | 训练完成后进行量化 |
| 零样本量化 | 无需额外训练数据的量化 |
| 随机量化 | 量化过程引入随机性 |
3.10 量化基本概念流程
graph LR
A[问题设定与符号表示] --> B[均匀量化]
B --> C[对称和非对称量化]
C --> D[范围校准算法]
D --> E[量化粒度]
E --> F[非均匀量化]
F --> G[微调方法]
G --> H[随机量化]
4. 高级量化概念
4.1 模拟和纯整数量化
- 模拟量化 :模拟量化在推理过程中仍然使用浮点数进行计算,但模拟量化后的结果。例如,在计算过程中使用量化后的权重和激活值,但最终结果仍然以浮点数表示。模拟量化可以方便地评估量化的效果,但无法充分发挥硬件的优势。
- 纯整数量化 :纯整数量化完全使用整数进行计算,不涉及浮点数。这种方式可以充分利用硬件的整数计算单元,提高计算效率。但纯整数量化需要对模型进行更复杂的调整,以确保计算结果的准确性。
4.2 混合精度量化
混合精度量化是指在模型中使用不同精度的量化方式。例如,可以在某些层使用 8 位量化,在其他层使用 4 位量化。混合精度量化可以在精度和计算效率之间取得平衡,充分利用不同精度量化的优势。
4.3 硬件感知量化
硬件感知量化是根据目标硬件的特性来进行量化。不同的硬件对量化的支持能力不同,例如某些硬件可能对 8 位整数计算有更好的优化,而另一些硬件可能支持更低精度的量化。硬件感知量化可以充分发挥硬件的性能,提高推理效率。
4.4 蒸馏辅助量化
蒸馏辅助量化结合了知识蒸馏和量化的方法。通过使用一个较大的教师模型来指导量化后的学生模型的训练,可以提高量化模型的精度。蒸馏辅助量化可以在保持量化优势的同时,减少精度损失。
4.5 极端量化
极端量化是指使用非常低的精度(如 1 位或 2 位)进行量化。极端量化可以极大地减少内存占用和计算量,但会导致严重的精度损失。为了缓解精度损失,通常需要使用更复杂的训练方法和模型结构。
4.6 向量量化
向量量化是将向量映射到有限的离散向量集合中。在神经网络中,向量量化可以用于压缩模型的权重和激活值。通过将向量量化为离散向量,可以减少存储和计算的开销。
4.7 高级量化概念总结
| 高级量化概念 | 解释 |
|---|---|
| 模拟量化 | 推理中用浮点数模拟量化结果 |
| 纯整数量化 | 完全使用整数计算 |
| 混合精度量化 | 模型中使用不同精度量化 |
| 硬件感知量化 | 根据硬件特性进行量化 |
| 蒸馏辅助量化 | 结合知识蒸馏和量化 |
| 极端量化 | 使用极低精度量化 |
| 向量量化 | 将向量映射到离散向量集合 |
4.8 高级量化概念流程
graph LR
A[模拟和纯整数量化] --> B[混合精度量化]
B --> C[硬件感知量化]
C --> D[蒸馏辅助量化]
D --> E[极端量化]
E --> F[向量量化]
5. 量化与硬件处理器
量化对硬件处理器有着重要的影响。在边缘处理器等资源受限的设备上,量化可以显著减少内存占用和计算量,提高设备的运行效率。不同的硬件对量化的支持能力不同,一些硬件专门为量化计算进行了优化,例如某些芯片可以高效地执行 8 位或更低精度的整数计算。在选择硬件时,需要考虑其对量化的支持程度,以充分发挥量化的优势。
6. 量化研究的未来方向
未来的量化研究可能会朝着以下几个方向发展:
1.
更低精度量化
:探索更低精度(如 1 位或 2 位)量化的方法,以进一步减少内存占用和计算量。
2.
自适应量化
:开发能够根据数据分布和任务需求自适应调整量化参数的方法,提高量化的灵活性和精度。
3.
与其他技术的结合
:将量化与剪枝、知识蒸馏等技术更紧密地结合,以实现更高的压缩比和更好的性能。
4.
硬件与算法协同优化
:进一步加强硬件和算法的协同设计,使量化算法更好地适应硬件特性,提高硬件的利用率。
7. 总结与结论
量化是实现高效神经网络推理的重要方法。通过将浮点数表示转换为低精度的整数表示,可以显著减少内存占用和计算量。本文介绍了高效移动架构构建的基本方案,以及神经网络推理量化方法的相关内容,包括量化的重要性、基本概念、高级概念、与硬件处理器的关系以及未来研究方向。在实际应用中,需要根据具体的任务和硬件环境选择合适的量化方法,以实现精度和效率的平衡。
高效神经网络与量化方法综述
超级会员免费看
5533

被折叠的 条评论
为什么被折叠?



