【问题标题】:Limit/minimize step size in scipy optimization?在 scipy 优化中限制/最小化步长?
【发布时间】:2018-02-16 13:16:14
【问题描述】:

我正在使用以下命令(使用 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”选项选择初始步长。

【问题讨论】:

  • 使用多元最小化器来最小化一个变量的函数似乎很奇怪。
  • 我实际上是在最小化多个参数,但只有一个参数有这个问题。我想如果我去掉额外的细节会让我的问题更清楚

标签: python numpy math optimization scipy


【解决方案1】:

我参加聚会有点晚了,但是当我遇到类似问题时,我想分享一下我的解决方法。 优化器的初始步骤似乎与正在优化的变量(x0 参数)的初始猜测有关。就我而言,我需要优化一个角度。当我最初对角度的猜测接近零度时,算法采取了非常小的步骤(度数的分数),这比我的函数的灵敏度要低。这导致寻找正确解决方案的失败。 我能够通过将 360 度添加到角度的原始初始猜测来解决问题。这迫使最小化算法在开始时采取更大的步骤并收敛到正确的值。

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

【讨论】:

    【解决方案2】:

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

    eps 仅用于在不给出梯度时通过有限差分进行数值微分!

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

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

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

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

    【讨论】:

    • 我在函数中写了一个logger来记录它每次调用的输入和输出,这样我就知道访问了哪些点。 0.35 是第一个,0.36 实际上是第二个,之后它会根据 BFGS 的发现而变化。
    • 也许,但这种解释仍然是错误的。而且 BFGS 不是 LBFGS。
    • 哎呀,我的意思是 L-BFGS。编辑:其实这里是点的参观开始,顺序,从我的记录0.35 0.36 0.344852999998 0.354852999998 0.339326999997 0.349326999997 0.317222999993 0.327222999993 0.228806999976 0.238806999976 0.316794034502 0.326794034502 .......如果L-BFGS-B是不合适的嘈杂功能,您有其他方法的推荐吗?
    • Google for noisy function optimizationblack-box optimization- 但请做好准备:这是一项更艰巨的任务!从 scipy 的算法,我会尝试 Nelder-Mead (因为它是无梯度的,有时用于此;不确定 Powell)。
    • 旁注:我认为你上面给出的路径(var-values)在使用一些类似牛顿的方法和行搜索并且只有一个变量时没有多大意义。我可能会认为路径应该是单调的,但至少不会那么振荡。这显然是噪声梯度的一些缺点。
    【解决方案3】:

    我对类似问题的解决方案是使用noisyopt.minimizeCompass。 如果你指定errorcontrol=False,它从x0开始,最初围绕它移动一个因子scaling*deltainit,其中scaling是一个数组,所以你可以为不同的维度指定不同的步数。

    经过一些尝试,它开始将步速因子减半,直到deltatol,在找到的局部最小值附近移动,最后停止。 通过适当的参数选择,您可以让算法在想要的“区域”周围搜索,并且当Mouvements太小时停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2020-08-08
      • 2018-07-30
      • 2017-08-01
      • 2019-10-01
      • 2018-03-17
      • 2019-07-20
      相关资源
      最近更新 更多