【问题标题】:Same optimization code different results on different computers相同的优化代码在不同的计算机上产生不同的结果
【发布时间】:2018-02-13 02:07:05
【问题描述】:

我正在运行嵌套优化代码。

sp.optimize.minimize(fun=A, x0=D, method="SLSQP", bounds=(E), constraints=({'type':'eq','fun':constrains}), options={'disp': True, 'maxiter':100, 'ftol':1e-05})

sp.optimize.minimize(fun=B, x0=C, method="Nelder-Mead", options={'disp': True})

第一个最小化是函数 B 的一部分,所以它是在第二个最小化内部运行的。

而且整个优化都是基于数据的,不涉及随机数。

我在两台不同的计算机上运行完全相同的代码,得到完全不同的结果。

我安装了不同版本的anaconda,但是

scipy、numpy 和所有使用的包都有相同的版本。

我认为操作系统并不重要,但一个是 windows 10(64 位),另一个是 windows 8.1(64 位)

我正在尝试找出可能导致此问题的原因。

即使我没有说明所有选项,但如果两台计算机运行相同的代码,结果不应该相同吗?

或者对于 sp.optimize 是否有任何选项可以将默认值设置为因计算机而异?

附言。我在看选项“eps”。这些计算机上的“eps”默认值是否可能不同?

【问题讨论】:

  • Python版本有区别吗?
  • 哦。你说的对。我错过了这个.. 一个是 Python 3.6.0,另一个是 Python 3.6.1 它会导致差异吗?我的意思是.. 这有点令人沮丧,因为在一台计算机上它会在 3000 次迭代中收敛,但在另一台计算机上,它直到 7000 次迭代才会收敛..
  • 两个 Python 实例都是 64 位的吗?这也可能是一个因素。检查 numpy 数组是否在两个实例上使用相同的 dtype

标签: python optimization scipy minimization


【解决方案1】:

您永远不应该期望数值方法在不同的设备上执行相同的操作;甚至在同一设备上不同运行相同的代码。由于机器的有限精度,您永远无法计算“真实”结果,而只能计算数值近似值。在长时间的优化任务中,这些差异可以总结出来。

此外,一些优化方法在内部使用某种随机性来解决陷入局部最小值的问题:它们在先前计算的解决方案中添加了一个小的、几乎消失的噪声,以使算法在全局范围内更快地收敛最小值,而不是陷入局部最小值或鞍点。

你能试着画出你想要最小化的函数的风景吗?这可以帮助您分析问题:如果两个结果(在每台机器上)都是局部最小值,那么这种行为可以通过我之前的描述来解释。

如果不是这样,您应该检查您在两台机器上安装的scipy 的版本。也许您在一台设备上隐式使用 float 值,而在另一台设备上也隐式使用 double 值?

你看:对于这个(乍一看)奇怪的数字行为有很多可能的解释;你必须给我们更多的细节来解决这个问题。

【讨论】:

  • 首先感谢您的回答!但是我在同一台计算机上多次得到相同的结果。我只是在另一台电脑上试了一下,得到了不同的结果,有点惊讶。我真的希望我可以上传我的代码,但我认为我不应该...... :(你能不能很好地告诉我更多关于“隐式使用 float 和 double”?这与机器精度有关吗?我该如何检查?(scipy 版本是相同的..)
  • @WonkiWoo 试着画出你想要最小化的函数的空间,就像我告诉你的那样。
  • 我遇到了同样的问题:在使用相同的包时,在两个 hpc 集群上使用相同的包会导致不同的结果,同时运行多次迭代的优化问题。这些优化器终止的最小值是本地的,我很确定。我可以在运行 python 时将某些数字设置(例如何时使用浮点数和双精度数)传递给 python 吗?或者字节数必须至少是?
  • 如果您使用的是 numpy,您必须确保使用相同的 openblas 版本,并且您已对其进行了相同的配置。但即便如此,也不能保证结果会一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2017-06-24
  • 2016-11-08
相关资源
最近更新 更多