第十八章 番外篇:混合精度训练

本文介绍了float32和float16浮点数格式及其计算规则,讨论了半精度(float16)在解决计算和内存限制方面的优势,以及可能遇到的溢出和舍入误差问题。在PyTorch中,使用torch.autocast和torch.cuda.amp.GradScaler进行混合精度训练,以提高效率并保持模型准确性。文章还提到了如何处理梯度惩罚以适应混合精度环境。

参考教程:
https://pytorch.org/tutorials/recipes/recipes/amp_recipe.html?highlight=amp
https://pytorch.org/docs/stable/amp.html
https://arxiv.org/pdf/1710.03740.pdf
https://zhuanlan.zhihu.com/p/79887894

原理

float 32

参考资料:wikipedia/float32

float32的格式如上图。一共三十二位。

  1. 蓝色区域占一位:表示sign。
  2. 绿色区域占八位:表示exponent。
  3. 红色区域占23位:表示fraction。

它的计算规则如下:
在这里插入图片描述
假如你的 Exponent位全为0,那么fraction位有两种情况。

  • fraction全为0,则最终结果为0。
  • fraction不为0,则表示一个subnormal numbers,也就是一个非规格化的浮点数。
    ( − 1 ) s i g n × 2 − 126 × ( f r a c t i o n 2 23 ) (-1)^{sign} \times2^{-126} \times(\frac{fraction}{2^{23}}) (1)sign×2126×(223fraction)

假如你的Exponent位全为1,那么fraction位有两种情况。

  • fraction全为0, 则最终结果为inf。
  • fraction不为0,则最终结果为NaN。

假如你的Exponent是其他的情况,那么数据的计算公式为:
( − 1 ) s i g n × 2 ( e x p o n e n t − 127 ) × ( 1 + f r a c t i o n 2 23 ) (-1)^{sign}\times2^{(exponent-127)}\times(1+\frac{fraction}{2^{23}}) (1)sign×2(exponent127)×(1+223fraction)
因此float32能取到的最小正数是 2 − 126 2^{-126} 2126,最大正数是 2 2 8 − 2 − 127 × ( 1 + 2 23 − 1 2 23 ) 2^{2^8-2-127}\times(1+\frac{2^{23}-1}{2^{23}}) 2282127×(1+2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值