为什么我们需要浮点数来使用神经网络?

人工智能 神经网络 机器学习
2021-11-04 20:53:06

是否可以通过将每个函数的输入和输出缩放到 [-INT_MAX, INT_MAX] 来制作仅使用整数的神经网络?有什么缺点吗?

4个回答

TL;博士

不仅是可能的,它甚至可以完成并在商业上可用这对于非常擅长 FP 算术的商品硬件来说是不切实际的。

细节

这绝对是可能的,而且你可能会因为很多麻烦而获得一些速度。

浮点的好处是它可以在你不知道确切范围的情况下工作。您可以将输入缩放到该范围(-1, +1)(这种缩放很常见,因为它可以加快收敛速度​​)并将它们乘以2**31,因此它们使用有符号 32 位整数的范围。没关系。

你不能对你的体重做同样的事情,因为它们没有限制。您可以假设它们位于区间内(-128, +128)并相应地缩放它们。

如果你的假设是错误的,你会得到一个溢出和一个巨大的负权重,而一个巨大的正权重应该是,或者相反。无论如何,一场灾难。

你可以检查溢出,但这太贵了。你的算术比 FP 慢。

您可以不时检查可能的溢出并采取纠正措施。细节可能会变得复杂。

您可以使用饱和算法,但它仅在某些专用 CPU 中实现,而不在您的 PC 中实现。

现在,有一个乘法。使用 64 位整数,它运行良好,但您需要计算一个总和(可能存在溢出)并将输出缩放回相同的合理范围(另一个问题)。

总而言之,有了快速的 FP 算法,这不值得麻烦。

对于定制芯片来说,这可能是一个好主意,它可以用更少的硬件和比 FP 更快的速度进行饱和整数运算。


根据您使用的整数类型,与浮点数相比可能会有精度损失,这可能会或可能无关紧要。请注意,TPU(用于 AlphaZero)只有 8 位精度。

有些人可能会争辩说,我们可以使用int而不是float在 NN 中,因为float可以很容易地表示为int / k哪里k是一个乘数,10 ^ 9例如 0.00005 可以通过乘以 10 ^ 9 转换为 50000..

从纯理论的角度来看:这绝对是可能的,但它会导致精度损失,因为int落在INTEGER数字集合中而floats落在REAL NUMBER集合中。如果您使用非常高的精度,例如,将实数转换为 int 将导致高精度损失float64实数具有不可数无穷大,而整数具有可数无穷大,并且有一个众所周知的论点称为康托尔的对角化论点证明了这一点。是相同的美丽插图。在了解了差异之后,您将直觉地理解为什么将 int 转换为 float 是站不住脚的。

从实用的角度来看:最广为人知的激活激活函数是 sigmoid 激活(tanh 也非常相似)。这些激活的主要属性是将数字压缩到0 and 1或之间-1 and 1如果您通过乘以一个大因子将浮点数转换为整数,这几乎总是会产生一个很大的数字,并将其传递给任何此类函数,则结果输出几乎总是任何一个端点(即1 or 0)。

谈到算法,类似于带有动量的反向传播的算法不能在int. 这是因为,因为您将缩放int到一个很大的数字,并且动量算法通常使用某种momentum_factor^n公式,其中n已经迭代的示例数量是多少,您可以想象结果如果momentum_factor = 100 and n = 10.

缩放可能起作用的唯一可能的地方是relu激活。这种方法的问题是,如果数据可能不太适合这个模型,则会出现相对较高的错误。

最后: NN 所做的只是逼近一个real valued函数。您可以尝试通过将它与一个因子相乘来放大这个函数,但是当您从实值函数切换到整数时,您基本上将该函数表示为一系列steps. 会发生这样的事情(图像仅用于表示目的): 在此处输入图像描述

您可以在这里清楚地看到问题,每个二进制数代表一个步骤,为了获得更好的准确性,您必须在给定长度内增加二进制步骤,这在您的问题中将转化为具有非常高的边界值 [-INT_MAX, INT_MAX] .

浮点硬件

有三种常见的浮点格式用于逼近数字算术电路中使用的实数。这些在 IEEE 754 中定义,该标准于 1985 年采用并于 2008 年修订。这些按位布局实数表示的映射被设计到 CPU、FPU、DSP 和 GPU 中,无论是门级硬件、固件还是图书馆1 .

  • 二进制 32 有一个 24 位尾数和一个 8 位指数
  • 二进制 64 有一个 53 位尾数和一个 11 位指数
  • 二进制 128 有一个 113 位尾数和一个 15 位指数2

选择数值表示的因素

这些中的任何一个都可以表示信号处理中的信号,并且所有这些都已在 AI 中进行了实验,用于与三件事相关的各种目的:

  • 值范围——在信号正确归一化的机器学习应用中不是问题
  • 用舍入噪声避免信号饱和——参数调整的关键问题
  • 在给定的目标架构上执行算法所需的时间

最佳设计 AI 的平衡点在最后两项之间。在神经网络中的反向传播的情况下,基于梯度的信号近似于期望的校正动作以应用于每层的衰减参数,不得因舍入噪声而饱和。3

硬件趋势偏爱浮点

由于某些市场和常见用途的需求,使用这些标准的标量、向量或矩阵运算在某些情况下可能比整数运算更快。这些市场包括...

  • 闭环控制(引导、瞄准、对策)
  • 代码破解(傅里叶,有限,收敛,分形)
  • 视频渲染(看电影、动画、游戏、VR)
  • 科学计算(粒子物理学、天体动力学)

一阶转换为整数

在数值范围的另一端,可以将信号表示为整数(有符号)或非负整数(无符号)。

在这种情况下,微积分4世界中的实数、向量、矩阵、立方体和超立方体的集合与逼近它们的整数之间的转换是一次多项式。

多项式可以表示为n=r(as+b), 在哪里a0,n是二进制数的近似值,s是标量实数,并且r是将实数四舍五入为最接近整数的函数。这定义了定点算术概念的超集,因为b.

基于整数的计算也已针对许多 AI 应用进行了实验检查。这提供了更多选择:

  • 二进制补码 16 位整数
  • 16 位非负整数
  • 二进制补码 32 位整数
  • 32 位非负整数
  • 二进制补码 64 位整数
  • 64 位非负整数
  • 二进制补码 128 位整数
  • 128 位非负整数

示例案例

例如,如果您的理论表明需要表示范围内的实数[π,π]在某些算法中,您可能会将此范围表示为 64 位非负整数(如果由于某种算法和可能特定于硬件的原因,这有利于速度优化)。

你知道的[π,π]从微积分发展而来的封闭形式(代数关系)需要在范围内表示[0,2641],所以在n=r(as+b),a=261b=260. 选择a=264π当对基数为 2 的指数的简单操作更有效时,可能会在乘法中产生更多丢失循环的需要。

该实数的值范围将是 [0, 1100,1001,0000,1111,1101,1010,1010,0010,0010,0001,0110,1000,1100,0010,0011,0101] 和通过保持基于二的幂的关系而浪费的比特将是log24log2π,大约为 0.3485 位。这比 99% 的信息保存要好。

回到问题

这个问题很好,并且取决于硬件和领域。

如上所述,硬件正在朝着与 IEEE 浮点向量和矩阵运算一起工作的方向不断发展,特别是在 32 位和 64 位浮点乘法方面。对于某些领域和执行目标(硬件、总线架构、固件和内核),浮点算法的性能可能大大超过通过应用上述一阶多项式变换在 20 世纪 CPU 中可以获得的性能提升。

为什么这个问题是相关的

在合同中,如果产品制造价格、功耗以及 PC 板尺寸和重量必须保持在较低水平才能进入某些消费、航空和工业市场,则可能需要低成本 CPU。根据设计,这些较小的 CPU 架构没有 DSP,FPU 功能通常没有硬件实现 64 位浮点乘法。5

处理数字范围

如上所述,对信号进行归一化并为ab选择正确的值至关重要,这比使用浮点更重要,因为在浮点中,指数的减小可以消除许多整数6会出现饱和问题的情况。当然,指数的增加也可以在一定程度上自动避免溢出。

在任何一种类型的数字表示中,归一化都是提高收敛速度和可靠性的一部分,因此应该始终解决它。

在需要小信号的应用程序中处理饱和的唯一方法(例如反向传播中的梯度下降,尤其是当数据集范围超过一个数量级时)是仔细计算数学以避免它。

这本身就是一门科学,只有少数人具备处理电路和汇编语言级别的硬件操作以及线性代数、微积分和机器学习理解的知识范围。跨学科技能组合是稀有而宝贵的。


笔记

[1] 用于低级硬件操作(例如 128 位乘法)的库是用交叉汇编语言或 C 语言编写的,并打开了 -S 选项,因此开发人员可以检查机器指令。

[2] 除非你要计算宇宙中的原子数、围棋游戏中可能的排列数、到火星陨石坑中着陆台的路线,或者以米为单位的距离,以达到潜在的围绕 Proxima Centauri 旋转的宜居行星,您可能不需要比三种常见的 IEEE 浮点表示法更大的表示法。

[3] 当数字信号接近零并且数字表示中最低有效位的舍入开始产生接近信号幅度的混沌噪声时,舍入噪声自然会出现。发生这种情况时,信号会在该噪声中饱和,无法用于可靠地传递信号。

[4] 在软件驱动算法中实现的封闭形式(代数公式)来自方程的解,通常涉及微分。

[5] 在非地面和消费市场中,带有 GPU 的子板通常过于昂贵、耗电、热、重和/或包装不友好。

[6] 此答案中跳过了反馈的归零,因为它指向以下两件事之一:(A)完美收敛或(B)数学解析不佳。

原则上这是可能的,但您最终会在多个地方使用整数来模拟浮点运算,因此对于一般用途来说不太可能有效。培训可能是个问题。

如果一个层的输出被缩放到 [-INT_MAX, INT_MAX],那么你需要将这些值乘以权重(你还需要是具有足够大范围的整数,以便学习可以顺利进行)并将它们相加,然后将它们输入非线性函数。

如果您仅限于整数运算,这将涉及处理多个整数以表示较大 int 类型的高/低字,然后您必须对其进行缩放(这引入了多字整数除法)。到您完成此操作时,使用整数算术不太可能有很多好处。虽然也许它仍然是可能的,这取决于问题、网络架构和您的目标 CPU/GPU 等。

有一些用于计算机视觉的工作神经网络只有 8 位浮点(训练后下采样)因此,绝对可以简化和近似一些 NN。从预训练的 32 位 fp 派生的基于整数的 NN 可能在某些嵌入式环境中提供良好的性能。在 PC AMD 芯片上发现了这个实验,即使在 PC 架构上也显示出微小的改进。在没有专用 fp 处理的设备上,相对改进应该会更好。