干货 | 减少显存还不降低精度的训练方法,了解一下!

概述  

混合精度训练主要利用了cuda中原生支持的FP16数据类型,也就是所谓的半精度。nVidia的GPU其实在很早的架构中就提供了这个精度的数值表示,只是没有提供专门的硬件计算单元。FP16所占用的空间是单精度的一半,双精度的四分之一。

在此之前,其实也有很多做模型量化研究的文章,但是或多或少都会影响模型最终的训练精度,所以并不使用。百度和NVIDIA的合作解决了这个问题,即降低了模型训练的显存占用,也保证了模型最终的精度。由于使用到更大的batch size模型最终学习的到参数泛化能力更强,个别网络甚至于获得更高的精度。

混合精度的概念就是针对使用FP16进行模型的训练过程,同时保证和FP32同样的精度所提出的,也可以认为是使用到trick。后面会介绍,nVidia为了加速训练过程,在最新的架构中还增加了特殊的FP16矩阵运算单元。

实现

FP32 MASTER COPY OF WEIGHTS

在混合精度训练中,权重、激活和梯度被存储为FP16。为了匹配FP32网络的准确性,在优化器步骤中维护一个FP32主副本的权值,并使用权值梯度进行更新。在每个迭代中,FP16存储的权重用于前向和后向传递,使FP32训练所需的存储和带宽减半。图1说明了这种混合的精确训练过程。

图1:混合精度训练迭代

虽然FP32主权重的需求并不是通用的,但是有两个可能的原因可以解释为什么许多网络需要它。

一种解释是,更新(权重梯度乘以学习速率)成为太小FP16代表——任何值的大小是小于 FP16变成零。 我们可以看到图2 中,大约有5%的体重有指数小于-24梯度值。 当这些小值梯度与学习速率相乘时,在优化器中将变为零,从而对模型精度产生不利影响。 使用单精度副本进行更新可以克服这个问题并恢复准确性。

另一种解释是权重与权重更新的比例非常大。在这种情况下,即使权重更新在FP16中是可表示的,但是当加法操作右移它使二进制点与权重对齐时,它仍然可能变为零。当规范化权重的大小至少是权重更新的大小的2048倍时,就会发生这种情况。由于FP16有10位尾数,隐式位必须右移11位或更多才能潜在地创建0(在某些情况下舍入可以恢复值)。在比率大于2048的情况下,隐式位将右移12个或更多的位置。这将导致权重更新变为无法恢复的零。更大的比率将导致非规范化数字的这种效果。同样,可以通过在FP32中计算更新来抵消这种影响。

LOSS SCALING

这个操作原理是借助求导的连式法则,通过放大loss,进而放大整个反向传播过程的参数梯度,最后在更新时候再缩放回来。这个参数可以固定,也可以根据网络的学习的状态自适应的进行调整。FP16可表示范围中有很多未被使用,而许多值低于最小可表示范围并变成了零。扩大梯度将使它们占据更多的可表示范围,并保留否则将丢失到零的值。当梯度不被缩放时,这个特殊的网络发散,但是缩放8倍(指数增加3)就足以匹配FP32训练的精度。

将梯度值转换为FP16可表示范围的一个有效方法是在开始反向传播之前,对前向传递中计算的损失值进行缩放。通过链式法则,反向传播确保所有的梯度值都按相同的比例缩放。这在反向传播过程中不需要额外的操作,并且可以避免相关的梯度值变为零。

在进行权重更新之前,必须对权重梯度进行调整,以保持FP32训练中的更新幅度。最简单的方法是在后向遍历之后展开,但是在梯度裁剪或任何其他与梯度相关的计算之前展开,从而确保不必调整超参数(如梯度裁剪阈值、权值衰减等)。

图2:普通话语音识别模型的训练与验证(dev0)曲线

图3:梯度直方图的普通话训练运行

图4:Multibox SSD网络训练过程中激活梯度值的直方图

需要注意的是,x轴上的箱子覆盖不同的范围,有一个单独的箱子代表0。例如,2%的值在[:)范围内,2%的值[:范围,和67%的值是零。

ARITHMETIC PRECISION

总的来说,神经网络算法可分为三类:向量点积、约简和逐点运算。

当涉及到降低精度的算法时,这些类别受益于不同的处理。为了保持模型的准确性,我们发现一些网络需要这样做FP16向量点积将部分积累积成FP32值,在写入内存之前将其转换为FP16。如果FP32中没有这种积累,一些FP16模型就无法与基线模型的精度匹配。以前的GPU只支持FP16的乘法运算,而NVIDIA Volta GPU引入了张量核,它将FP16的输入矩阵相乘,并将乘积累积到FP16或FP32的输出中(NVIDIA, 2017)。

在FP32中应该进行大量的缩减(矢量元素的总和)。当统计数据和softmax层累积时,这种减少主要出现在批处理规范化层中。在我们的实现中,这两种层类型仍然从内存中读写FP16张量,在FP32中执行运算。这并没有减慢训练过程,因为这些层是内存带宽有限的,并且对运算速度不敏感。点向操作,如非线性和元素向矩阵乘积,是内存带宽有限的。由于算术精度也不影响这些操作的速度可以使用FP16或FP32 math。

结果

文章对各种深度学习任务进行了实验,涵盖了广泛的深度学习模型。对每个应用进行了以下实验:

⦁ Baseline(FP32):单精度存储用于激活、权重和梯度。所有的算法也在FP32中。

⦁ Mixed Precision (MP): FP16用于存储和运算。权值、激活和梯度存储在FP16中,FP32的主副本用于更新。一些应用程序使用损失扩展。使用张量进行FP16算法实验核心操作,累积到FP32的卷积,全连接层,矩阵乘法在递归层。

⦁ 用于ILSVRC分类的CNNS

成功地对这些网络进行混合精度训练不需要损失标度技术。前向和后向通道中的所有张量都在FP16中,而权重的主副本在FP32中更新。

⦁ 检测CNNS

从表2中可以看出,SSD检测器在FP16中没有经过训练而没有进行损耗缩放。通过将小的梯度值丢失为零,可以学习到较差的权重,从而使训练发散。8的损失比例因子可恢复相关梯度值,混合精度训练匹配FP32映射。

⦁ 语音识别

表3:混合精度训练用于语音识别的字符错误率(CER)。英语成绩在《华尔街日报》92年的测试集中报告。普通话成绩在我们的内部测试集中报告。

图5:英法翻译网络训练困窘,3x1024 LSTM模型与注意。Ref1、Ref2和Ref3代表三种不同的FP32训练运行。

结论 

混合精度训练是一项重要的技术,它可以减少深度神经网络的内存消耗以及在内存和算术运算上花费的时间。我们已经证明,许多不同的深度学习模型可以使用这种技术进行训练,而不损失准确性,不需要任何超参数调整。对于某些具有大量小梯度值的模型,我们引入梯度缩放方法来帮助它们收敛到与FP32基线模型相同的精度。

原文链接:https://arxiv.org/pdf/1710.03740.pdf

想要了解更多资讯,请扫描下方二维码,关注机器学习研究会

转自: AutoML前沿

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章