混合精度与损失缩放

模型究竟是如何学习的——从原始梯度下降到Adam

混合精度训练使用更小的数字格式来换取速度和内存。许多运算不再用全精度(标准的 32 位浮点数)来存储每一次计算,而是改用 float16 或 bfloat16:这两种 16 位格式只占一半的内存,代价是精度更低,而对 float16 来说,可表示的数值范围也更窄。

风险在于数值范围。有些梯度非常小。如果一个微小的数被四舍五入成零,优化器就会丢失信息。损失缩放通过在反向传播之前把损失乘大,再把得到的梯度除回来,从而保护这些微小的梯度。

一台只能精确到整克的厨房秤,可能称不出一小撮调味料的重量。但如果你把十份相同的一小撮放在一起称,秤就能读出总重量,再除以十就能还原出一份的重量。损失缩放用的是同样的技巧:先让那个小数值更容易被表示出来,再把它缩放回去。下面的图提醒着这一切的关键所在——只有当每一步的梯度都能在运算中幸存下来,下降过程才会奏效;精度并不会改变这个循环本身,它决定的是靠近最小值附近那些微小的坡度,能不能被循环继续看见。

在机器学习中的应用混合精度是大型神经网络能在现代硬件上快速训练的原因之一。优化器所需要的那些概念并没有改变,但数值尺度本身也成了训练配方的一部分。
▶ 混合精度与损失缩放
← 交替最小二乘法批量大小缩放 →