Как работает метод стохастического градиентного спуска Адама?


45

Я знаком с основными алгоритмами градиентного спуска для обучения нейронных сетей. Я прочитал статью с предложением Адама: АДАМ: МЕТОД СТОХАСТИЧЕСКОЙ ОПТИМИЗАЦИИ .

Хотя у меня определенно есть некоторые идеи (по крайней мере), статья кажется мне слишком высокой в ​​целом. Например, функция стоимости часто является суммой множества различных функций, поэтому для оптимизации ее значения необходимо выполнить огромное количество вычислений; Стохастические градиентные спуски - насколько я понимаю тему - рассчитывают оптимизацию только для подмножества этих функций. Для меня неясно, как Адам делает это и почему это приводит к уменьшенной ошибке обучения для всего .J(θ)J(θ)

Я думаю, что Адам обновляет свой градиент, принимая во внимание предыдущий градиент. Они называют это чем-то вроде использования импульса? Что именно это импульс? Согласно алгоритму на второй странице статьи, это какое-то скользящее среднее, как некоторые оценки первого и второго моментов «правильного» градиента?

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

Кто-нибудь может объяснить, как работает Адам? Особенно, как это сходится, в частности, почему метод Адама работает и в чем именно выгода?


1
Вы должны предоставить лучшее название для вашего вопроса. Что именно об Адаме ты хочешь спросить? Даже если это вообще, попытайтесь сделать это немного более доступным для поиска.
Чарли Паркер

Ответы:


40

В статье Адама говорится: «... многие целевые функции состоят из суммы подфункций, оцениваемых для разных подвыборок данных; в этом случае оптимизацию можно сделать более эффективной, если предпринять шаги градиента по отдельным подфункциям ...» Здесь они просто означает, что целевая функция представляет собой сумму ошибок по сравнению с примерами обучения, и обучение может проводиться на отдельных примерах или мини-пакетах. Это то же самое, что и при стохастическом градиентном спуске (SGD), который более эффективен для крупномасштабных задач, чем пакетное обучение, поскольку обновления параметров происходят чаще.

Что касается того, почему Адам работает, он использует несколько хитростей.

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

Momentum просто означает, что некоторая часть предыдущего обновления добавляется к текущему обновлению, так что повторные обновления в определенном направлении составляются; мы набираем обороты, движемся все быстрее и быстрее в этом направлении. В случае каньона мы будем наращивать импульс в направлении минимума, поскольку все обновления имеют компонент в этом направлении. Напротив, движение вперед и назад по стенкам каньона предполагает постоянное изменение направления движения, поэтому импульс поможет ослабить колебания в этих направлениях.

Еще один прием, который использует Адам, - адаптивно выбирать отдельную скорость обучения для каждого параметра. Параметры, которые обычно получают меньшие или менее частые обновления, получают большие обновления с Адамом (обратное также верно). Это ускоряет обучение в тех случаях, когда соответствующие скорости обучения варьируются в зависимости от параметров. Например, в глубоких сетях градиенты могут стать небольшими на ранних уровнях, и имеет смысл увеличить скорость обучения для соответствующих параметров. Еще одним преимуществом этого подхода является то, что, поскольку скорость обучения регулируется автоматически, ручная настройка становится менее важной. Стандарт SGD требует тщательной настройки (и, возможно, онлайн-корректировки) скоростей обучения, но это менее верно для Адама и связанных с ним методов. Все еще необходимо выбрать гиперпараметры,

Родственные методы :

Импульс часто используется со стандартным SGD. Улучшенная версия называется Нестеров импульс или Нестеров ускоренный градиент. Другие методы, которые используют автоматически настраиваемую скорость обучения для каждого параметра, включают: Adagrad, RMSprop и Adadelta. RMSprop и Adadelta решают проблему с Adagrad, которая может привести к остановке обучения. Адам похож на RMSprop с импульсом. Надам модифицирует Адама, чтобы использовать импульс Нестерова вместо классического импульса.

Рекомендации :

Кингма и Ба (2014) . Адам: метод стохастической оптимизации.

Goodfellow et al. (2016) . Глубокое обучение, глава 8.

Слайды из курса Джеффа Хинтона

Дозат (2016) . Включение Нестерова Импульса в Адама.


2
(+1) Сообществу было бы очень полезно, если бы вы могли обновить свой ответ, включив в него дополнительную информацию о доказательствах сходимости Адама и их исправлениях, таких как «О сходимости Адама и не только» openreview.net/forum?id=ryQu7f- RZ
Восстановить Монику

2
Спасибо @Sycorax, я постараюсь обновить, когда у меня будет время
user20160

1
IIUC, Адам использует нечто похожее на импульс, но другое. Как вы писали, метод импульс добавляет текущее обновление к (большой) части предыдущего обновления. Напротив, Адам использует экспоненциально убывающее среднее значение последних градиентов, где большинство методов SGD используют текущий градиент. Т.е. каждый шаг Адама занимает лишь небольшую долю текущего градиента. Таким образом, в отличие от простого шара, который накапливает импульс, Адам ведет себя как тяжелый шар с трением, как объясняется в GAN, обученных правилу обновления двух временных масштабов, сходящемуся к локальному равновесию Нэша . w
Орен Мильман

Продолжая мой последний комментарий, этот ответ объясняет различия между Адамом и rmsprop с импульсом, в то же время акцентируя внимание на том, как поведение Адама, подобное импульсу, отличается от обычного поведения, подобного импульсу. (Этот ответ также включает в себя код Python для имитации и графического представления поведения различных методов.)
Орен Мильман,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.