zoukankan      html  css  js  c++  java
  • 深度神经网络混合精度训练

    深度神经网络混合精度训练

    Mixed-Precision Training of Deep Neural Networks

    论文链接:https://arxiv.org/abs/1710.03740

    深度神经网络(Deep Neural Networks,深度神经网络s)在图像处理与理解、语言建模、语言翻译、语音处理、游戏等领域取得了突破性进展。深度神经网络的复杂度不断增加,从而增加了训练这些网络所需的计算资源。混合精度训练通过使用较低精度的算法降低了所需的资源,具有以下优点。             

    减少所需的内存量。半精度浮点格式(FP16)使用16位,而单精度格式(FP32)使用32位。降低所需内存可以训练更大的型号或训练更大的小批量。             

    缩短训练或推理时间。执行时间可能对内存或算术带宽敏感。半精度将访问的字节数减半,从而减少了在内存有限的层中花费的时间。与单精度相比,NVIDIA gpu提供高达8倍的半精度算术吞吐量,从而加快了数学受限层的速度。

    1. bigLSTM英语语言模型的训练曲线显示了本文描述的混合精确训练技术的优点。Y轴是训练损失。无损失标度的混合精度(灰色)在一段时间后会发散,而有损失标度的混合精度(绿色)与单精度模型(黑色)匹配。

    由于深度神经网络训练传统上依赖于IEEE单精度格式,本文的重点是在保持单精度网络精度的同时进行半精度训练(如图1所示)。这种技术称为混合精度训练,因为它同时使用单精度和半精度表示。             

    混合精度成功训练的技巧             

    半精度浮点格式由1位符号、5位指数和10位小数组成。支持的指数值属于[-24,15]范围,这意味着格式支持[2-24,65504]范围内的非零值量级。由于这比单精度格式支持的[2-149,~3.4×1038]范围窄,训练一些网络需要额外考虑。本节描述了成功训练半精度深度神经网络s的三种技术:将FP16产品累积到FP32中;损耗标度;以及FP32砝码的主副本。通过这些技术,NVIDIA和Baidu Research能够匹配所有经过训练的网络的单精度结果精度(混合精度训练)。请注意,并非所有的网络都需要使用所有这些技术进行培训。             

    有关如何在各种框架(包括可用代码示例)中应用这些技术的详细说明,请参阅《混合精度培训用户指南》。             

    累积到FP32             

    NVIDIA Volta GPU体系结构引入了张量核指令,它将半精度矩阵相乘,将结果累加成单精度或半精度输出。积累到单一的精度是取得良好训练效果的关键。在写入内存之前,将累积值转换为半精度。cu深度神经网络和CUBLAS库提供了各种依赖于张量核进行运算的函数。

    Loss损耗标度             

    训练深度神经网络s时遇到四种类型的张量:激活、激活梯度、权重和权重梯度。根据经验,权重和权重梯度都在半精确表示的值量级范围内。然而,对于某些网络,小幅度激活梯度低于半精度范围。例如,考虑在图2中训练多盒SSD检测网络时遇到的激活梯度直方图,它显示log2刻度上的值百分比。小于2-24的值以半精度格式变为零。             

    注意,大多数半精度范围不用于激活梯度,激活梯度往往是小于1的小值。因此,可以通过将激活梯度乘以比例因子S,将其“移位”到FP16可表示的范围内。在SSD网络的情况下,将梯度乘以8就足够了。这表明2-27量级以下的激活梯度值与该网络的训练无关,而保持在[2-27,2-24]范围内的值是重要的。

    2. 以单精度训练多盒SSD探测器网络时记录的激活梯度直方图。Y轴是对数刻度上所有值的百分比。X轴是绝对值的对数刻度,也是零的特殊项。例如,在本次培训中,66.8%的数值为零,而4%的数值介于2-32和2-30之间。

    一个非常有效的方法,以确保梯度下降到范围内可代表的一半精度是乘上规模因数的训练损失。这只增加了一个乘法运算,通过链式规则,它可以确保所有的梯度都被放大(或上移),而不需要额外的成本。损失缩放确保恢复丢失到零的相关梯度值。在权重更新之前,权重梯度需要按相同的因子S缩小。缩小操作可以与权重更新本身融合(导致没有额外的内存访问)或单独执行。有关详细信息,请参阅《混合精度培训用户指南》和《混合精度培训纸》。

     FP32重量主副本             

    深度神经网络训练的每次迭代都通过增加相应的权值梯度来更新网络权值。权重梯度的大小通常明显小于相应的权重,特别是在与学习率相乘(或自适应计算的优化器因子,如Adam或Adagrad)之后。如果其中一个加数太小而无法在半精度表示中产生差异(例如,由于指数差异过大,较小的加数在移动以对齐二进制点后变为零),则此幅度差异可能不会导致发生更新。             

    对于以这种方式丢失更新的网络,一个简单的补救方法是以单精度维护和更新权重的主副本。在每次迭代中,对主权重进行半精度复制,并在正向和反向传播中使用,从而获得性能优势。在权重更新期间,计算出的权重梯度将转换为单精度,并用于更新主副本,该过程将在下一次迭代中重复。因此,只在需要的地方混合使用半精度存储和单精度存储。

    生成性对抗网络(GANs)在训练过程中结合了回归和辨别任务。对于图像任务,生成器网络回归像素颜色。在我们的例子中,生成器预测三个通道的8位颜色值。该网络经过训练,使用DCGAN方法(Rad Fordtal.,2015)和Celeb Faces数据集(Liuatal.,2015b)生成128x128像素的人脸图像。

    生成器有7层分步卷积,6层有漏性ReLU激活,1层有tanh激活。鉴别器有6个卷积,2个全连接层。除最后一层使用sigmoid外,其余均使用漏性ReLU激活。除了鉴别器的最后一个完全连接层之外,所有层都应用了批处理规范化。Adam优化器用于训练10万次迭代。图6中的一组输出图像。注意,我们显示一组随机选择的输出图像,而GAN论文通常通过排除不好的示例来显示一组精心策划的输出。与本文所涉及的其他网络不同,GANs没有广泛接受的结果质量量化。从质量上看,FP32和混合精度训练的输出具有可比性。此网络不需要进行损耗缩放以匹配FP32结果。

     混合精度训练迭代             

    上面介绍的三种技术可以组合到每个训练迭代的以下步骤序列中。对传统迭代过程的补充是粗体的。             

    制作权重的FP16副本             

    使用FP16权重和激活进行前向传播             

    将产生的损耗乘以标度因数S             

    使用FP16权重、激活及其梯度反向传播             

    将权重梯度乘以1/S             

    可选地处理权重梯度(渐变剪裁、权重衰减等)             

    更新FP32中权重的主副本             

    如何将混合精度训练步骤添加到各种深度神经网络训练框架的脚本中的示例可以在《混合精度训练用户指南》中找到。

    结果             

    将上述三种混合精确训练技术应用于各种卷积深度神经网络、递归深度神经网络和生成深度神经网络。应用任务包括图像分类、目标检测、图像生成、语言建模、语音处理和语言翻译。有关完整的实验细节,请参阅混合精度训练纸。表1显示了不同深度神经网络模型的图像分类结果。表1中的所有网络都不需要缩放损耗来匹配单精度结果精度。表2显示了目标检测网络的平均精度。多盒SSD训练需要损耗标度,标度因子8足以匹配单精度训练。如果没有这个比例因子,太多的激活梯度值将丢失为零,网络无法训练。递归网络往往需要损失标度,在许多情况下,需要一个精确的权重主副本。例如,bigLSTM英语语言建模网络需要128的比例因子,如果没有这个比例因子,训练最终会发散,如图1所示。有关更多网络和培训详细信息,请参阅混合精度培训文件。

     表2. 基于帕斯卡VOC 2007测试数据的目标检测平均精度(mAP)。更快的R-CNN接受了VOC 2007数据的训练,而SSD接受了voc2007和2012数据的联合训练(更大的数据集说明实现的mAP更高)。

    结论             

    本文简要介绍了三种混合精度训练技术,可用于深度神经网络的半精度训练。这些技术的实验结果表明,虽然半精度范围比单精度范围窄,但当结果与纯单精度训练的结果相匹配时,对于各种应用任务的最新深度神经网络训练是足够的。有关各种网络的混合精度训练和结果的更详细描述,请参阅混合精度训练文件。有关可以在各种深度神经网络培训框架的培训脚本中使用的代码示例,请参阅《混合精度培训用户指南》。

  • 相关阅读:
    Nginx 启用gzip压缩
    HTTP压缩的过程
    什么是HTTP压缩及HTTP压缩的过程
    Fiddler抓包工具总结
    HTTP内容编码和HTTP压缩的区别
    LINQ query on a DataTable
    C# Collection for "most recently used"
    Keep timer (setInterval) running while reloading page
    Is there a way to detect if a browser window is not currently active?
    Force Logout users if users are inactive for a certain period of time
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13053875.html
Copyright © 2011-2022 走看看