Градиентный спуск с ограничениями (множители лагранжа)

Я пытаюсь найти min функции из N параметров с помощью градиентного спуска. Однако я хочу сделать это, ограничив суммой абсолютных значений параметров 1 (или <= 1, не имеет значения). По этой причине я использую метод множителей lagrange, поэтому, если моя функция f (x), я минимизирую f (x) + lambda * (g (x) -1), где g (x) является гладким приближением для сумма абсолютных значений параметров.

Теперь, как я понимаю, градиент этой функции будет равен только 0, когда g (x) = 1, так что метод поиска локального минимума должен найти минимум моей функции, в которой мое условие также выполняется. Проблема заключается в том, что это добавление моей функции неограниченно, так что Gradient Descent просто находит большие и большие лямбды с большими и большими параметрами (по абсолютной величине) и никогда не сходится.

В настоящий момент я использую реализацию CG для python (scipy), поэтому я бы предпочел предложения, которые не требуют от меня переписывать/настраивать сам CG-код, но использовать существующий метод.

Ответ 1

Проблема заключается в том, что при использовании множителей Лагранжа критические точки не встречаются в локальных минимумах лагранжиана - они встречаются в седловых точках. Поскольку алгоритм спуска градиента предназначен для нахождения локальных минимумов, он не сходится, когда вы даете ему проблему с ограничениями.

Существует, как правило, три решения:

  • Используйте численный метод, который способен находить точки седла, например. Ньютона. Однако они обычно требуют аналитических выражений как для градиента, так и для гессиана.
  • Используйте методы штрафа. Здесь вы добавляете дополнительный (гладкий) термин в свою функцию стоимости, которая равна нулю, когда ограничения удовлетворяются (или почти удовлетворены) и очень велики, когда они не удовлетворяются. Затем вы можете запустить спуск градиента, как обычно. Тем не менее, это часто имеет плохие свойства конвергенции, так как делает множество небольших корректировок, чтобы гарантировать, что параметры удовлетворяют ограничениям.
  • Вместо того, чтобы искать критические точки лагранжиана, минимизируем квадрат градиента лагранжиана. Очевидно, что если все производные лагранжиана равны нулю, то квадрат градиента будет равен нулю, а так как квадрат чего-то никогда не может быть меньше нуля, вы найдете те же решения, что и вы, путем экстремирования лагранжиана. Однако, если вы хотите использовать градиентный спуск, вам понадобится выражение для градиента квадрата градиента лагранжиана, что может быть непростым.

Лично я бы пошел с третьим подходом и численно вычислил градиент квадрата градиента лагранжиана, если слишком сложно получить для него аналитическое выражение.

Кроме того, вы не совсем поняли в своем вопросе - используете ли вы градиентный спуск или CG (сопряженные градиенты)?

Ответ 2

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

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

Например, рассмотрим задачу 1:

Найти (x1, x2), который минимизирует f (x1, x2) при условии нелинейного ограничения | x1 | + | x2 | <= 10.

Существует версия с линейным ограничением, проблема 2:

Найти (x1, x2, x3, x4), который минимизирует f (x1, x2) с учетом следующих линейных ограничений:

  • x1 <= х3
  • -x1 <= х3
  • x2 <= x4
  • -x2 <= х4
  • х3 + х4 <= 10

Примечание:

  • Если (x1, x2, x3, x4) удовлетворяет ограничениям для задачи 2, то (x1, x2) удовлетворяет ограничениям для задачи 1 (поскольку x3 >= abs (x1), x4 >= abs (x2))
  • Если (x1, x2) удовлетворяет ограничениям для задачи 1, то мы можем перейти к (x1, x2, x3, x4), удовлетворяющим ограничениям для задачи 2, установив x3 = abs (x1), x4 = abs (x2)
  • x3, x4 не влияют на целевую функцию

Отсюда следует, что поиск оптимального для задачи 2 даст вам оптимальный для задачи 1 и наоборот.

Ответ 3

Я нашел старую статью под названием "Ограниченная дифференциальная оптимизация", написанную в 1988 году, которая решает эту проблему очень легко и просто.

В этой статье автор утверждал, что для лагранжиана: L (x, b) = f (x) + b g (x)

выполняя градиентный спуск по x при выполнении градиента "восходящий" по b, вы, наконец, сходитесь к стационарной точке L (x, b), которая является локальным минимумом f (x) при ограничении г (х) = 0. Метод штрафа также может быть объединен, чтобы сблизиться быстрее и стабильнее.

Как правило, обратный градиент b сработает.

Я попробовал это в нескольких простых случаях, и это работает, хотя я действительно не понимаю, почему после прочтения этой статьи.