Мне нужно оптимизировать скалярную функцию в многомерном пространстве. Функция быстро меняется при изменении аргументов, так что (абсолютное значение) градиентов велико. Оптимизаторы в 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)
Конечно, я могу вручную масштабировать значение и градиент интересующей функции, но мне было интересно, есть ли рекомендуемый подход для минимизации таких функций, например. указание скорости обучения.