iam*_*max 6 python math optimization numpy scipy
我正在使用以下命令(使用 scipy,在 python 中):
minimize(func, 0.35, method='L-BFGS-B, bounds=np.array([0.075, None]), options={'eps':0.01})
Run Code Online (Sandbox Code Playgroud)
这将执行以下操作:通过改变它的一个输入参数(参数是温度,这是一个化学模拟)来最小化我的函数 (func),初始猜测为 0.35,将温度保持在 [0.075, inf) 范围内,取初始值步长为 0.01(换句话说,它测试的第二个点是 0.36,在最初的 0.35 之后)。
这一切都很好。问题是一段时间后,步长变得非常小。bfgs 优化器开始时采用 0.01 的步长,但很快就会收紧到非常小的步长。最后,有时它只会将温度更改到小数点后第 8 位或第 9 位。这是一个问题,因为我最小化的函数不是那么敏感。基本上,温度参数被传递到计算化学模拟包。它使用了一些随机数种子,并且在 bfgs 的每个交互中,化学模拟中可能有千万亿次 FLOP,它主要以 C++ 双精度运行。所以到小数点后 8 或 9 位,有很多噪声影响能量(能量是函数的输出,我试图通过改变温度来最小化),
所以我想要做的是告诉 scipy 优化器它不能采取比 1e-4 更小的步骤。但我似乎找不到办法做到这一点。如果可能的话,我想坚持使用 L-BFGS-B 方法。我已经查看了一些文档,但到目前为止我发现的唯一一件事是如何使用“eps”选项选择初始步长。
我参加聚会有点晚了,但是当我遇到类似问题时,我只想分享我的解决方法。优化器的初始步骤似乎与正在优化的变量(x0 参数)的初始猜测有关。就我而言,我需要优化一个角度。当我最初对角度的猜测接近零度时,算法采取了非常小的步长(度数的分数),这比我的函数的灵敏度要小。这导致了对正确解决方案的失败搜索。我能够通过将 360 度添加到角度的原始初始猜测来解决问题。这迫使最小化算法在开始时采取更大的步骤并收敛到正确的值。
您可以尝试通过在优化之前向模型添加恒定偏差并稍后减去它来尝试做类似的事情。这不是最优雅的解决方案,但它对我的情况有所帮助。
您的解释是错误的:eps不控制步长,并且 0.36 不一定是访问的第二个点(当 时eps=0.01)。
eps当您不给出梯度时,仅用于有限差分的数值微分!
L-BFGS-B 中没有需要调整的步长,因为它使用线搜索来近似最佳步长(根据基础理论需要采取一些保护措施)。
当L-BFGS-B在后期做这些微小的步骤时,它就有它的理由。我很确定,每次迭代都会检查步长 1 作为第一个值(因为我们通常不想执行大步长)。
话虽如此,您的问题似乎出在其他地方,这很难猜测,因为我们没有所有详细信息。但是阅读你关于你正在做的事情的微小解释,我会非常害怕:L-BFGS-B 与噪声函数(PRNG)和数值微分的组合将非常不稳定。情况可能更糟,因为我们也在内部逼近一些逆粗麻布矩阵。这听起来确实是错误的方法!
(我在这里忽略了user2357112的评论,因为你说这在你的情况下是一个真正的多变量任务。否则,是的,使用专门设计的方法!)
| 归档时间: |
|
| 查看次数: |
5869 次 |
| 最近记录: |