雷锋网消息,在10月10日-11日在加拿大蒙特利尔召开的Rework Deep Learning Summit会议上,百度高级研究员Greg Diamos介绍了由百度硅谷AI实验室(SVAIL)与NVIDIA合作的最新成果:一种名为“混合精度训练”(Mixed Precision Training,简称MPT)的深度学习模型。
Greg Diamos在Rework Deep Learning Summit上演讲中。
据了解,大多数的深度学习模型使用的是32位单精度浮点数(FP32)来进行训练,而混合精度训练的方法则通过16位浮点数(FP16)进行深度学习模型训练,从而减少了训练深度学习模型所需的内存,同时由于FP16的运算比FP32运算更快,从而也进一步提高了硬件效率。
通过用半精度运算替代全精度运算来提高效率,这一技术原理听起来很简单明了,但将其付诸实施并不像听起来那么简单。此前也有团队尝试过使用更低精度进行混合计算(如二进制,甚至4-bit),但问题在于这往往不可避免地造成结果的准确性和在主要网络变换上的损失,而百度的MPT模型不仅解决了这一问题,更重要的是MPT无需改变网络超参数(雷锋网注:超参数指Bayes统计理论先验分布的参数, 它不像其他的参数可以用统计量估计),并保持与单精度相同的准确性。
在百度研究院博客中,百度进一步解释了这一模型的原理:
深度学习模型由各种层(Layer)组成,包括完全连接的层,卷积层和反复层。层与层之间的转换可以通过通用矩阵乘法(GEMM)来实现,而对深度学习训练的过程其实很大程度是GEMM计算的过程。
如下图所示,GEMM操作可以分解为若干个几个乘法运算和后续的加法运算。
当使用FP16代表神经网络中的数据时,GEMM操作的输入矩阵由16位数组成。我们需要可以使用16位计算执行乘法的硬件,但是需要使用32位计算和存储来执行加法。使用少于32位的加法操作训练大型深度学习模型会非常困难。
为此,百度不仅与NVIDIA共同解决了硬件支持的问题,双方还对训练流程进行了一些修改,模型中的输入,权重,梯度和激活以FP16格式表示。但是如之前介绍,与FP32数字相比,半精度数字的范围有限,只是通过简单地更改存储格式,某些模型无法达到与单精度相同的精度。为此,NVIDIA和百度采用了两种关键技术:
第一项关键技术被称为“混合精密钥匙”(mixed precision key)。如下图所示,在MT模型中仍然保留FP32格式的主副本,将FP16用于正向和反向传播,优化器中的梯度更新将被添加到主FP32副本当中,该FP32副本被简化为一个FP16副本在训练期间使用,这个过程在每次训练迭代中重复,直至模型收敛且足以恢复损失的精度,从而达到较低内存使用、内存带宽压力更低和更快速执行的优点。
深度学习模型的混合精度训练示意图
第二种关键技术则是“损耗缩放”(loss-scaling)。该技术可以够恢复一些小数值的梯度。在训练期间,一些权重梯度具有非常小的指数,其FP16格式可能会变为零。为了克服这个问题,我们使用缩放因子在反向传播开始时缩放损失,通过连锁规则,梯度也逐渐扩大,并在FP16中可表示。在将其更新应用于权重之前,梯度确实需要缩小;而为了恢复某些型号的精度损失,必须进行损耗调整。关于这两种技术的更多细节可以在我们的论文中找到。
百度已使用这种方法使用FP16训练其DeepSpeech 2模型。结果表明,对于英文和普通话模型和数据集和使用相同的超参数、模型架构进行混合精度训练实验,可以得到到FP32训练的精度。
同时,使用FP16训练减少了深度学习模型的内存需求,使得百度能够使用一半的处理器来训练这些模型,从而有效地加倍了集群大小。此外,FP16算术的峰值性能(如上所述)通常高于单精度计算。
雷锋网发现,NVIDIA博客也公布了应用混合精度训练的ImageNet数据集上训练卷积神经网络的结果。如果读者希望了解有关混合精度培训和全套结果和实验的更多详细信息,可点此参阅ArXiv上的论文。