1 基本概念

1.1 定义与特点

低精度浮点格式是指用较少位数表示实数的一类浮点编码方式。与常见的单精度和双精度相比,这类格式通常压缩了尾数位、指数位,或同时压缩两者,从而降低存储开销和运算代价。

其主要特点是位宽较小、能效较高、硬件实现更简洁,但相应地会带来更明显的舍入误差和更有限的动态范围。因此,低精度浮点数一般用于对精度要求相对宽松、但对吞吐量、带宽或功耗较敏感的任务。

1.2 与标准浮点数的区别

低精度浮点数与标准浮点数的差异,主要体现在编码长度、可表示数值范围以及有效数字的数量上。前者更强调资源节省,后者则更注重通用性和数值稳定性

1.2.1 位宽缩减

标准浮点格式通常采用较长位宽,以获得更大的可表示范围和更细的刻度。低精度格式通过减少总位数,直接降低数据占用空间,也减少了数据搬运和存储访问的压力。

这种缩减对某些密集计算任务尤其有利,因为数据传输往往比算术本身更耗时耗能。位宽下降后,单位缓存和带宽能够容纳更多数值,从而提升整体效率。

1.2.2 动态范围与精度权衡

位宽缩减带来的直接后果,是动态范围与有效精度之间必须重新分配。若增加指数位,数值跨度会更大,但尾数精度会下降;若增加尾数位,则相对精度更好,却可能牺牲可表示的最大最小值。

因此,低精度格式的设计通常围绕“够用即可”的原则展开,即在应用容忍的误差范围内尽量保留关键数值特征。

1.3 典型应用场景

低精度浮点数常见于机器学习推理和训练、图形渲染、边缘计算嵌入式系统以及高性能计算等场景。它们的共同点是数据量大、并行度高,且对吞吐和功耗比较敏感。

在这些场景中,低精度表示能够减少显存和缓存占用,加快矩阵运算与向量处理,也有助于提高设备的整体能效。对于某些实时任务,它甚至是实现可部署性的关键条件。

2 编码结构

2.1 符号位

符号位用于区分正数和负数,通常占据浮点编码的最高位。它的功能较为直接,但对整体数值表达仍然重要,因为在低位宽条件下,任何一位都显得格外“值钱”。

在绝大多数低精度格式中,符号位的设计与标准浮点数保持一致,即 0 表示正,1 表示负。由于正负数共享相同的指数和尾数结构,符号位本身并不影响数值范围,只决定方向。

2.2 指数位

指数位决定数值的数量级,是浮点格式中影响动态范围的关键部分。位数越多,可覆盖的尺度跨度越大,但在总位宽固定前提下,留给尾数的空间就会减少。

低精度格式往往需要在指数位和尾数位之间做精细平衡,以适应不同任务的误差分布。对于频繁出现极大值或极小值的应用,指数位的重要性尤为突出。

2.2.1 偏置表示

浮点指数通常采用偏置表示法,即存储的是“实际指数加上一个固定偏置”后的结果。这样可以用无符号方式编码正负指数,简化硬件处理。

偏置的存在使得指数域可以兼容更广泛的数值范围。不同格式的偏置值随指数位数变化而变化,目的是在有限位宽内尽量均衡地分配可表示区间。

2.2.2 指数溢出与下溢

当实际数值过大,指数超过可编码上限时,就会发生上溢;当数值过小,低于可表示范围时,则会出现下溢。低精度格式由于指数位较少,这类情况更容易出现。

上溢通常会导致结果被表示为无穷大或特殊值,而下溢则可能把结果压缩成非规格化数,甚至直接舍入为零。对于连续运算而言,这些现象会显著影响稳定性

2.3 尾数位

尾数位决定有效数字的细致程度。尾数越长,表示的数值越精细;尾数越短,舍入误差越明显,邻近可表示数之间的间隔也越大。

在低精度格式中,尾数位往往是最先被压缩的部分,因为它直接决定“刻度细密程度”。这种设计虽然节省空间,却也使某些微小差异难以保留。

2.3.1 隐含位与规格化

多数浮点格式采用规格化表示,即尾数前有一个默认的隐含位,用于节省一位编码空间。这样可以让有效精度在有限位宽下尽量提高。

规格化数通常具有统一的表示形式,有利于比较和运算实现。对于低精度格式而言,隐含位是提升表示效率的重要手段。

2.3.2 非规格化数

非规格化数用于表示接近零的非常小数值。它不再使用完整的规格化形式,而是通过特殊的指数编码来延续数轴的下端范围。

这类数值有助于缓解下溢带来的突然截断,使靠近零的过渡更平滑。不过,非规格化数的精度通常较低,运算代价也可能更高一些。

3 常见低精度浮点格式

3.1 半精度浮点数

半精度浮点数通常指 16 位浮点格式,是低精度浮点家族中最成熟、最广泛使用的一种。它在精度、范围和实现复杂度之间取得了相对均衡的折中。

3.1.1 16位浮点结构

典型的 16 位浮点由 1 位符号位、若干位指数和若干位尾数组成。相比单精度,它的位数明显缩短,因此存储和传输更加轻量。

尽管精度不如更高位宽格式,但半精度已经足以覆盖许多图像处理神经网络和数值近似任务的需求。

3.1.2 IEEE 754 半精度标准

IEEE 754 定义了半精度浮点的基本规则,包括编码方式、特殊值、舍入行为和运算语义。这使得不同硬件和软件环境之间能够更一致地处理该格式。

作为标准化格式,半精度的兼容性较好,便于在通用计算平台中推广。它也常被视为低精度数值计算的入门级代表。

3.2 bfloat16

bfloat16 是一种面向机器学习任务广泛使用的 16 位浮点格式。它保留了与单精度相同的指数位宽思路,同时缩短尾数,从而在较大范围内保持可用性

3.2.1 结构特点

与传统半精度相比,bfloat16 更强调动态范围而非尾数精度。其设计目标是让数值尺度尽量接近单精度,方便训练和推理中与高精度数据互通。

这种结构使它对大范围激活值、梯度值和中间结果更友好,但细小差异的分辨能力相对有限。

3.2.2 机器学习中的应用

深度学习中,bfloat16 常用于训练和推理加速,尤其适合大规模矩阵乘法和张量运算。由于它对范围较宽的数值更稳健,训练过程中的某些溢出风险可以得到缓解。

很多框架会在关键累加或参数更新环节保留更高精度,而在主计算路径中使用 bfloat16,以兼顾速度和稳定性。

3.3 8位浮点格式

8位浮点格式是近年来受到关注的更低位宽表示。它们的优势在于极高的存储压缩率和带宽效率,但数值表达能力也更受限制。

3.3.1 E4M3

E4M3 表示使用 4 位指数和 3 位尾数的 8 位浮点格式。它通常提供较好的尾数分辨率,但可表示的范围相对较窄。

该格式适合数值变化不至于过于剧烈的局部计算,也常用于经过校准或缩放后的神经网络推理流程。

3.3.2 E5M2

E5M2 则采用 5 位指数和 2 位尾数。与 E4M3 相比,它拥有更大的动态范围,但精度更低。

这种结构更适合对溢出敏感、数值跨度较大的场景。实际使用中,E4M3 与 E5M2 往往分别对应不同计算阶段或不同数据类型需求。

3.4 其他实验性格式

除较常见的格式外,研究和工程实践中还出现了多种更小位宽或更具针对性的浮点设计。这些格式多用于验证某些极端压缩条件下的可行性。

3.4.1 6位与4位浮点表示

6 位或 4 位浮点表示通常极为紧凑,适合对内存和能耗有苛刻要求的实验场景。它们往往只能支持非常有限的动态范围和粗粒度精度。

这类格式常与量化稀疏化或特殊编码配合使用,而不是单独承担通用数值计算任务。

3.4.2 定制化浮点方案

定制化浮点方案会根据应用需求重新分配符号位、指数位和尾数位。其设计目标通常不是通用兼容,而是针对某类数据分布最大化收益。

例如,某些方案会偏重指数范围,另一些则更重视局部精度。此类格式在专用硬件或研究原型中较为常见。

4 数值特性

4.1 精度损失

低精度浮点格式最显著的代价,就是可表示数值之间的间隔变大。对于相邻数值差异很小的计算,细节可能被舍入掉。

4.1.1 舍入误差

舍入误差是指实数映射到有限编码时产生的偏差。位宽越小,这种偏差越容易显著,并可能在后续计算中不断传播。

在迭代算法、累加运算或梯度更新中,舍入误差有时会改变结果的收敛速度,甚至影响最终状态。

4.1.2 累积误差

当多个低精度运算连续发生时,单次微小误差可能逐步叠加,形成累积误差。若算法本身对初值或中间结果敏感,这种累积会更加明显。

因此,许多系统会把关键中间量保留在更高精度中,仅在输入输出或非关键路径中使用低精度。

4.2 动态范围

动态范围描述了浮点格式能表示的最小与最大数值跨度。指数位越多,动态范围通常越宽;指数位越少,则越容易出现上下边界问题。

4.2.1 最大可表示值

最大可表示值由指数上限和尾数范围共同决定。对低精度格式而言,这个上限可能明显低于标准浮点,从而限制某些大数运算。

如果输入数据或中间结果超过这一上限,就容易触发上溢处理,导致信息损失。

4.2.2 最小可表示正规数

最小可表示正规数是规格化数中最接近零的正数。它反映了格式在“靠近零”区域的分辨能力。

在低精度格式中,这一值通常较大,因此非常小的量可能无法以正规数形式保存,只能依赖非规格化数或直接舍入为零。

4.3 特殊值

低精度浮点数通常也保留若干特殊值,用于表达边界情况和无效结果。这些值在计算语义中承担重要角色。

4.3.1 正负零

浮点系统一般支持正零和负零两种表示。它们在数值比较上通常相等,但在某些运算和符号分析中仍有区别。

这种设计对极限值计算、分支判断和某些数学函数处理具有意义。

4.3.2 无穷大

无穷大通常用于表示上溢结果或某些极限状态。它有助于让计算在超出范围后保持可辨识的语义,而不是产生完全不可解释的随机值。

在工程实现中,无穷大经常作为异常扩展值参与后续运算规则。

4.3.3 NaN

NaN 用于表示“不是一个数”的结果,例如无效运算或未定义情形。它在浮点体系中承担错误传播和状态标记的作用。

低精度格式中的 NaN 一般也遵循类似语义,可帮助软件和硬件快速识别异常数据。

5 计算与实现

5.1 硬件支持

低精度浮点格式的普及,与硬件对其逐步原生支持密切相关。专门的乘加单元、张量核心和向量单元,显著提升了这类格式的实用价值。

5.1.1 GPU与AI加速器

GPU 和 AI 加速器通常为低精度浮点运算提供专门指令或计算通路。这样可以在一次周期内处理更多数据,提升吞吐量并降低功耗。

这类硬件常把低精度输入与更高精度累加结合,以兼顾速度与结果稳定性。

5.1.2 SIMD与向量指令

SIMD 和向量指令集可以并行处理多个低精度数值,充分利用数据级并行能力。对于大规模数组运算,这种方式尤其有效。

当处理单位位宽下降时,同一向量寄存器中可以容纳更多元素,从而进一步提高并行密度。

5.2 软件支持

除了硬件,操作系统、编译器、运行时和数值库也需要适配低精度格式。否则,即便底层硬件具备能力,上层程序也难以方便调用。

5.2.1 编译器与运行时

编译器负责把高级语言中的低精度类型映射到具体指令或库函数。运行时则处理数据布局、类型转换和特殊值语义等问题。

良好的编译支持能够减少开发者手工处理细节的成本,也有利于不同平台之间的移植。

5.2.2 数值库与框架

数值库和机器学习框架通常会提供低精度张量、矩阵乘法和转换接口。这样用户可以在较高层次上控制精度策略,而无需深入底层编码细节。

随着生态完善,低精度格式逐渐从“硬件特性”转变为“软件可选项”。

5.3 转换与混合精度

低精度格式很少孤立使用,更多时候会与高精度格式互相转换,形成混合精度计算流程。

5.3.1 类型转换策略

类型转换通常包括上采样和下采样两类。前者用于把低精度数转换为更高精度以便累加或校正,后者用于压缩存储或传输。

转换时还需要考虑舍入方式、饱和处理和特殊值保留,以避免引入额外不稳定因素。

5.3.2 混合精度训练与推理

混合精度训练和推理是当前低精度浮点应用的重要形式。其基本思路是把大部分计算放在低精度通路中,而把敏感操作保留在更高精度中。

这种模式往往能兼顾速度、显存占用和结果质量,已成为许多深度学习系统中的常见方案。

6 误差分析与稳定性

6.1 量化误差来源

量化误差来自有限位宽对连续实数空间的离散化。输入值在映射到低精度表示时,会被逼近到最近可表示值。

此外,运算顺序、舍入规则和中间结果精度也会影响最终误差。即使输入相同,不同实现路径也可能得到略有差异的结果。

6.2 稳定性问题

在低精度条件下,数值稳定性往往比高精度更敏感。某些本来稳定的算法,在位宽缩减后也可能表现出波动。

6.2.1 梯度消失与上溢

在机器学习中,梯度值可能因为过小而下溢,也可能因为传播过程中放大而上溢。低精度格式由于范围较窄,更容易放大这类问题。

一旦梯度变成零或无穷大,参数更新过程就可能失去有效性,影响训练进程。

6.2.2 归一化与缩放技术

归一化和缩放技术常用于缓解低精度带来的稳定性问题。通过控制数值分布,可以让大部分数据落在可表示的有效区间内。

例如,在进入低精度通路前对张量进行尺度调整,或在特定层后进行重新归一化,都是常见做法。

6.3 误差控制方法

为了降低误差影响,工程上通常会结合多种控制策略,而不是单纯依赖更高位宽。

6.3.1 动态损失缩放

动态损失缩放主要用于训练过程。它通过对损失值及其梯度进行比例调整,减少小梯度在低精度下被截断的风险。

当检测到溢出风险时,缩放因子可自动调整,从而在稳定性和可训练性之间取得平衡。

6.3.2 Kahan补偿与累加优化

Kahan 补偿是一种经典的误差修正技巧,用于改善浮点累加中的精度损失。它通过保存部分舍入误差,减少多次加法叠加后的偏差。

在低精度环境下,这类累加优化尤其重要,因为简单相加更容易丢失小量信息。

7 设计与选择

7.1 格式选型原则

选择何种低精度格式,通常取决于数值范围、精度需求、硬件可用性和软件生态。没有一种格式适合所有任务,实际选择往往是折中结果。

如果应用对大范围变化更敏感,可能优先考虑指数更宽的格式;如果更注重局部细节,则可能选择尾数相对更长的方案。

7.2 计算精度与效率平衡

设计低精度系统时,关键在于找到性能收益与误差代价之间的平衡点。位宽越低,节省越明显,但模型或算法可容忍的误差也越有限。

因此,很多实现会按层、按算子甚至按数据流阶段来分配不同精度,而不是统一使用单一格式。

7.3 面向场景的优化

不同应用场景对低精度浮点的需求并不相同,格式设计和使用策略也会随之变化。

7.3.1 神经网络训练

神经网络训练通常需要兼顾收敛性和计算效率。低精度格式多用于前向传播、矩阵乘法和部分反向计算,而关键累加和参数更新可能保留较高精度。

这种分层处理有助于减少显存占用并提升吞吐,同时避免训练过程过度不稳定。

7.3.2 推理部署

推理部署更关注速度、功耗和成本,因而对低精度的接受度通常更高。只要模型精度损失在可控范围内,低精度表示往往具有明显优势。

在边缘设备或大规模在线服务中,低精度推理常被视为提升部署密度的重要手段。

7.3.3 图形与科学计算

图形处理中,某些中间缓冲、颜色通道或近似计算可以使用低精度格式,以节省带宽并提高帧率。科学计算则更谨慎,通常只在容忍误差的子任务中采用。

在这两类场景中,是否使用低精度,往往取决于结果是否会被后续步骤放大或修正。

8 发展与趋势

8.1 标准化进程

低精度浮点格式的发展,逐渐从各自封闭的实现走向更明确的规范化方向。标准化有助于统一编码、舍入和特殊值处理规则。

一旦格式具备广泛兼容性,软件生态和硬件生态就更容易协同发展。

8.2 新型低精度数制

除了传统浮点体系,研究中也不断出现新的低精度数制,如更激进的位宽压缩、可调指数分配以及混合编码方案。它们试图在特定任务上进一步压缩成本。

这些新方案往往面向特定数据分布或硬件结构,强调“场景专用”而非“通用最优”。

8.3 面向专用硬件的演进

未来的低精度浮点格式很可能继续与专用硬件深度绑定。硬件会更加重视可编程精度、稀疏计算协同和混合数制支持。

随着芯片架构演进,低精度不仅是存储格式,也会成为系统级性能优化的重要接口。