深度神经网络用于图像识别的精度,使用float还是double?

7
神经网络用于图像识别时可能非常庞大。可能有成千上万的输入/隐藏神经元,数百万条连接,这会占用大量计算机资源。
虽然在C++中float通常为32位,double为64位,但它们在速度上没有太大的性能差异,但使用浮点数可以节省一些内存。
如果我们选择在神经网络中使用sigmoid作为激活函数,那么我们该如何选择变量是浮点数还是双精度浮点数,以便节省内存而不使神经网络无法正常工作?
虽然训练/测试数据的输入和输出肯定可以是浮点数,因为它们不需要双精度精度,因为图像中的颜色只能在0-255范围内,并且在归一化为0.0-1.0比例时,单位值将为1/255 = 0.0039〜
1. 对于隐藏神经元的输出精度,是否也可以将其设置为浮点数?
隐藏神经元的输出值是由前一层神经元的输出值乘以其与当前正在计算的神经元的连接权重之和得到的,然后将总和传递到激活函数(目前为sigmoid)中以获得新的输出值。总和变量本身可以是双精度浮点数,因为当网络很大时,它可能会变成一个非常大的数字。

enter image description here

2. 连接权重呢,它们可以是浮点数吗?

由于 Sigmoid 函数的存在,输入和神经元输出的范围在 0-1.0 之间,但是连接权重可以大于此范围。


随机梯度下降反向传播因为激活函数的导数而受到梯度消失问题的影响。我决定不把这个问题放在梯度变量应该有多大精度的讨论中,因为我感觉浮点数在网络深度增加时可能不够精确。

2个回答

5
  1. 隐藏神经元的输出精度如何?将它们设为浮点数是否安全?

在大多数神经网络应用中,使用 float32 通常是安全的首选。目前GPU仅支持 float32,因此许多从业者坚持使用 float32。对于许多应用程序,即使 16位浮点值 也足够了。一些极端的例子表明,即使每个权重只有2位,也可以训练出高精度的网络(https://arxiv.org/abs/1610.00324)。

深度网络的复杂性通常不是由计算时间限制的,而是由单个GPU上的RAM数量和内存总线吞吐量所限制的。即使你在CPU上工作,使用更小的数据类型仍有助于更有效地使用缓存。你很少会受到机器数据类型精度的限制。

由于图像中的颜色只能在0-255范围内,

你做错了。除非你使用自定义的权重初始化程序,否则你会强制网络学习您输入数据的比例,但其已经是已知的。通常情况下,当输入数据被标准化为(-1,1)或(0,1)范围内,并且权重初始化为具有相同比例的图层的平均输出时,可以获得更好的结果。这是一种流行的初始化技术:http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization 如果输入值在[0,255]范围内,那么由于平均输入约为100,而权重约为1,激活潜力(激活函数的参数)将约为100×N,其中N是层输入数量,可能远离Sigmoid函数的"平坦"部分。因此,您要么将初始权重设置为~1/(100×N),要么缩放您的数据并使用任何流行的初始化方法。否则,网络将必须花费大量训练时间才能将权重调整到此比例。
随机梯度下降反向传播存在梯度消失问题,因为激活函数的导数。我决定不将这个问题放在梯度变量应该有多高的精度上,感觉浮点数精度不够,特别是当网络很深时。
这更多地涉及每个层输出的规模,而不是机器算术精度。在实践中:
- 预处理输入数据(归一化到(-1, 1)范围内) - 如果您有超过2层,则不要使用Sigmoid函数,而应改用修正线性单元 - 仔细初始化权重 - 使用批标准化
如果您对这些概念不熟悉,此视频应该会有所帮助。

谢谢!这真的提高了我使用浮点数的信心。我确实阅读了关于16位数据精度的文章,但是在进一步搜索谷歌时,大多数人的回答有点让我困惑。其中一个是: http://scicomp.stackexchange.com/questions/21402/are-there-tasks-in-machine-learning-which-require-double-precision-floating-poin关于输入规范化,更新了主要帖子,谢谢!关于GPUPU,新的GPU支持双精度,NVIDIA的CUDA就是其中之一: https://developer.nvidia.com/cuda-faq 这是我唯一使用过的。 - Aiden Anomaly
1
此外,如果你正在使用CPU,那么SSE/AVX/NEON向量处理器通常可以处理两倍数量的 float32 值。 - MSalters

3

最少位数的单神经元所需的位数中得到:

以下论文已研究此问题(按时间降序排列):

限定数字精度的深度学习的例子:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接