scipy.optimize.minimize with BFGS: объект вызывается дважды с одним и тем же вектором параметров - PullRequest
4 голосов
/ 01 июля 2019

Я использую scipy.optimize.minimize с method='bfgs' для обучения выпуклой цели.

Каждый раз, когда я запускаю минимизацию, первые два вызова оптимизатора BFGS делают для моей целиФункция всегда имеет один и тот же параметр вектора.Это кажется ненужным, поскольку тратится несколько минут на перерасчет одного и того же дважды.

Минимальный рабочий пример (с гораздо более простой целью);

from scipy.optimize import minimize

def obj_jac(x):
    """Return objective value and jacobian value wrt. x"""
    print(x)
    return 10*x**2, 20*x

minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7)

Вывод;

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]

Кто-нибудь знает, является ли это ожидаемым поведением для реализации BFGS в scipy?


Обновление: я представил это как проблема # 10385 в проекте Scipy.

1 Ответ

2 голосов
/ 01 июля 2019

Это не ожидаемое поведение или, по крайней мере, есть ошибка сообщения.

Выполняя вывод статистики для оптимизации через options параметры:

minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7, options={'disp': True})

SciPy выводит следующее:

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 3
         Function evaluations: 6
         Gradient evaluations: 6

, где указанное число функций и оценок градиента, безусловно, отключено на один . Так что в SciPy для BFGS определенно есть ошибка в отчете о статистике.

Я также подозреваю, что внутри SciPy есть неэффективность, которая будет иметь следующий характер. Перед циклом итерации оцените функцию и ее градиент. Затем запустите цикл и начните с оценки функции и ее градиента. Это добавило бы дополнительную оценку функции для 0-й итерации и, конечно, этого можно избежать путем небольшой реорганизации кода (возможно, с некоторым компромиссом по сравнению с читаемостью алгоритма).

Уместно следующее:

Не будучи экспертом в SciPy, я бы сказал, что либо старая ошибка обнаружена из ниоткуда (о ней следует сообщать), либо она никогда не была исправлена, несмотря на то, что я понял из обсуждений на GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...