Numpy 卷积神经网络的float16与float32

Numpy 卷积神经网络的float16与float32,numpy,tensorflow,neural-network,keras,conv-neural-network,Numpy,Tensorflow,Neural Network,Keras,Conv Neural Network,标准是float32,但我想知道在什么条件下可以使用float16 我比较了使用这两种数据类型运行同一个covnet,没有发现任何问题。对于大数据集,我更喜欢float16,因为我可以更少地担心内存问题。令人惊讶的是,使用16位完全可以,即使不仅仅是为了好玩,也是为了生产。例如,Jeff Dean在52:00左右在谷歌谈论了16位计算。幻灯片中的引语: 神经网络训练对降低精度有很强的耐受性 由于GPU内存是最大似然计算的主要瓶颈,人们对降低计算精度进行了大量的研究。例如 “有限数值精度的深度学

标准是float32,但我想知道在什么条件下可以使用float16


我比较了使用这两种数据类型运行同一个covnet,没有发现任何问题。对于大数据集,我更喜欢float16,因为我可以更少地担心内存问题。

令人惊讶的是,使用16位完全可以,即使不仅仅是为了好玩,也是为了生产。例如,Jeff Dean在52:00左右在谷歌谈论了16位计算。幻灯片中的引语:

神经网络训练对降低精度有很强的耐受性

由于GPU内存是最大似然计算的主要瓶颈,人们对降低计算精度进行了大量的研究。例如

  • “有限数值精度的深度学习”关于固定(非浮动)16位训练,但随机舍入

  • “使用低精度乘法训练深度神经网络”关于10位激活和12位参数更新

  • 这不是极限,“二进制网络:训练深度神经网络,权重和激活限制在+1或-1”。在这里,他们讨论了1位激活和权重(尽管梯度的精度更高),这使得向前传球超快速


当然,我可以想象一些网络可能需要高精度的训练,但我建议至少尝试16位来训练一个大网络,如果效果更差,则切换到32位。

float16训练很棘手:使用标准float16时,您的模型可能无法收敛,但float16确实节省了内存,如果您使用最新的Volta GPU,速度也会更快。Nvidia建议在最新和最新版本中进行“混合精度训练”

为了更好地使用float16,您需要手动仔细地选择损失量表。如果损失规模太大,您可能会收到NAN和INF;如果损失规模太小,模型可能无法收敛。不幸的是,所有型号都没有通用的损耗刻度,因此您必须为您的特定型号仔细选择


如果你只是想减少内存使用,你也可以试试tf。到_bfloat16,哪个可能会收敛得更好

根据这项研究:

古普塔,S.,阿格拉瓦尔,A.,戈帕拉克里希南,K.,和纳拉亚南,p.(2015, 六月)。深度学习,数值精度有限。在里面 国际机器学习会议(第1737-1746页)。地址:

当使用半点浮点精度(float16)时,需要随机舍入以获得收敛;然而,当使用这种舍入技术时,他们声称得到了非常好的结果

以下是该报的相关引文:

“最近的一项工作(Chen等人,2014年)提出了一种硬件加速器 用于使用 定点计算单位,但发现有必要 使用32位定点表示来实现收敛 在训练卷积神经网络的同时 MNIST数据集。相比之下,我们的结果显示 仅使用16位就可以训练这些网络 定点数字,只要使用随机舍入 在定点计算过程中。”

作为参考,以下是陈在2014年的引文:

陈,Y.,罗,T.,刘,S.,张,S.,何,L.,王,J特姆, O.(2014年12月)。大迪亚诺:一台机器学习超级计算机。在里面 第47届IEEE/ACM国际年会论文集 微体系结构(第609-622页)。IEEE计算机协会。地址:


使用float16,您可能会遇到更多关于渐变消失的问题。在微调时,如果梯度太低,那么应该不同的梯度可能会相等。由于CPU不支持16位浮点运算,使用float16不应该更慢吗?或者至少它们没有针对BLAS进行优化。我会非常小心地使用像
神经网络训练这样的笼统语句,对降低精度非常宽容。
。是的@BoppityBop,降低精度并不总是一个好主意。例如,在TensorFlow lite上,GPU委托(使用默认设置,
setPrecisionLossAllowed
)执行的32位到16位向下转换导致了非常不准确的数字。(例如,从输出大约0.2到500)。