神经网络量化(一)

引言

  神经网络在许多应用中推动了前沿的发展,但往往需要高昂的计算成本。如果我们想将现代网络集成到具有严格功耗和计算要求的边缘设备中,降低神经网络推理的功耗和延迟是关键。神经网络量化是实现这些节省的最有效方法之一,但它引入的额外噪声可能会导致准确性下降。
  在本文中,我们介绍了最先进的算法,用于减轻量化噪声对网络性能的影响,同时保持低位权重和激活。我们首先从硬件驱动的角度介绍量化,然后考虑两类主要算法:后训练量化(PTQ)和量化感知训练(QAT)。PTQ不需要重新训练或标记数据,因此是一种轻量级的量化方法。在大多数情况下,PTQ足以实现接近浮点精度的8位量化。QAT需要微调和访问标记的训练数据,但可以实现更低位的量化,并获得有竞争力的结果。对于这两种解决方案,我们提供了基于现有文献和广泛实验的测试流程,以实现常见深度学习模型和任务的最先进性能。

1 介绍

  随着深度学习作为一种通用工具在电子设备中注入智能的流行度不断上升,对小型、低延迟和高能效的神经网络解决方案的需求也在增加。如今,神经网络可以在许多电子设备和服务中找到,包括智能手机、智能眼镜、家用电器、无人机、机器人和自动驾驶汽车。这些设备通常对神经网络的执行时间有严格的限制,或对长时间性能有严格的功耗要求。
  减少神经网络的计算时间和能耗的最具影响力的方法之一是量化。在神经网络量化中,权重和激活张量以比通常训练时的16或32位精度更低的位精度存储。从32位到8位的转换,存储张量的内存开销减少了4倍,而矩阵乘法的计算成本则按16倍的二次方减少。研究表明,神经网络对量化具有鲁棒性,这意味着它们可以以较小的网络精度影响进行量化。此外,神经网络量化通常可以与神经网络优化的其他常见方法(如神经架构搜索、压缩和修剪)同时应用。对于深度学习的任何实际用例,它都是模型效率流程中的一个重要步骤。然而,神经网络量化并非免费。低位宽量化会引入噪声到网络中,可能导致准确性下降。虽然某些网络对这种噪声具有鲁棒性,但其他网络需要额外的工作来利用量化的好处。
  在本文中,我们介绍了神经网络量化的最新技术。我们首先介绍了量化的基本概念,并讨论了硬件和实际考虑因素。然后,我们考虑了两种不同的神经网络量化方法:训练后量化(PTQ)和量化感知训练(QAT)。第3节讨论了PTQ方法,它采用已训练的网络,并在几乎没有数据的情况下进行量化,需要最少的超参数调整和无需端到端训练。这使得它们成为一种低工程成本和计算成本的量化神经网络的简便方法。相比之下,第4节讨论的QAT方法依赖于在训练流程中使用模拟量化重新训练神经网络。虽然这需要更多的训练工作和可能的超参数调整,但与PTQ相比,它通常进一步接近完全精度的准确性。对于这两种方法,我们介绍了基于现有文献和广泛实验的标准流程,以实现常见计算机视觉和自然语言处理模型的最新性能。我们还提出了一种调试工作流程,用于识别和解决量化新模型时的常见问题。

2 量化基础

  在本节中,我们介绍神经网络量化和定点加速器的基本原理。我们首先从硬件动机开始,然后介绍标准的量 化方案及其特性。随后,我们讨论与现代神经网络中常见的层相关的实际考虑因素,以及它们对定点加速器的影响。

2.1 硬件背景

  在深入了解技术细节之前,我们首先探讨量化的硬件背景以及它如何实现设备上的高效推理。图1提供了神经网络(NN)加速器中计算矩阵-向量乘法y = Wx + b的示意图。这是神经网络中更大的矩阵-矩阵乘法和卷积的构建模块。这样的硬件模块旨在通过尽可能并行地执行尽可能多的计算来提高神经网络推理的效率。该NN加速器的两个基本组成部分是处理单元Cn,m和累加器An。图1中的示例有16个排列成方形网格的处理单元和4个累加器。计算从将累加器加载为偏置值bn开始。然后,我们将权重值Wn,m和输入值xm加载到数组中,并在各自的处理单元中计算它们的乘积Cn,m = Wn,m xm,这一过程在一个周期内完成。然后将它们的结果添加到累加器中:
公式 1
  上述操作也被称为乘加(MAC)。对于更大的矩阵-向量乘法,这个步骤会重复多次。完成所有循环后,累加器中的值将被移回内存,以便在下一个神经网络层中使用。神经网络通常使用FP32的权重和激活进行训练。如果我们要在FP32中执行推理,处理单元和累加器必须支持浮点逻辑,并且我们需要将32位数据从内存传输到处理单元。MAC操作和数据传输在神经网络推理过程中消耗了大部分能量。因此,通过使用较低位的定点或量化表示来表示这些量,可以获得显著的好处。低位定点表示,如INT8,不仅减少了数据传输量,还减小了MAC操作的大小和能量消耗。这是因为数字算术的成本通常与使用的位数呈线性到二次方的比例,并且定点加法比浮点加法更高效。
图 1

(图一 神经网络加速器硬件中矩阵乘法逻辑的示意概述)



  为了从浮点数转换为高效的定点操作,我们需要一种将浮点向量转换为整数的方案。一个浮点向量x可以近似表示为一个标量乘以一个整数向量的形式:

公式 2
  其中sx是浮点比例因子,xint是一个整数向量,例如INT8。我们将向量的量化版本表示为xb。通过对权重和激活进行量化,我们可以写出累加方程的量化版本

公式 3

  请注意,我们对权重和激活使用了单独的比例因子,分别为sw和sx。这提供了灵活性并减少了量化误差(详见第2.2节)。由于每个比例因子应用于整个张量,这个方案允许我们将比例因子从方程(3)的求和中分离出来,并以定点格式执行MAC操作。我们目前有意忽略偏置的量化,因为偏置通常以较高的位宽(32位)存储,并且其比例因子取决于权重和激活的比例因子。
  图2显示了当我们引入量化时神经网络加速器的变化。在我们的示例中,我们使用INT8算术,但为了讨论的目的,这可以是任何量化格式。对于累加器来说,保持较高的位宽非常重要,通常为32位。否则,在计算过程中累积更多乘积时,我们可能会因溢出而产生损失。
  存储在32位累加器中的激活需要在下一层使用之前写入内存。为了减少数据传输和下一层操作的复杂性,这些激活被重新量化为INT8。这需要一个重新量化的步骤,如图2所示。
图 2

( 图2 用于量化推断的神经网络加速器中的矩阵乘法逻辑的示意图)
Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐