Scipy.Optimize.Minimize неэффективно? Двойные вызовы функции стоимости / градиента - PullRequest
0 голосов
/ 09 октября 2019

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

Например, у меня есть функция, которую я написал для вычисления «стоимости» (энергии для минимизации). ) функции, и он одновременно рассчитывает градиент. В этом нет ничего особенного, так как это обычная практика. Однако при вызове scipy.optimize.minimize запрашиваются две разные функции: одна возвращает скаляр, который должен быть минимизирован (т. Е. Стоимость в моем случае), и другая, которая вычисляет градиент текущего состояния. Пример:

j,grad = myCostFunction(X,y)

Если я не ошибаюсь, кажется, что мне нужно будет дважды вызывать мою функцию, причем каждый вызов должен быть указан для возврата либо стоимости, либо градиента, например:

opt = scipy.optimize.minimize(fun=myJFunction, jac=myGradFunction, args = args,...)

Разве это не трата времени на вычисления? Мой набор данных будет> 1 млн. Выборок и 10-ти функций, поэтому было бы предпочтительнее сократить избыточные вычисления, так как я буду обучать и переучивать эту штуку десятки тысяч раз для своего проекта. вход args. Аргументы передаются так:

# This is what I expect happens
myJFunction(x0,*args)
myGradFunction(x0,*args)

или вот так:

# This is what I wish it did
myJFunction(x0,arg0,arg1,arg2)
myGradFunction(x0,arg3,arg4,arg5)

Заранее спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

Проведя некоторые эксперименты и поиск, я нашел ответы на свои вопросы.

Хотя я не могу точно сказать о функции scipy.optimize.minimize, используя другие функции оптимизации (например, scipy.optimize.fmin_tnc) прямо заявляет, что вызываемая функция func может либо (1) вернуть энергию и градиент, (2) вернуть энергию и указать функцию градиента для этого параметра fprime (медленнее), либо (3) вернутьтолько энергия и функция оценивают градиент через возмущение (намного медленнее).

См. документы здесь: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.fmin_tnc.html

Я был очень рад видеть, что могу использовать только одну функциювернуть оба параметра. Я предполагаю, что это тот же случай для функции minimize, но я не проверял ее, чтобы быть уверенным (см. Редактирование 1)

Что касается моего второго вопроса, если вы укажете две разные функции, *args параметры передаются обеим функциям одинаково;Вы не можете указать отдельные параметры для обоих.

РЕДАКТ. 1: Считывание документации minimize больше, если для параметра jac установлено значение True, то оптимизатор предполагает, чтоfunc возвращает энергию и градиент. Кажется, что чтение документов очень полезно.

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