深度神经网络的量化
在数字硬件中,数字以二进制字的形式存储。二进制字是一个固定长度的位序列(1和0)。数据类型定义了硬件组件或软件函数如何解释这个1和0的序列。数字可以表示为缩放的整数(通常称为定点)或浮点数据类型。
大多数预先训练的神经网络和使用深度学习工具箱™训练的神经网络使用单精度浮点数据类型。即使是经过训练的小型神经网络也需要相当大的内存,并且需要能够执行浮点运算的硬件。这些限制可能会抑制深度学习功能在低功耗微控制器和fpga上的部署。
使用深度学习工具箱模型量化库支持包,可以对网络进行量化,以使用8位缩放的整数数据类型。
要了解将深度学习网络量化并部署到GPU2022世界杯八强谁会赢?、FPGA或CPU环境所需的产品,请参见量化工作流先决条件.
精度和范围
与单精度浮点数据类型相比,缩放的8位整数数据类型的精度和范围有限。在将数字从较大的浮点数据类型强制转换为较小的固定长度的数据类型时,有几个数值注意事项。
精度损失:精度损失是舍入误差。当发生精度损失时,值被四舍五入到数据类型所表示的最接近的数字。在平局的情况下:
正无穷大方向上最接近可表示值的正数。
负数到负无穷方向上最接近的可表示值。
在MATLAB®方法可以执行这种类型的舍入
轮
函数。下漏:下漏是一种精度损失。当值小于数据类型所表示的最小值时,就会发生下流。当发生这种情况时,值饱和为零。
溢出:当值大于数据类型所能表示的最大值时,就会发生溢出。当发生溢出时,该值饱和到数据类型所表示的最大值。
动态范围直方图
使用深层网络量化器App收集并可视化一个网络的卷积层和全连接层的权值和偏差的动态范围,以及网络中所有层的激活情况。该应用程序为网络的卷积层的权重、偏差和激活分配一个缩放的8位整数数据类型。该应用程序显示每个参数的动态范围的直方图。下面的步骤描述了这些直方图是如何产生的。
在使用网络时,请考虑为参数记录的以下值。
找到参数的每个日志值的理想二进制表示形式。
最有效位(MSB)是二进制字最左边的位。这个位对数字的值贡献最大。每个值的MSB用黄色突出显示。
通过对齐二进制字,您可以看到参数的日志值所使用的位的分布。每一列中MSB的总和(用绿色突出显示)给出了记录值的汇总视图。
每个位位置的MSB计数显示为热图。在这张热图中,较深的蓝色区域对应着比特位置上更多的MSB。
的深层网络量化器App分配一个可以避免溢出、覆盖范围和允许溢出的数据类型。需要一个额外的符号位来表示值的符号性。
下图显示了一个表示来自2的位的数据类型示例3.到23,包括符号位。
分配数据类型后,将删除该数据类型以外的任何位。由于分配了固定长度的较小数据类型,对于数据类型不能表示的值,可能会发生精度损失、溢出和下溢。
在本例中,值0.03125受到下溢的影响,因此量化值为0。值2.1损失了一些精度,因此量化值为2.125。值16.250大于该数据类型的最大可表示值,因此该值溢出,量化值饱和到15.874。
的深层网络量化器App显示了网络卷积层和全连接层中每个可学习参数的热图直方图。直方图的灰色区域显示了数据类型不能表示的位。