使用“scipy.optimize.minimize”最小化具有大梯度的函数
Minimizing functions with large gradients using `scipy.optimize.minimize`
我需要优化高维中的标量函数 space。该函数随着参数的变化而迅速变化,因此梯度(的绝对值)很大。 scipy.optimize.minimize
中的优化器失败,因为最小化过程采用的步骤太大。下面的代码使用一个简单的二次函数说明了这个问题。
from scipy.optimize import minimize
def objective(x, scalar=1):
"""
Quadratic objective function with optional scalar.
"""
# Report function call for debugging
print "objective({}, scalar={})".format(x, scalar)
# Return function value and gradient
return x ** 2 * scalar, 2 * x * scalar
# This optimisation succeeds
print minimize(objective, 1, jac=True)
# This optimisation fails
print minimize(objective, 1, (1e8, ), jac=True)
当然,我可以手动重新调整感兴趣函数的值和梯度,但我想知道是否有推荐的方法来最小化此类函数,例如指定学习率。
对于大型非线性优化问题,通常会(至少)注意四件事:
- 缩放
- 初始值
- 界限
- 精确的梯度和可能的二阶导数(对于复杂问题
使用允许自动微分的建模系统)
一些更高级的求解器可能会为自动缩放提供一些支持。然而,非线性问题的缩放并不那么容易,因为雅可比行列式会发生变化(一些通常可用的策略是:仅缩放线性部分,在开始时根据初始值缩放线性 + 非线性部分一次,或在期间重新缩放问题迭代过程)。线性求解器在这方面更容易(雅可比是常数,所以我们可以在开始时缩放一次)。 Scipy.optimize.minimize
不是最先进的,所以我鼓励您自己缩放(通常您只能在求解器开始之前执行一次;在某些情况下,您甚至可以停止求解器以重新缩放,然后再次调用求解器使用最后一点作为初始值——这听起来很疯狂,但这个技巧帮助了我几次)。良好的初始点和良好的边界在这方面也有帮助(以便将求解器保持在可以可靠地评估函数和梯度的合理区域)。最后,有时模型重构可以帮助提供更好的缩放比例(用乘法代替除法,取对数等)。
我需要优化高维中的标量函数 space。该函数随着参数的变化而迅速变化,因此梯度(的绝对值)很大。 scipy.optimize.minimize
中的优化器失败,因为最小化过程采用的步骤太大。下面的代码使用一个简单的二次函数说明了这个问题。
from scipy.optimize import minimize
def objective(x, scalar=1):
"""
Quadratic objective function with optional scalar.
"""
# Report function call for debugging
print "objective({}, scalar={})".format(x, scalar)
# Return function value and gradient
return x ** 2 * scalar, 2 * x * scalar
# This optimisation succeeds
print minimize(objective, 1, jac=True)
# This optimisation fails
print minimize(objective, 1, (1e8, ), jac=True)
当然,我可以手动重新调整感兴趣函数的值和梯度,但我想知道是否有推荐的方法来最小化此类函数,例如指定学习率。
对于大型非线性优化问题,通常会(至少)注意四件事:
- 缩放
- 初始值
- 界限
- 精确的梯度和可能的二阶导数(对于复杂问题 使用允许自动微分的建模系统)
一些更高级的求解器可能会为自动缩放提供一些支持。然而,非线性问题的缩放并不那么容易,因为雅可比行列式会发生变化(一些通常可用的策略是:仅缩放线性部分,在开始时根据初始值缩放线性 + 非线性部分一次,或在期间重新缩放问题迭代过程)。线性求解器在这方面更容易(雅可比是常数,所以我们可以在开始时缩放一次)。 Scipy.optimize.minimize
不是最先进的,所以我鼓励您自己缩放(通常您只能在求解器开始之前执行一次;在某些情况下,您甚至可以停止求解器以重新缩放,然后再次调用求解器使用最后一点作为初始值——这听起来很疯狂,但这个技巧帮助了我几次)。良好的初始点和良好的边界在这方面也有帮助(以便将求解器保持在可以可靠地评估函数和梯度的合理区域)。最后,有时模型重构可以帮助提供更好的缩放比例(用乘法代替除法,取对数等)。