Мне было интересно, каковы разные варианты использования для двух алгоритмов, Coordinate Descent и Gradient Descent .
Я знаю, что у координатного спуска есть проблемы с негладкими функциями, но он используется в популярных алгоритмах, таких как SVM и LASSO.
Однако градиентный спуск, по-моему, используется более широко, особенно при возрождении ANN и для многих других задач машинного обучения.
Мой вопрос: какой тип проблем подходит для одной, но не для другой, и в этом отношении, что делает согласование по координатному спуску для SVM и LASSO, но подходит для градиентного спуска для ANN?
Как выбрать между двумя при выборе алгоритма оптимизации?
Спуск по координатам обновляет один параметр за раз, в то время как градиентный спуск пытается обновить все параметры одновременно.
Трудно точно указать , когда один алгоритм будет работать лучше, чем другой. Например, я был очень потрясен, узнав, что координатный спуск был для LASSO современным уровнем. И я был не единственным; см. слайд 17 .
С учетом сказанного, есть некоторые особенности, которые могут сделать проблему более корректируемой для координации спуска:
(1) Быстрые условные обновления. Если по какой-то причине проблема позволяет индивидуально оптимизировать параметры очень быстро, спуск по координатам может использовать это. Например, можно обновить некоторые параметры, используя только подмножество данных, что значительно снижает вычислительные затраты на эти обновления. Другой случай, если есть решение в закрытой форме для отдельного параметра, зависящее от значений всех других параметров.
(2) Относительно независимые режимы для параметров. Если оптимальное значение одного параметра полностью не зависит от значений других параметров, то один раунд спуска координат приведет к решению (при условии, что каждое обновление координат находит текущий режим). С другой стороны, если режим для данного параметра очень сильно зависит от других значений параметров, спад координат с большой вероятностью будет постепенно увеличиваться с очень небольшими обновлениями в каждом раунде.
К сожалению, для большинства задач (2) не выполняется, поэтому редко, когда спуск по координатам дает хорошие результаты по сравнению с альтернативными алгоритмами. Я считаю, что причина того, что он работает хорошо для LASSO, заключается в том, что есть много приемов, которые можно использовать для выполнения условия (1).
источник
Я понимаю, что это старый вопрос и на него есть очень хорошие ответы. Я хотел бы поделиться некоторым практическим личным опытом.
Это на самом деле требует много. При градиентном спуске обычно разрешается ограничение через функцию штрафа. Здесь это не будет работать. Как только значение нарушает одно из этих ограничений, ваш код, как правило, вызывает какую-то числовую ошибку. Таким образом, приходится иметь дело с ограничениями, никогда не позволяя алгоритму оптимизации пройти его.
Существует множество преобразований, которые вы можете применить к своей задаче, чтобы удовлетворить ограничения, чтобы обеспечить градиентный спуск. Тем не менее, если вы ищете самый простой и ленивый способ реализовать это, тогда вам нужно перейти к координатному спуску:
Для таких, как я, которые работают в Python, это обычно означает, что я должен использовать дополнительный цикл for, который весьма негативно влияет на производительность. Градиентный спуск позволяет мне использовать Numpy, который оптимизирован по производительности. С его помощью можно получить очень хорошую скорость, однако это невозможно сделать с помощью координатного спуска, поэтому я обычно использую некоторую технику преобразования.
Таким образом, на самом деле вывод состоит в том, что спуск по координатам является самым простым вариантом для работы с очень строгими ограничениями, такими как параметр скорости в распределении Пуассона. Если он становится отрицательным, вы жалуетесь на код.
Я надеюсь, что это добавило немного понимания.
источник