Как правильно выбрать алгоритм оптимизации?

16

Мне нужно найти минимум функции. Читая документы по адресу http://docs.scipy.org/doc/scipy/reference/optimize.html, я вижу, что есть несколько алгоритмов, которые делают одно и то же, то есть находят минимум. Как я узнаю, какой из них выбрать?

некоторые из перечисленных алгоритмов

  • Минимизируйте функцию, используя алгоритм симплексного спуска.
  • Минимизируйте функцию, используя алгоритм BFGS.
  • Минимизируйте функцию с помощью алгоритма нелинейного сопряженного градиента.
  • Минимизируйте функцию f, используя метод Ньютона-CG.
  • Минимизируйте функцию, используя модифицированный метод Пауэлла.

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

siamii
источник
Ну, вы должны исследовать природу вашей проблемы: она линейная или нет? Какова его размерность? Ваша функция стоимости дешевая, чтобы оценить? Можете ли вы оценить ваши производные аналитически и / или дешево? У вас есть ограничения? Если у вас есть ограничения, можете ли вы написать свою проблему легко, как без ограничений? Пожалуйста, уточните эти вопросы подробнее.
usεr11852 говорит восстановить Monic
@ user11852 Это линейно. Размерность составляет около 50 функций, для расчета градиента и стоимости требуется около 2 минут, поэтому не дешево. Я не думаю, что у меня есть ограничения.
Сиамии
Я не уверен, что вы подразумеваете под "линейным" здесь. Если ваша задача линейная, градиент постоянный и дешевый для вычисления. Если ваша целевая функция линейна и не имеет ограничений, минимум равен -infinity (или, возможно, 0).
Пол
@paul: В оптимизации линейность обычно относится к ограничениям, а не к самой функции. Я (ошибочно предоставленный) ссылался на «линейность» в связи с гладкостью функции, и я думаю, что именно на это ссылался и ОП. В своем ответе я в основном исходил из того, что он все равно сказал «непрерывно».
usεr11852 говорит восстановить Monic

Ответы:

14

Исходя из того, что вы сказали: я предполагаю, что вы должны оптимизировать для 50 переменных; Я также предполагаю, что у вас возникла ситуация, когда очень сложно найти аналитические производные (не говоря уже о том, чтобы получить числовые значения), и что ваша оптимизация не ограничена.

Позвольте мне подчеркнуть, что вы немного несчастливы, потому что между 25-30 и 100 переменными это немного сумеречная зона, когда дело доходит до выбора между процедурами оптимизации большого или малого масштаба. Тем не менее, ничего не потеряно.

Учитывая, что даже производные первого порядка дороги, чтобы получить такой вид убивает идею метода Ньютона. Возможно, вам повезет с Quasi-Newton (BFGS), хотя если ваш гессиан немного диагонали, как начать с. CG обычно немного медленнее, чем BFGS, так что, вероятно, это не сильно улучшит ситуацию; используйте его, если память также является проблемой (или просто используйте L-BFGS в этом случае). Кроме того, учитывая, насколько медленно вы оцениваете вашу функцию, простой алгоритм поиска по крутому спуску / линии будет мучительно медленным; То же самое происходит с имитацией отжига и другими вариантами случайного поиска (я предполагаю, что у вас нет доступа к HMC и ко всему прочему).

Итак, когда вам нужен лучший результат, когда речь идет об оценке одной функции: используйте метод Пауэлла, а также протестируйте COBYLA; Несмотря на то, что он является ограниченным алгоритмом оптимизации, поскольку он будет внутренне линейно приближать градиент вашей функции для ускорения процесса, он сможет использовать преимущества линейности вашей функции. Также обязательно попробуйте NLopt для Python . У них много оптимизаторов без градиента; попробуйте UOBYQA; это также детище Пауэлла (Безусловная оптимизация с помощью квадратичных приближений).

Очень кратко: алгоритмы N-CG зависят от вычисления гессиана, и ваш гессиан кажется очень дорогим для вычисления. NLCG и BFGS не требуют этого, хотя они могут попытаться вычислить его один раз на первом этапе.

Я специально исключил симплексный алгоритм, потому что это совершенно другой зверь; не имеет ничего общего с градиентами как таковыми. Попробуйте, но я не могу это прокомментировать; это действительно зависит от природы вашей проблемы.

Для первого хорошего справочника по численной оптимизации книга CTKelly « Итерационные методы для оптимизации» поможет вам довольно далеко, довольно приятно.

usεr11852 говорит восстановить Monic
источник
Для дальнейшего использования: вам может быть интересно проверить бета-версию Computational Science на Stackexchange на похожие вопросы.
usεr11852 говорит восстановить Monic
Спасибо за ответ. На самом деле, моя размерность составляет 232750. Это количество градиентов, которые я вычисляю каждый раз. Я делаю оценку функций и вычисление градиента на GPU. Будет ли это совместимо с NLopt?
Сиам,
Я не использовал NLopt на графических процессорах, но не вижу очевидных причин, почему это должно быть проблемой в отношении совместимости. Я мог бы задать вопрос, хотя проблема частых операций ввода-вывода от и до графического процессора.
usεr11852 говорит восстановить Monic
@ usεr11852, Можно также обсудить сравнение методов градиентного спуска и QR-разложения для минимизации функции стоимости линейной регрессии? Нужно ли задавать отдельный вопрос?
Доктор Ниша Арора
@DrNishaArora: Да. Это было бы уместно для отдельного вопроса. Пожалуйста, смотрите ветку Зачем использовать градиентный спуск для линейной регрессии, когда доступно математическое решение замкнутой формы? чтобы избежать дублирования!
usεr11852 говорит восстановить Monic
1

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

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

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

cbeleites поддерживает Монику
источник
оно детерминированное и непрерывное.
Сиамии