《Mixed Precision Training》
思路如图1,
简单说,权值用32位保存,然后训练过程中截断为16位,而后weight和activation都用FP16来计算,最后更新还是使用FP32的权值。
两种方法来控制半精度的信息损失。
一、保存一个单精度浮点的权值备份。在训练过程中舍入到半精度。(加速训练?减少硬件开销?但是没有减少存储的参数量)
二、适当地缩放损失
结果:
精度没有损失,
memory减少约一半,
速度更快。
所有的过程用的是半精度FP16;
没有超参需要针对调整;这种方法对比单精度没有精度损失;
可以用于大部分模型(可以用于大数据集)
亮点:两种方法来控制半精度的信息损失。
一、保存一个单精度浮点的权值备份。在训练过程中舍入到半精度。(加速训练、减少硬件开销、存储的参数量增加了50%,但是由于减少了过程中的activation,所以总体来说还是减少了memory的消耗);
同时FP16在硬件实现中更快。
假如单纯的使用FP16训练,精度降低了80%,所以要使用32位量化训练,但是参数更新过程使用16位。
为什么需要FP32:
l 有些梯度太小,在FP16就变成0,大约有5%的数据被忽略成0(感觉不是很合理,毕竟2^-24太小了影响不大)
l 有些数太大,即使在FP16下可以表示,当加法右移操作使它二进制点对齐时,仍然可能变为0
二、适当地缩放数值。
等于是把图三整体右移,即scaling up方法是乘以8即右移三位
实验过程很完善,在ILSVRC、Detection CNN、Speech Recognition、Machine Translation、Language Modeling、DCGAN都做了实验。