在scipy优化中限制/最小化步长?

时间:2017-09-07 17:54:31

标签: python numpy math optimization scipy

我使用以下命令(scipy,在python中):

minimize(func, 0.35, method='L-BFGS-B, bounds=np.array([0.075, None]), options={'eps':0.01}) 

执行以下操作:通过改变其一个输入参数(参数为温度,这是化学模拟)来最小化我的函数(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'来选择INITIAL步长。选项。

2 个答案:

答案 0 :(得分:1)

您的解释是错误的:eps不控制步长,而0.36不一定是第二个访问点(eps=0.01时)。

当你没有给出渐变时,

eps仅用于通过有限差分进行数值微分!

在L-BFGS-B中没有调整步长,因为它使用线搜索来近似最佳步长(根据基础理论的需要采取一些保护措施)。

当L-BFGS-B在稍后阶段进行这些微小步骤时,它有其原因。我非常确定,在每次迭代中都会检查步长为1的第一个值(因为我们通常不会做大步骤)。

话虽如此,似乎你的问题出在其他地方,很难猜到,因为我们没有详细说明。但是阅读关于你正在做什么的微小解释,我会非常害怕:L-BFGS-B与噪声函数(PRNG)和数值微分的组合将非常不稳定。它可能更糟糕,因为我们也在内部逼近一些反hessian。这听起来真是错误的方法!

(我在这里忽略了 user2357112 的评论,因为你说这是你真正的多变量任务。否则,是的,使用专门设计的方法!)

答案 1 :(得分:0)

我参加聚会有点晚了,但是当我遇到类似问题时,我只想分享我的解决方法。 看来优化器的初始步骤是相对于被优化变量(x0参数)的初始猜测而言的。就我而言,我需要优化角度。当我最初对角度的猜测接近于零度时,该算法采取了非常小的步长(度的分数),这比我函数的灵敏度要小。这导致无法找到正确的解决方案。 我可以通过将360度原始原始角度猜测来解决此问题。这迫使最小化算法在开始时采取更大的步骤,并收敛到正确的值。

您可以尝试通过在优化之前为模型添加恒定偏差并在以后减去它来做类似的事情。这不是最优雅的解决方案,但对我而言很有帮助。