混合精度训练
论文:https://arxiv.org/pdf/1710.03740.pdf
译文:混合精度训练
摘要
增加神经网络的size,可以提高准确率。但同时,也加大了训练模型所需的内存和计算量。我们介绍一种使用半精度浮点数来训练深度神经网络的方法,不会损失准确率,也不需要修改超参数。这种方法让内存需求减半,而且在最近的GPU上,加速了算术运算。权值、激活值和梯度都以IEEE半精度格式存储。由于半精度的数值范围比单精度小,我们提出3种技术避免关键信息丢失。1)我们维护一份权值的单精度copy,2)我们放大损失,来保留较小的梯度。3)我们证明,前面提出的方法,可以在很多任务和现代大规模模型(超过1亿参数)上,基于大数据集训练。
介绍
深度学习让很多不同的应用都取得了很大的进步,图像识别、语言建模、机器翻译和语音识别等等。这也衍生出两个关键的问题,更大的数据集和更复杂的模型。
更大的模型通常需要更多的计算量和内存来训练。
实现
1、FP32:
在混合精度训练中,权值、激活值和梯度是以FP16存储的。
2、损失放大:
3、算术精度:
总的来说,神经网络算术运算分为3类:向量点乘
结果
Baseline(FP32):激活值、权值和梯度都用单精度存储。所有算术运算也都用FP32。
Mix Precision(MP):存储和算术运算都有用FP16。权值、激活值和梯度都用FP16来存储。权值存一份FP32主copy,用于更新。
总结和后续工作
混合精度训练,让我们减少内存消耗,以及花在算术运算上的时间。我们已经证明,很多深度学习模型可以用这种技术来训练,并且没有准确度损失,也不需要调参。对于小梯度很多的模型,可以采用梯度放大的办法来达到和FP32一样的准确度。
如果DNN运算是受限于内存和算术带宽,那么在Volta架构的GPU上,FP16和FP32的加速比是2~6。如果是受限于延迟,加速比则会小一些。网络训练和推理总的加速比,取决于框架和库对混合精度的优化,这也是后续工作的一个重点(本文实验用的库和框架都比较旧)。
我们会把这个技术应用于生成模型,如文字转语音系统和深度强化学习应用。进一步地,损失放大因子的选择会自动化,来简化混合精度的训练。损失放大因子会根据监控到的权值梯度,动态增大或者减小来防止溢出。