Хобрук: Ваш путь к мастерству в программировании

Минимизация функций с большими градиентами с помощью `scipy.optimize.minimize`

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

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


  • Масштабирование кажется очевидным решением, но помимо этого вы можете попробовать другие решатели. Методы, которые не используют информацию о градиенте (например, Nelder-Mead, Powell), очевидно, будут устойчивы к градиентам с огромными значениями. Newton-CG и TNC также работают хорошо, по крайней мере, для вашего простого теста. 23.02.2016
  • @ali_m, знаете ли вы хороший справочник о том, как выбрать разные оптимизаторы для данной проблемы, кроме как просто попробовать их? 25.02.2016
  • TBH Я не большой эксперт в этом вопросе - я обычно использую комбинацию scipy.optimize.minimize документация, Википедия и методом проб и ошибок. Глава 10 в Численные рецепты также очень полезна, если вы хотите понять, как эти алгоритмы работать на практике, но это может быть несколько тяжело, если ваши знания в области исчисления заржавели. 25.02.2016

Ответы:


1

Для больших задач нелинейной оптимизации обычно следует обращать внимание (как минимум) на четыре вещи:

  1. Масштабирование
  2. Начальные значения
  3. Границы
  4. Точные градиенты и, если возможно, вторые производные (для сложных задач используйте систему моделирования, позволяющую автоматически дифференцировать)

Некоторые более продвинутые решатели могут обеспечивать некоторую поддержку автоматического масштабирования. Однако масштабирование для нелинейных задач не так просто, поскольку якобиан будет меняться (обычно доступны следующие стратегии: масштабирование только линейной части, масштабирование линейной + нелинейной части один раз в начале на основе начальных значений или масштабирование проблемы во время итерационный процесс). У линейных решателей в этом отношении проще (якобиан постоянен, поэтому мы можем масштабировать один раз в начале). Scipy.optimize.minimize не является самым продвинутым, поэтому я бы посоветовал вам масштабировать вещи самостоятельно (обычно вы можете сделать это только один раз перед запуском решателя; в некоторых случаях вы можете даже остановить решатель для масштабирования, а затем снова вызвать решатель, используя последнюю точку как начальное значение - это звучит безумно, но этот трюк несколько раз помогал мне). В этом отношении также могут помочь хорошая начальная точка и хорошие границы (чтобы удерживать решатель в разумных областях, где функции и градиенты могут быть надежно оценены). Наконец, иногда переформулировка модели может помочь в обеспечении лучшего масштабирования (заменить деление умножением, взять журналы и т. д.).

23.02.2016
  • Знаете ли вы о более продвинутых процедурах оптимизации для Python? 25.02.2016
  • Ipopt имеет интерфейс Python, как и Knitro. Вы также можете изучить Pyomo. Наконец, система моделирования [AMPL] (www.ampl.com) также имеет интерфейс Python. Ipopt и Pyomo имеют открытый исходный код, а Knitro и AMPL — коммерческие. 25.02.2016
  • Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..