Skip to content

LLMs 浮点数篇

来源:AiGC面试宝典 整理:宁静致远(2024年01月27日)


一、fp32 和 fp16 的区别,混合精度的原理

  • fp32(单精度):32 位浮点数,占用 4 字节,提供高精度的数值表示。

    📝通俗解释:fp32 就像用详细的尺子量东西,精度很高,但占用的空间大,计算也相对慢一些。

  • fp16(半精度):16 位浮点数,占用 2 字节,数值表示精度相对较低,但在许多深度学习场景下仍足够使用。

    📝通俗解释:fp16 就像用简略的尺子量东西,精度稍微低一点,但节省了一半的空间和计算时间。

  • 混合精度的原理:在模型训练中同时使用 fp16 和 fp32,以在保持精度的同时提高计算效率。通常做法是:

    • 模型参数和激活值使用 fp16 表示
    • 梯度使用 fp16 计算
    • 梯度累积和参数更新使用 fp32 进行

    📝通俗解释:混合精度就像"粗活儿用粗工具,细活儿用细工具"。大部分计算用 fp16 加快速度,关键的累加操作用 fp32 保证不会因为精度损失而出错。


二、半精度是什么?

半精度(Half Precision)是指使用 16 位二进制浮点数 来表示数字的数据类型,主要用于加速计算和减小内存占用。

📝通俗解释:半精度就像把一本书的内容从详细版(32位)压缩成精简版(16位),虽然细节少了一些,但核心内容还在,而且读起来更快、更省纸。


三、半精度的理论原理是什么?

半精度使用 16 位二进制浮点数 来表示数字,其结构分配如下:

组成部分位数说明
符号位1 位决定数值的正负
指数位5 位决定数值的表示范围
尾数位10 位决定数值的精度

相比之下:

  • 单精度(fp32):1 位符号 + 8 位指数 + 23 位尾数
  • 双精度(fp64):1 位符号 + 11 位指数 + 52 位尾数

半精度的表示范围精度都比单精度和双精度小,但通过降低内存占用和加速计算,可以实现更高效的运算。

📝通俗解释:浮点数的表示就像写科学计数法。指数位相当于"10的多少次方",决定能表示多大的数;尾数位相当于"有效数字",决定能精确到多小。半精度因为位数少,所以能表示的"数的大小范围"和"精细程度"都比32位差一些,但在深度学习中通常够用。


整理日期:2024/8/11

基于 MIT 许可发布