普通python能不能调用gpu_python – 如何在GPU上训练时处理非确定性?

在调整超参数以使我的模型更好地执行时,我注意到每次运行代码时我得到的分数(以及因此创建的模型)都不同,尽管为随机操作修复了所有种子.如果我在CPU上运行,则不会发生此问题.

他们将非确定性指向“tf.reduce_sum”函数.但是,对我来说情况并非如此.可能是因为我使用的是不同的硬件(1080 TI)或不同版本的CUDA库或Tensorflow.看起来CUDA库的许多不同部分都是非确定性的,并且似乎不容易弄清楚哪个部分以及如何摆脱它.此外,这必须是设计的,因此非确定性的交换可能会有足够的效率提升.

所以,我的问题是:

由于GPU在培训NN方面很受欢迎,因此该领域的人们必须有办法处理非确定性问题,因为我无法看到你如何能够可靠地调整超参数.使用GPU时处理非确定性的标准方法是什么?

解决方法:

TL; DR

>先验确定性操作的非确定性来自concurent(多线程)实现.

>尽管不断取得进展,但是tensorflow目前还不能保证其所有运营的确定性.在互联网上快速搜索后,似乎情况与其他主要工具包类似.

>在培训期间,除非您正在调试问题,否则可以在运行之间产生波动.不确定性是培训的本质,在比较结果时,测量它并将其考虑在内是明智的 – 即使工具包最终在培训中达到完美的决定论.

那,但更长

当您将神经网络操作视为数学运算时,您会发现一切都是确定性的.卷积,激活,交叉熵 – 这里的一切都是数学方程式,应该是确定性的.即使是伪随机操作,例如改组,辍学,噪音等,也完全由种子决定.

另一方面,当您从计算实现中看到这些操作时,您会将它们视为大规模并行化计算,除非您非常小心,否则它们可能是随机性的来源.

问题的核心在于,当您在多个并行线程上运行操作时,通常不知道哪个线程将首先结束.当线程对自己的数据进行操作时并不重要,因此,例如,将激活函数应用于张量应该是确定性的.但是当这些线程需要同步时,例如计算总和时,结果可能取决于求和的顺序,进而取决于首先结束的线程的顺序.

从那里,你可以广泛地说两个选择:

>保持与更简单的实现相关的非确定性.

>在设计并行算法时要格外小心,以减少或消除计算中的非确定性.增加的约束通常会导致算法速度变慢

哪条路线需要CuDNN?好吧,主要是确定性的.在最近的版本中,确定性操作是常态而非例外.但它曾经提供许多非确定性操作,更重要的是,它曾经不提供某些操作,如减少,人们需要在CUDA中实现自己,并对可靠性有不同程度的考虑.

像theano这样的一些图书馆在这些话题上提前做得更早,因为他们可以提前公开用户可以打开或关闭的deterministic标志 – 但正如你从其描述中看到的那样,它远非提供任何保证.

If more, sometimes we will select some implementation that are more deterministic, but slower. In particular, on the GPU, we will avoid using AtomicAdd. Sometimes we will still use non-deterministic implementaion, e.g. when we do not have a GPU implementation that is deterministic. Also see the dnn.conv.algo* flags to cover more cases.

在张量流中,对确定性的需求的实现已经相当晚了,但它的发展速度正在减缓 – 这也得益于CuDNN在这方面的进展.很长一段时间,减少是不确定的,但现在它们似乎是确定性的. CuDNN在版本6.0中引入确定性约简的事实当然可能有所帮助.

这很重要吗?

如果您正在调试问题,确定性并不重要:它是强制性的.您需要重现导致问题的步骤.这是目前像tensorflow这样的工具包的真正问题.为了缓解这个问题,您唯一的选择是调试实时,在正确的位置添加检查和断点 – 不是很好.

部署是事物的另一个方面,通常希望具有确定性行为,部分用于人类接受.虽然没有人会合理地期望医疗诊断算法永远不会失败,但计算机可能会根据运行情况给同一患者不同的诊断,这是很尴尬的. (虽然医生自己也不能免疫这种变异).

这些原因是修正神经网络中非确定性的正当动机.

对于所有其他方面,我会说,如果不接受,我们需要接受神经网络训练的非确定性.出于所有目的,培训是随机的.我们使用随机梯度下降,随机数据,使用随机初始化和丢失 – 更重要的是,训练数据本身是一个随机的数据样本.从这个角度来看,计算机只能用种子生成伪随机数这一事实就是一件神器.当你训练时,你的损失是一个值,由于这种随机性,也带有置信区间.比较这些值以优化超参数而忽略那些置信区间并没有多大意义 – 因此,在我看来,花费太多精力修复非确定性以及许多其他情况是徒劳的.

标签:python,tensorflow,machine-learning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值