标准是float32,但我想知道在什么条件下可以使用float16?
我比较了使用两种数据类型运行相同的covnet并且没有注意到任何问题。对于大型数据集,我更喜欢float16,因为我可以更少担心内存问题。
答案 0 :(得分:6)
令人惊讶的是,使用16位是完全可以的,甚至不仅仅是为了好玩,而且在生产中也是如此。例如,this video杰夫迪恩在52:00左右谈到Google的 16位计算。幻灯片引用:
神经网络训练非常容忍精度降低
由于GPU内存是ML计算的主要瓶颈,因此对精度降低进行了大量研究。例如。
Gupta at al paper"深度学习,数学精度有限"关于修复(非浮动) 16位培训,但使用随机舍入。
Courbariaux at al"训练具有低精度乘法的深度神经网络"关于 10位激活和 12位参数更新。
这不是限制。 Courbariaux et al," BinaryNet:训练具有权重和激活的深度神经网络,约束为+1或-1"。在这里,他们讨论了 1位激活和权重(虽然梯度的精度更高),这使得前向传递超快。
当然,我可以想象一些网络可能需要高精度的训练,但我建议至少尝试16位训练大型网络并切换到32位,如果它被证明工作更糟。
答案 1 :(得分:3)
float16训练很棘手:使用标准float16时你的模型可能不会收敛,但是float16确实可以节省内存,如果你使用的是最新的Volta GPU,它也会更快。 Nvidia推荐"混合精确训练"在最新的doc和paper。
为了更好地使用float16,您需要手动并仔细选择 loss_scale 。如果loss_scale太大,你可能会得到NANs和INFs;如果loss_scale太小,模型可能不会收敛。不幸的是,所有型号都没有常见的loss_scale,因此您必须仔细选择适合您特定型号的型号。
如果您只是想减少内存使用量,您也可以尝试使用tf。 to_bfloat16,可能更好地收敛。
答案 2 :(得分:1)
根据这项研究:
当使用半点浮点精度(float16)时,需要随机舍入来获得收敛;然而,当使用这种舍入技术时,他们声称会得到非常好的结果。Gupta,S.,Agrawal,A.,Gopalakrishnan,K。,& Narayanan,P。(2015, 六月)。深度学习,数值精度有限。在 国际机器学习会议(第1737-1746页)。在: https://arxiv.org/pdf/1502.02551.pdf
以下是该文章的相关引文:
"最近的一项工作(Chen et al。,2014)提出了一个硬件加速器 用于深度神经网络训练 定点计算单元,但发现有必要 使用32位定点表示来实现收敛 同时训练卷积神经网络 MNIST数据集。相反,我们的结果表明 只使用16位训练这些网络是可能的 定点数,只要使用随机舍入 在定点计算期间。"
供参考,这是陈在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