发布于

Float32、Float16 或 BFloat16!

作者

为什么这对深度学习有重要意义?

Image

这些只是精度的不同级别。Float32是一种用32位(1或0)表示浮点数的方法,而Float16/BFloat16则是用16位表示相同数字的方法。使用Float32,我们分配第一个位来表示符号,接下来的8位来表示指数,接下来的23位来表示小数点(也称为尾数)。我们可以使用简单的公式从位表示转换为十进制表示:

Float32 = (-1)^符号 * 2^(指数 - 127) * (1 + 尾数)

并且其范围可以在-3.4e^38和3.4e^38之间。

Float16使用1位表示符号,5位表示指数,10位表示尾数,公式为:

Float16 = (-1)^符号 * 2^(指数 - 15) * (1 + 尾数)

并且其范围在-6.55e^4和6.55e^4之间(因此范围要小得多!)。要从Float32转换为Float16,只需删除无法适应指数和尾数分配的5位和10位的数字即可。对于尾数,您只是创建一个舍入错误,但如果Float32数字大于6.55e^4,您将创建一个浮点溢出错误!因此,从Float32到Float16的转换错误是完全可能的。

Brain Float 16(BFloat16)是另一种16位浮点表示形式。我们提供较少的十进制精度,但与Float32相同的范围。我们为指数分配8位,为尾数分配7位,使用相同的转换公式:

BFloat16 = (-1)^符号 * 2^(指数 - 127) * (1 + 尾数)

给出与Float32相同的范围[-3.4e^38和3.4e^38]。因此,从Float32转换为BFloat16是微不足道的,因为您只需要向下舍入尾数。

这对于深度学习非常重要,因为在反向传播算法中,模型参数由梯度下降优化器(例如Adam)更新,并且计算是用Float32精度执行的,以确保较少的舍入错误。模型参数和梯度通常以Float16存储在内存中,以减少对内存的压力,因此我们需要在Float16和Float32之间来回转换。BFloat16是一个好的选择,因为它可以防止浮点溢出错误,同时保持足够的精度用于反向传播算法的前向和后向传递。

请注意,中文版本是由 AI 辅助翻译的,因此可能存在细微错误。

作者

Ai Base Network (ABN), ABN ASIA由具有深厚学术背景的人员创立,他们在美国、荷兰、匈牙利、日本、韩国、新加坡和越南等国家有工作经验。ABN Asia是学术界和技术相遇的地方。凭借我们领先的解决方案和优秀的软件开发服务,我们帮助企业提升水平,走向全球舞台。我们的承诺:更快。更好。更可靠。在大多数情况下:也更便宜。

无论您需要IT服务、数字咨询、现成软件解决方案,还是想向我们发送招标要求(RFPs),都请随时与我们联系。您可以通过[email protected]与我们联系。我们随时准备为您提供所有技术需求的帮助。

ABNAsia.org

© ABN ASIA