【问题标题】:deep neural network's precision for image recognition, float or double?深度神经网络的图像识别精度,浮点数还是双精度?
【发布时间】:2017-03-25 01:34:33
【问题描述】:

用于图像识别的神经网络可能非常大。 可能有数千个输入/隐藏神经元,数百万个连接是什么 会占用大量计算机资源。

虽然在 c++ 中 float 通常是 32 位,double 是 64 位,但它们在速度上没有太大的性能差异,但使用浮点数可以节省一些内存。

拥有一个使用sigmoid作为激活函数的神经网络, 如果我们可以选择神经网络中的哪些变量可以是浮点数或双精度数 哪个可以浮动以节省内存而不会使神经网络无法执行?

虽然训练/测试数据的输入和输出绝对可以是浮点数 因为它们不需要双精度,因为图像中的颜色可以 仅在 0-255 范围内,当归一化 0.0-1.0 比例时,单位值为 1 / 255 = 0.0039~

1.隐藏神经元的输出精度如何? 让它们也漂浮起来安全吗?

隐藏神经元的输出从前一层神经元输出的总和 * 它与当前正在计算的神经元的连接权重得到它的值,然后将总和传递给激活函数(当前为 sigmoid)以获得新的输出。 Sum 变量本身可能是双倍的,因为当网络很大时它可能会变成一个非常大的数字。

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

由于 sigmoid,输入和神经元的输出在 0-1.0 范围内, 权重可以大于这个值。


Stochastic gradient descent backpropagation 受到vanishing gradient problem 的影响,因为激活函数的导数,我决定不把它作为梯度变量应该是什么精度的问题提出来,感觉浮点数根本不够精确,特别是当网络很深时。

【问题讨论】:

    标签: c++ machine-learning neural-network precision


    【解决方案1】:
    1. 隐藏神经元输出精度如何,让它们也浮动是否安全?

    在任何地方使用float32 通常是大多数神经网络应用程序的安全首选。 GPU目前只支持float32,所以很多从业者到处都坚持float32。对于许多应用程序,即使16-bit floating point values 也足够了。一些极端的例子表明,每个权重只需 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,而是使用整流线性单元
    • 仔细初始化权重
    • 使用批量标准化

    如果您不熟悉这些概念,This video 应该有助于学习这些概念。

    【讨论】:

    • 谢谢!它确实增强了我使用花车的信心。我确实阅读了有关 16 位数据精度的文章,但在 google 中走得更远,大多数人的回答确实让我有点困惑。文章:arxiv.org/pdf/1502.02551.pdf 一个是:scicomp.stackexchange.com/questions/21402/… 关于输入规范化,更新主帖,谢谢!关于 GPUPU,较新的 GPU 的支持是 NVIDIA 的 CUDA 的两倍:developer.nvidia.com/cuda-faq这是我唯一使用过的一个
    • 另外,如果您使用 CPU,SSE/AVX/NEON 矢量处理器通常可以处理两倍的float32 值。
    【解决方案2】:

    来自least amount of bits needed for single neuron

    以下论文研究了这个问题(按时间降序):

    来自有限数值精度的深度学习示例

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2017-07-23
      • 2014-04-13
      • 1970-01-01
      • 2023-03-18
      • 2018-02-23
      • 2017-01-24
      • 2016-10-22
      • 1970-01-01
      相关资源
      最近更新 更多