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