Заявление об ограничении ответственности: я предполагаю, что обладаю базовыми знаниями об алгоритмах оптимизации нейронных сетей. В частности, знание SGD и SGD с импульсом будет очень полезно для понимания этого поста.

I. Введение

RMSprop - это неопубликованный алгоритм оптимизации, разработанный для нейронных сетей, впервые предложенный Джеффом Хинтоном в лекции 6 онлайн-курса Нейронные сети для машинного обучения [1]. RMSprop относится к сфере методов адаптивной скорости обучения, популярность которых в последние годы растет, но также вызывает некоторую критику [6]. Он известен тем, что не был опубликован, но очень хорошо известен; большинство фреймворков глубокого обучения включают его реализацию "из коробки".

Есть два способа ввести RMSprop. Во-первых, следует рассматривать это как адаптацию алгоритма rprop для мини-пакетного обучения. Это было первоначальной мотивацией для разработки этого алгоритма. Другой способ - взглянуть на его сходство с Adagrad [2] и рассматривать RMSprop как способ справиться с его радикально снижающейся скоростью обучения. Я постараюсь охватить оба момента, чтобы было понятнее, почему алгоритм работает.

II. RPROP

Начнем с понимания rprop - алгоритма, который используется для полной пакетной оптимизации. Rprop [3] пытается решить проблему, заключающуюся в том, что градиенты могут сильно различаться по величине. Некоторые градиенты могут быть крошечными, а другие - огромными, что приводит к очень сложной проблеме - попытке найти единую глобальную скорость обучения для алгоритма. Если мы используем полное пакетное обучение, мы можем справиться с этой проблемой, используя только знак градиента. При этом мы можем гарантировать, что все обновления веса имеют одинаковый размер. Эта настройка очень помогает с седловыми точками и плато, поскольку мы делаем достаточно большие шаги даже с крошечными градиентами. Обратите внимание, что мы не можем сделать это, просто увеличив скорость обучения, потому что шаги, которые мы делаем с большими градиентами, будут еще больше, что приведет к расхождению. Rprop сочетает в себе идею использования только знака градиента с идеей индивидуальной адаптации размера шага для каждого веса. Итак, вместо того, чтобы смотреть на величину градиента, мы будем смотреть на размер шага, определенный для этого конкретного веса. И этот размер шага со временем меняется индивидуально, так что мы ускоряем обучение в нужном нам направлении. Чтобы настроить размер шага под какой-то вес, используется следующий алгоритм:

  1. Сначала смотрим на знаки последних двух градиентов веса.
  2. Если у них одинаковый знак, это означает, что мы движемся в правильном направлении и должны ускорить его на небольшую долю, то есть мы должны увеличить размер шага мультипликативно (например, в 1,2 раза). Если они разные, это означает, что мы сделали слишком большой шаг и перепрыгнули через локальные минимумы, поэтому мы должны уменьшить размер шага мультипликативно (например, в 0,5 раза).
  3. Затем мы ограничиваем размер шага между двумя значениями. Эти значения действительно зависят от вашего приложения и набора данных, хорошие значения, которые могут быть по умолчанию, равны 50 и миллионной доле, что является хорошим началом.
  4. Теперь мы можем применить обновление веса.

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

III. Rprop в RMSprop

Rprop не работает, когда у нас очень большие наборы данных и нужно выполнять мини-пакетные обновления весов. Почему не работает с мини-партиями? Что ж, люди пробовали это, но им было трудно заставить его работать. Причина, по которой он не работает, заключается в том, что он нарушает центральную идею стохастического градиентного спуска, заключающуюся в том, что при достаточно низкой скорости обучения он усредняет градиенты по последовательным мини-пакетам. Рассмотрим вес, который получает градиент 0,1 для девяти мини-пакетов и градиент -0,9 для десятых мини-пакетов. Мы хотим, чтобы эти градиенты грубо компенсировали друг друга, чтобы оставаться примерно одинаковыми. Но это не то, что происходит с rprop. С помощью rprop мы увеличиваем вес в 9 раз и уменьшаем только один раз, поэтому вес становится намного больше.

Чтобы объединить надежность rprop (просто используя знак градиента), эффективность, которую мы получаем от мини-пакетов, и усреднение по мини-пакетам, которое позволяет правильно комбинировать градиенты, мы должны взглянуть на rprop с другой точки зрения. Rprop эквивалентен использованию градиента, но также и делению на размер градиента, поэтому мы получаем одинаковую величину, независимо от того, насколько велик этот конкретный градиент. Проблема с мини-пакетами заключается в том, что мы каждый раз делим их на разные градиенты, так почему бы не заставить число, на которое мы делим, быть одинаковым для соседних мини-пакетов? Центральная идея RMSprop - сохранить скользящее среднее квадратов градиентов для каждого веса. А затем делим градиент на квадратный корень из среднего квадрата. Вот почему он называется RMSprop (среднеквадратичное значение). С математическими уравнениями правило обновления выглядит так:

Как видно из приведенного выше уравнения, мы адаптируем скорость обучения путем деления на корень квадрата градиента, но поскольку у нас есть только оценка градиента для текущего мини-пакета, вместо этого нам нужно использовать его скользящее среднее. Значение по умолчанию для параметра скользящего среднего, которое вы можете использовать в своих проектах, - 0,9. Он очень хорошо работает для большинства приложений. В коде алгоритм может выглядеть так:

IV. Сходство с Адаградом.

Adagrad [2] - это адаптивные алгоритмы скорости обучения, которые очень похожи на RMSprop. Adagrad добавляет поэлементное масштабирование градиента на основе исторической суммы квадратов в каждом измерении. Это означает, что мы храним текущую сумму квадратов градиентов. А затем мы адаптируем скорость обучения, разделив ее на эту сумму. В коде это можно выразить так:

Что делает это масштабирование, когда у нас большое число условий? Если у нас есть две координаты - одна всегда с большими градиентами, а другая с небольшими градиентами, мы будем нырять на соответствующее большое или маленькое число, поэтому мы ускоряем движение в небольшом направлении, а в направлении, где градиенты большие, мы идем. чтобы замедлиться, когда мы делим на какое-то большое число.

Что происходит в процессе обучения? Шаги становятся все меньше, меньше и меньше, потому что мы постоянно обновляем квадратные градации, растущие по мере тренировки. Таким образом, мы каждый раз делим на большее число. В выпуклой оптимизации это имеет большой смысл, потому что, когда мы приближаемся к минине, мы хотим замедлиться. В невыпуклом случае это плохо, так как мы можем застрять в седловой точке. Мы можем рассматривать RMSprop как алгоритм, который немного решает эту проблему.

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

V. Результаты

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

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

В этом случае алгоритмы начинаются с точки с очень большими начальными градиентами. RMSprop (черная линия) проходит почти самый оптимальный путь, в то время как методы импульса сильно выходят за рамки. Адаград на секунду становится нестабильным.

VI. Заключение (Узнать больше)

RMSprop - хороший, быстрый и очень популярный оптимизатор. Взгляд на тенденции в машинном обучении [4] Андрея Карпати показывает, что это один из самых популярных алгоритмов оптимизации, используемых в глубоком обучении, его популярность превосходит только Адам [5]. Если вы хотите узнать больше об оптимизации в глубоком обучении, вам следует ознакомиться с некоторыми из следующих источников:

  1. Блог Себастьяна Рудера содержит несколько статей о тенденциях в области оптимизации глубокого обучения.
  2. Fast.ai - отличный курс по глубокому обучению, они проходят через самые популярные алгоритмы оптимизации, объясняя их на таблицах Excel.
  3. Второй курс Эндрю Нг его специализации по глубокому обучению на coursera также затрагивает популярные алгоритмы, объясняя их очень ясно.

VII. использованная литература

[1] Нейронные сети Джеффри Хинтона для онлайн-курса машинного обучения. https://www.coursera.org/learn/neural-networks/home/welcome

[2] Адаград: Дучи, Дж., Хазан, Э., и Сингер, Ю. (2011). Адаптивные субградиентные методы для онлайн-обучения и стохастической оптимизации. Журнал исследований в области машинного обучения, 12, 2121–2159. Получено с http://jmlr.org/papers/v12/duchi11a.html

[3] Кристиан Игель и Майкл Хускен (2000). Улучшение алгоритма обучения Rprop. Http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.17.1332

[4] Андрей Карпатый (2017). Взгляд на тенденции в машинном обучении. Https://medium.com/@karpathy/a-peek-at-trends-in-machine-learning-ab8a1085a106

[5] Кингма, Д. П., и Ба, Дж. Л. (2015). Адам: метод стохастической оптимизации. Международная конференция по обучающим представлениям, 1–13

[6] Ашиа К. Уилсон , Ребекка Рулофс , Митчелл Стерн , Нати Сребро, Бенджамин Рехт (2017) Предельная ценность методов адаптивного градиента в машинном обучении. arXiv: 1705.08292v2