【问题标题】:How to simulate bounds for minimizers that do not foresee bounds?如何为无法预见边界的最小化器模拟边界?
【发布时间】:2019-08-28 14:07:23
【问题描述】:

我有一个优化问题,我想使用scipy.optimize.minimize 包,即不预见任何约束或界限的方法之一,例如'nelder-mead'、'powell'、'cg'、'bfgs ', newton-cg', 'dogleg', 'trust-ncg' - 见:minimize exception about bounds and constraints

我想通过在我的成本函数周围添加一个包装器来自己引入界限:

这个包装器被优化器调用并将参数传递给我想要优化的成本函数。成本函数将一个值返回给包装器。

如果优化器使用超出参数允许范围的参数调用包装器,包装器随后会在成本函数的结果中添加一些额外的“惩罚”,并传递惩罚和结果的总和将成本函数返回给优化器。

我的问题是:

如果我有一个像这样的二元惩罚函数(仅显示边界的上限),优化是否会正常工作(这意味着:它会以更高的概率找到我的成本函数的绝对最小值):

if parameter > upperBound:
    penalty = 1.e6
else:
    penalty = 0.0

或者使用更平滑的惩罚函数(模拟 Lipschitz 连续函数之类的东西)更好,比如 e. G。移位平方函数:

if parameter > upperBound:
    penalty = VERY_HIGH_NUMBER * (parameter - upperBound)**2
else:
    penalty = 0.0

如果使用更平滑的惩罚函数更好,对于这类函数是否有任何“最佳实践”(例如使用 sigmoid 函数或平方函数等)?

【问题讨论】:

  • 为什么算法(子集)选择这样?为什么使用 bfgs (无边界),但不使用支持边界的 lbfgs (以比您建议的更合理的方式)?为什么不区分无梯度(nelder-mead,powell?)和基于梯度的方法?二元惩罚将使所有基于梯度的求解器的假设无效(通常:两次可微)。平滑的方法更好(但 HIGH-NUMBER 可能会引入数值问题),但细节取决于所选的求解器,并且 绝对最小值 只能通过凸选择曲面来保证(同时不会使可微性无效)。
  • 感谢您的评论。您是对的,可以进一步区分不同的方法。我的观察是,一些未绑定的求解器在我的成本函数上工作得非常好,因此我想知道一个通​​用的解决方案会是什么样子,也为它们使用边界。

标签: python scipy mathematical-optimization


【解决方案1】:

我通常会转换参数空间,使-Inf 对应于最低值,+Inf 对应于最高值,例如如果它在顶部和底部有界,则可以使用 sigmoid 函数,或者如果您只是希望某些东西是积极的,则可以使用“1+exp 的对数”(不确定其规范名称)。天真的版本是:

def sigfn(x):
  return 1 / (1 + exp(-x))

def logexpfn(x):
  return log1p(exp(x))

但您可能需要特别小心处理较大的值,因为高于 ~700 的值会导致 exp 溢出。因此功能可以扩展为:

def sigfn(x):
  if x < -36:
    return exp(x)
  return 1 / (1 + exp(-x))

def logexpfn(x):
  if x > 36:
    return x
  return log1p(exp(x))

我使用 36,因为这是我们失去精度的点,即exp(37) * float_info.epsilon &gt; 1

如果你只想要一个上限,你可以使用这些来做:

def optfn(param):
  param = upperValue - logexpfn(-param)

或任何对您的代码有意义的东西。这显然比直接使用东西更尴尬,但它是一种非常通用的技术并且普遍适用

【讨论】:

  • 感谢您的回答。谢谢。这已经很有帮助了。我意识到使用简化的 sigmoid 函数,如:internalRepresentation = lower + (upper - lower) * (0.5 + 0.5 * externalRepresentation / (1 + abs(externalRepresentation))) 将非常有效地限制任何外部值,而不会对已经很小的值造成任何精度损失。现在我正在寻找这个公式的逆表示:-):internalRepresentation -&gt; externalRepresentation
  • 很高兴有帮助!虽然我建议不要使用abs,因为它不是到处都是differentiable。即优化器将在接近零的情况下使用该功能。虽然我不确定你为什么需要逆向;这只是为了选择一个已知的起点,还是别的什么?
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 2012-02-22
  • 2021-04-20
  • 2016-03-04
  • 1970-01-01
  • 2014-07-17
  • 2020-12-08
  • 2010-10-25
相关资源
最近更新 更多