卷积神经网络的 float16 与 float32
Posted
技术标签:
【中文标题】卷积神经网络的 float16 与 float32【英文标题】:float16 vs float32 for convolutional neural networks 【发布时间】:2018-03-18 17:35:23 【问题描述】:标准是float32,但我想知道什么情况下可以使用float16?
我比较了使用这两种数据类型运行相同的 covnet 并没有发现任何问题。对于大型数据集,我更喜欢 float16,因为我可以少担心内存问题..
【问题讨论】:
使用 float16,您可能会遇到更多关于渐变消失的问题。而在微调时,如果你的梯度太低,应该不同的梯度可能是相等的。 【参考方案1】:令人惊讶的是,使用 16 位完全没问题,甚至不仅是为了好玩,在生产中也是如此。例如,在 52:00 左右,Jeff Dean 在this video 中谈到了 Google 的 16 位 计算。幻灯片中的引述:
神经网络训练非常容忍精度降低
由于 GPU 内存是 ML 计算的主要瓶颈,因此已经有很多关于降低精度的研究。例如。
Gupta at al paper“有限数值精度的深度学习”关于固定(非浮动)16 位训练但随机舍入时间>。
Courbariaux at al“使用低精度乘法训练深度神经网络”关于 10 位 激活和 12 位 参数更新。
这不是限制。 Courbariaux et al,“BinaryNet:训练权重和激活限制为 +1 或 -1 的深度神经网络”。在这里,他们讨论了 1 位 激活和权重(尽管梯度的精度更高),这使得前向传播速度非常快。
当然,我可以想象某些网络可能需要高精度来进行训练,但我建议至少尝试 16 位来训练大型网络,如果证明效果更差,请切换到 32 位。
【讨论】:
由于 CPU 不支持 16 位浮点运算,不应该使用 float16 更慢吗?或者至少它们没有针对 BLAS 进行优化。 我会非常小心像Neural net training very tolerant of reduced precision
..这样的笼统陈述。
是的@BoppityBop,降低精度并不总是一个好主意。例如,GPU Delegate(默认设置为setPrecisionLossAllowed
)在 TensorFlow lite 上进行的 32 位到 16 位的向下转换导致了非常不准确的数字。 (例如,从 0.2 到 500 左右的输出)。【参考方案2】:
float16 训练很棘手:您的模型在使用标准 float16 时可能不会收敛,但 float16 确实可以节省内存,而且如果您使用最新的 Volta GPU,它也会更快。 Nvidia 在最新的doc 和paper 中推荐“混合精度训练”。
为了更好地使用 float16,您需要手动仔细选择 loss_scale。如果 loss_scale 太大,可能会得到 NAN 和 INF;如果 loss_scale 太小,模型可能不会收敛。不幸的是,所有模型都没有通用的 loss_scale,因此您必须为您的特定模型仔细选择它。
如果你只是想减少内存使用,你也可以试试 tf. to_bfloat16,这可能会更好地收敛。
【讨论】:
【参考方案3】:根据这项研究:
Gupta, S.、Agrawal, A.、Gopalakrishnan, K. 和 Narayanan, P.(2015 年, 六月)。数值精度有限的深度学习。在 机器学习国际会议(第 1737-1746 页)。在: https://arxiv.org/pdf/1502.02551.pdf
使用半点浮点精度 (float16) 时需要随机舍入以获得收敛;然而,当使用这种舍入技术时,他们声称获得了非常好的结果。
这是该论文的相关引述:
“最近的一项工作(Chen et al., 2014)提出了一种硬件加速器 用于深度神经网络训练,采用 定点计算单元,但发现有必要 使用 32 位定点表示实现收敛 在训练卷积神经网络时 MNIST 数据集。相反,我们的结果表明, 可以仅使用 16 位来训练这些网络 定点数,只要使用随机舍入 在定点计算期间。”
作为参考,以下是 Chen at al., 2014 的引文:
Chen, Y., Luo, T., Liu, S., Zhang, S., He, L., Wang, J., ... & Temam, O.(2014 年 12 月)。 Dadiannao:机器学习超级计算机。在 第 47 届 IEEE/ACM 国际研讨会论文集 微架构(第 609-622 页)。 IEEE 计算机学会。在: http://ieeexplore.ieee.org/document/7011421/?part=1
【讨论】:
以上是关于卷积神经网络的 float16 与 float32的主要内容,如果未能解决你的问题,请参考以下文章