对于TinyML来说,他们面临的主要挑战是如何采用相对较大的神经网络(有时为数百兆字节),使其适合并在资源受限的微控制器上运行,同时保持最小的功率预算。为此,最有效的技术称为量化(quantization)。
本文将提供对量化的基本理解,它是什么,它是如何使用的,以及为什么它很重要。
在理解量化之前,重要的是要讨论为什么神经网络通常会占用如此多的内存。
神经网络由一系列层中的一系列相互连接的神经元组成。如图 1 所示,标准神经网络由相互连接的神经元层组成,每个神经元都有自己的权重(weights)、偏差(biases)和与之相关的激活函数。
图 1. 神经网络中的神经元示例。神经元之间的每个连接都有自己的权重,而每个神经元都有自己的偏置和激活函数 这些权重和偏差通常被称为神经网络的“参数”。
每个神经元也有自己的“激活”(activation),这个数字决定了该神经元的活跃程度。神经元的激活基于其权重和偏差值,以及使用的激活函数。
权重和偏差是在训练期间调整的参数,并且通过扩展,神经元的激活也是如此。
这些值、权重、偏差和激活值是神经网络物理存储在内存中的大部分内容。标准是将这些数字表示为 32 位浮点值,这样可以实现高水平的精度,并最终提高神经网络的准确性。
这种准确性是神经网络倾向于占用如此多内存的原因。对于具有数百万个参数和激活的网络,每个都存储为一个 32 位值,内存使用量很快就会增加。
例如,50 层的 ResNet 架构包含大约 2600 万个权重和 1600 万个激活。通过使用 32 位浮点值来表示权重和激活值,整个架构将需要 168 MB 的存储空间。
量化是降低权重、偏差和激活的精度的过程,以使它们消耗更少的内存。
换句话说,量化的过程就是取一个神经网络的过程,它一般使用 32 位浮点数来表示参数,而是将其转换为使用更小的表示,例如 8 位整数。
例如,从 32 位到 8 位,模型大小会减少 4 倍,因此量化的一个明显好处是显着减少内存。
图 2 显示了一个示例。
图 2.量化通过降低权重、偏差和激活的精度来缩小神经网络
量化的另一个好处是它可以降低网络延迟和提高电源效率。
由于可以使用整数而不是浮点数据类型执行操作,因此提高了网络速度。这些整数运算需要在大多数处理器内核(包括微控制器)上进行较少的计算。
总体而言,由于减少了计算和减少了内存访问,因此功率效率得到了提高。
尽管有这些好处,但与量化的权衡是神经网络可能会失去准确性,因为它们不能精确地表示信息。然而,根据精度损失的多少、网络架构和网络训练/量化方案,已经表明量化通常会导致非常小的精度损失,尤其是在权衡延迟、内存使用方面的改进时,和权力。
在实践中,有两种主要的量化方式: 1.训练后量化 2.量化感知训练
顾名思义,训练后量化是一种技术,其中神经网络完全使用浮点计算进行训练,然后进行量化。
为此,一旦训练结束,神经网络就会被冻结,这意味着它的参数不能再更新,然后参数就会被量化。量化模型最终被部署并用于执行推理,而无需对训练后参数进行任何更改。
虽然这种方法很简单,但由于所有与量化相关的误差都发生在训练完成后,因此无法补偿,因此会导致更高的精度损失。
如图 3 所示,量化感知训练通过在训练期间使用前向传递中的量化版本训练神经网络来补偿与量化相关的误差。
图3.量化感知训练流程图 这个想法是量化相关的误差会在训练过程中累积在模型的总损失中,训练优化器将相应地调整参数并整体减少误差。
量化感知训练的好处是损失比训练后量化低得多。
有关量化背后的数学的更深入的技术讨论,建议阅读Gholami 等人的这篇论文。
对于 TinyML,量化是一个非常宝贵的工具,是整个领域的核心。
总而言之,量化是必要的,主要有以下三个原因:
1.量化显着减小了模型大小——这使得在内存受限的设备(如微控制器)上运行 ML 更加可行。
2.量化允许 ML 模型在需要较少处理能力的情况下运行——TinyML 中使用的 MCU 的处理单元的性能往往低于标准 CPU 或 GPU。
3.量化可以降低功耗——TinyML 的最初目标是以低于 1mW 的功率预算执行 ML 任务。这是在由纽扣电池等小型电池供电的设备上部署 ML 所必需的。