数值不准确性在训练神经网络中是否起任何作用?

数据挖掘 神经网络 数值
2021-10-07 20:06:05

有没有提到神经网络优化中的数值问题的出版物?

(博客文章、文章、研讨会笔记、讲义、书籍 - 什么?)

问题的背景

我最近有一个奇怪的现象:当我在我的机器上使用给定脚本在 GTSRB 数据集上训练一个卷积网络时,它得到了最先进的结果(99.9% 的测试准确率)。10次​​。没有异常值。当我在另一台机器上使用相同的脚本时,我得到的结果要差得多(~ 80% 左右的测试准确率,10 次,没有异常值)。我想我可能没有使用相同的脚本,因为它对我的出版物并不重要,所以我只是删除了该数据集的所有结果。我想我可能在其中一台机器上犯了一个错误(例如,使用不同的预处理数据),我无法找出错误发生在哪里。

现在一位朋友给我写信说他有一个网络、一个训练脚本和一个数据集,该数据集在机器 A 上收敛,但在机器 B 上不收敛。完全相同的设置(一个完全连接的网络,训练为自动编码器)。

我只有一个猜测可能会发生什么:机器有不同的硬件。Tensorflow 可能使用不同的算法进行矩阵乘法/梯度计算。它们的数字属性可能不同。这些差异可能会导致一台机器能够优化网络,而另一台则不能。

当然,这需要进一步调查。但不管这两种情况发生了什么,我认为这个问题很有趣。直观地说,我会说数字问题不应该很重要,因为无论如何都不需要尖锐的最小值,并且一次乘法的差异不如下一步的更新重要。

1个回答

有没有提到神经网络优化中的数值问题的出版物?

当然,关于消失梯度的研究已经很多了,这完全是一个数值问题。也有大量关于低精度操作训练的研究,但结果令人惊讶:降低浮点精度似乎不会影响神经网络训练。这意味着精度损失不太可能是这种现象的原因。

尽管如此,环境仍会影响计算(如评论中所建议):

  • 最明显的是随机数生成器。在您的脚本中使用种子并尝试至少在一台机器上产生可重现的结果。之后,您可以计算激活和梯度的摘要(例如通过tf.summarytensorflow)并比较机器上的张量。显然,无论使用什么硬件,矩阵乘法或分段指数等基本运算都应该给出非常接近的结果,即使结果不相同。您应该能够看到张量是立即发散(这意味着存在另一个随机性来源)还是逐渐发散。

  • python解释器cudacudnn驱动程序和关键库版本(numpy、、tensorflow等)。您可以使用相同的 linux 内核和libc版本,但我认为即使没有它,您也应该期望可重复性。cudnn版本很重要,因为卷积很可能是原生优化的。tensorflow也很重要,因为谷歌一直在重写核心。

  • 环境变量,例如PATHLD_LIBRARY_PATH等,linux 配置参数,例如limits.conf,权限。

额外的预防措施:

  • 明确指定每个变量的类型,不要依赖默认值。

  • 仔细检查训练/测试数据是否相同并且以相同的顺序读取。

  • 您的计算是否使用任何预训练模型?有没有涉及到网络?也检查一下。

最后我会怀疑硬件差异:如果没有显式并发的高级计算会导致不同的结果(浮点精度差异除外),这取决于内核数量或缓存大小。