Проблемы с autograd.hessian_vector_product и scipy.optimize.NonlinearConstraint

#python-2.7 #scipy #autograd

#python-2.7 #scipy #autograd

Вопрос:

Я пытаюсь выполнить задачу минимизации, используя scipy.optimize , включая NonlinearConstraint . Я действительно не хочу сам кодировать производные, поэтому я использую autograd для этого. Но даже несмотря на то, что я следую точно такой же процедуре для аргументов minimize и to NonlinearConstraint , первое, похоже, работает, а второе — нет.

Вот мой MWE:

 useconstraint = False

import autograd
import autograd.numpy as np
from scipy import optimize

def function(x): return x[0]**2   x[1]**2
functionjacobian = autograd.jacobian(function)
functionhvp = autograd.hessian_vector_product(function)

def constraint(x): return np.array([x[0]**2 - x[1]**2])
constraintjacobian = autograd.jacobian(constraint)
constrainthvp = autograd.hessian_vector_product(constraint)

constraint = optimize.NonlinearConstraint(constraint, 1, np.inf, constraintjacobian, constrainthvp)

startpoint = [1, 2]

bounds = optimize.Bounds([-np.inf, -np.inf], [np.inf, np.inf])

print optimize.minimize(
  function,
  startpoint,
  method='trust-constr',
  jac=functionjacobian,
  hessp=functionhvp,
  constraints=[constraint] if useconstraint else [],
  bounds=bounds,
)
  

Когда я выключаю useconstraint (вверху), он работает нормально и сводится к (0, 0) минимуму, как и ожидалось. Когда я включаю его, я получаю следующую ошибку:

 Traceback (most recent call last):
  File "test.py", line 29, in <module>
    bounds=bounds,
  File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 613, in minimize
    callback=callback, **options)
  File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py", line 336, in _minimize_trustregion_constr
    for c in constraints]
  File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_constraints.py", line 213, in __init__
    finite_diff_bounds, sparse_jacobian)
  File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_differentiable_functions.py", line 343, in __init__
    self.H = hess(self.x, self.v)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/wrap_util.py", line 20, in nary_f
    return unary_operator(unary_f, x, *nary_op_args, **nary_op_kwargs)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/differential_operators.py", line 24, in grad
    vjp, ans = _make_vjp(fun, x)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/core.py", line 10, in make_vjp
    end_value, end_node =  trace(start_node, fun, x)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 10, in trace
    end_box = fun(start_box)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/wrap_util.py", line 15, in unary_f
    return fun(*subargs, **kwargs)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/differential_operators.py", line 88, in vector_dot_grad
    return np.tensordot(fun_grad(*args, **kwargs), vector, np.ndim(vector))
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 44, in f_wrapped
    ans = f_wrapped(*argvals, **kwargs)
  File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 48, in f_wrapped
    return f_raw(*args, **kwargs)
  File "/home/heshy/.local/lib/python2.7/site-packages/numpy/core/numeric.py", line 1371, in tensordot
    raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum
  

Что я делаю не так? Я думаю, что проблема в hessian_vector_product том, что я вижу hess в сообщении об ошибке, но я не уверен в этом.

Ответ №1:

Хорошо, я нашел ответ. Это было очень запутанно.

hessp Аргумент minimize ожидает функцию, которая возвращает «гессиан целевой функции, умноженный на произвольный вектор p» (источник). В отличие от этого, hess аргумент в NonlinearConstraint ожидает «вызываемый объект, [который] должен возвращать матрицу мешанины dot(fun, v)» (источник).

Если вы интерпретируете первую цитату, как я, «Hessian of (целевая функция, умноженная на произвольный вектор p)», это означает практически то же самое, что «матрица мешанины dot (fun, v)». Поэтому я предположил, что вы могли бы использовать одну и ту же autograd функцию для обоих.

Однако правильная интерпретация — «(гессиан целевой функции), умноженный на произвольный вектор p», что совершенно другое. hessian_vector_product Функция в autograd выдает правильный результат для первого, но для второго нужна другая функция.

Комментарии:

1. Итак, было ли решение для этого, или вы не можете использовать autograd таким образом?