Демистификация различных вариантов алгоритма оптимизации градиентного спуска

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

Обучение глубокой нейронной сети для нахождения лучших параметров этой сети является итеративным процессом, но обучение глубоких нейронных сетей для большого набора данных итеративно очень медленное
Поэтому нам нужно, чтобы хороший алгоритм оптимизации для обновления параметров (весов и смещений) сети мог ускорить процесс обучения сети. Выбор алгоритмов оптимизации при глубоком обучении может влиять на скорость обучения сети и ее производительность.
В этой статье мы обсудим необходимость улучшения техники оптимизации градиентного спуска, а также обсудим различные варианты алгоритма оптимизации градиентного спуска.
  • Градиентный спуск
  • Импульс градиентного спуска
  • Нестеров Ускоренный градиентный спуск
  • Мини-пакет & Стохастический градиентный спуск
  • Адаптивный градиентный спуск — АдаГрад
  • Среднеквадратичный градиентный спад распространения — RMSProp
  • Адаптивная оценка момента — Адам

Градиентный спуск

Градиентный спуск является одним из наиболее часто используемых методов оптимизации для оптимизации нейронных сетей. Алгоритм градиентного спуска обновляет параметры, перемещаясь в направлении, противоположном градиенту целевой функции относительно параметров сети.
Алгоритм градиентного спуска для одного сигмовидного нейрона работает следующим образом:
111rcp6qw3h5dt85yxjbzbh5ckzfjo2-i2a31no Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Правило обновления параметра будет дано,
  • Инициализируйте параметры случайным образом  w  и  b  и выполните итерации по всем наблюдениям в данных.
  • Рассчитайте значение градиента для каждого параметра (т. Е. В каком направлении нам нужно двигаться, чтобы уменьшить потери).
  • Обновите значение каждого параметра на основе его значения градиента.
  • Продолжайте выполнять шаги 2 и 3, пока функция потерь не будет минимизирована.
Скорость обучения  определяет размер шагов, которые мы предпринимаем для достижения минимума. Другими словами, он контролирует, насколько быстро или медленно мы должны приблизиться к минимуму.
Можем ли мы придумать лучшее правило обновления?
Чтобы лучше понять правило обновления градиентного спуска, я взял несколько игрушечных данных и перебрал все точки данных для 1000 эпох и вычислил потери для различных значений   и  b. Как только я получил значения потерь для всех возможных комбинаций  w  и  b , я смог создать анимацию, которая показывает правило градиентного спуска в действии.
222rcp6qw3h5dt85yxjbzbh5ckzfjo2-s022v31ww Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Правило градиентного спуска в действии (анимация)
Более темный оттенок красного цвета на графике указывает область, где значение потерь является высоким, а более темный оттенок синего в долине указывает на самую низкую точку потерь. Точки внизу указывают на различные комбинации   &  b  (параметры), а точки на контуре указывают значение потерь для соответствующих значений параметров.
Из анимации потери градиентного спуска вы бы заметили, что для начальных итераций, пока кривая все еще находится на плоской светло-красной поверхности, значения  w и  b  в нижней части контурного графика меняются очень мало для каждой эпохи.
Это означает, что мы делаем очень маленькие шаги к нашей цели, но как только наша кривая потерь входит в долину (светло-голубая область) для каждой эпохи, значения  w  и   резко меняются (черные боты находятся далеко друг от друга)
3333rcp6qw3h5dt85yxjbzbh5ckzfjo2-u82bt31oz Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Маленькие шаги к потере (слева) и большие шаги к потере (справа)
Короче говоря, в слабых областях поверхности потерь движение очень медленное, а в крутых областях движение быстрое, и снова в нежных областях внизу движение очень медленное.

Но почему?

Мы сделали довольно интересное наблюдение за правилом обновления градиентного спуска, но мы не знаем, почему движение в некоторых частях медленное и быстрое в некоторых частях поверхности контура.
Давайте возьмем простую функцию, показанную ниже,
4444rcp6qw3h5dt85yxjbzbh5ckzfjo2-jf2gd31qn Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Как видно из рисунка, кривая представляет собой комбинацию очень крутой области и нежной области. Наклон (производная) кривой в крутой области оценивается в значение 3 (изменение y = 3, изменение в x = 1), аналогично, наклон кривой в слабой области оценивается в значение 1. Так мы делаем вывод, что, когда наклон очень крутой, производная (градиент) высока, а когда наклон мягкий, производная низкая.
Производные на крутых склонах больше по величине, тогда как для пологих склонов они меньше по величине. Теперь, связывая эту информацию с анимацией градиентного спуска, когда мы находимся на плато с небольшим наклоном, производные в этой области будут небольшими. Если производные малы, то обновление параметра также будет небольшим.
Следовательно, в областях, где кривая плавная, обновления небольшие, тогда как в областях, где кривая крутая, обновления большие

И что?

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

Контурные карты

Прежде чем мы перейдем к некоторым улучшениям правила обновления градиентного спуска, сначала сделаем небольшой обход и поймем, как интерпретировать контурные карты. Контурные карты помогают нам визуализировать трехмерные данные в двух измерениях с использованием контуров или областей с цветовой кодировкой. Контурные карты рассказывают о движении наклона вдоль определенного направления на основе расстояния между соответствующими контурами в 2D контурной карте.
Небольшое расстояние между контурами указывает на крутой уклон вдоль этого направления. Большое расстояние между контурами указывает на пологий уклон вдоль этого направления.

Визуализация градиентного спуска с использованием контурной карты

Трехмерное представление поверхности ошибки градиентного спуска выглядит следующим образом:
5555rcp6qw3h5dt85yxjbzbh5ckzfjo2-xg2mb31ad Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Сходимость градиентного спуска в 3D
6666rcp6qw3h5dt85yxjbzbh5ckzfjo2-q22pb31zo Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Анимация градиентного спуска (контурная карта)
Мы можем заметить, что из приведенного выше рисунка, когда кривая достигает более крутой поверхности, она делает все большие и большие шаги к сходимости, представленной разреженными точками. Как только кривая достигает темно-синей плоской области, наклон в этом направлении становится мягким, что означает, что расстояние между последовательными контурами в темно-синей области будет меньше.
Как вы можете видеть из анимации, как только кривая достигает кластера голубых контуров, где расстояние между последовательными контурами меньше, требуется все больше и больше шагов к конвергенции.

Градиентный спуск на основе импульса

Из нашего обсуждения градиентного спуска становится ясно, что для перемещения по регионам с небольшим уклоном требуется много времени, поскольку уклон в этих регионах очень мал. Как мы можем преодолеть это?
77777rcp6qw3h5dt85yxjbzbh5ckzfjo2-9e2t431md Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Давайте рассмотрим ситуацию, когда вы идете в недавно открытый торговый центр в неизвестном районе. Пока вы пытались найти торговый центр, вы спрашивали несколько человек о местонахождении торгового центра, и все попросили вас пойти в одно и то же место.
Поскольку все указывают вам в одном направлении, вы будете двигаться все быстрее и быстрее в этом направлении с большей уверенностью. Теперь мы будем использовать ту же интуицию в градиентном спуске на основе импульса,
88888rcp6qw3h5dt85yxjbzbh5ckzfjo2-ii39731ng Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Импульс Г.Д.
В правило обновления градиентного спуска на основе Momentum мы также включили компонент истории v, в котором хранятся все предыдущие движения градиента до этого времени t.
99999rcp6qw3h5dt85yxjbzbh5ckzfjo2-z23em315k Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Экспоненциальный средневзвешенный
На каждом временном шаге или каждом обновлении вместо того, чтобы просто перемещаться по значению текущего градиента, как Vanilla GD. В Momentum GD мы движемся с экспоненциально убывающим кумулятивным средним из предыдущих градиентов и текущего градиента. Теперь давайте посмотрим, как Momentum GD будет работать на той же поверхности ошибки,
10000rcp6qw3h5dt85yxjbzbh5ckzfjo2-o83ka31t7 Демистификация различных вариантов алгоритма оптимизации градиентного спуска
GD-анимация на основе импульса
Из анимации видно, что градиентный спуск на основе Momentum движется быстрее, чем ванильный GD на плоской поверхности, потому что он использует не только текущее значение градиента для обновления параметров, но и историю значений градиентов до этой точки.
К тому времени, когда на плоской поверхности потребовалось от 5 до 6 шагов, его история уже выросла бы до некоторой степени, что позволило бы градиентному спуску совершать все большие и большие шаги на плоской поверхности.
Всегда ли быстро двигаться хорошо?
Чтобы проанализировать ограничения градиентного спуска на основе Momentum на другой поверхности ошибки, я взял другой набор игрушечных данных и использовал один сигмовидный нейрон, чтобы найти значение потерь при различных комбинациях  w  и  b, чтобы сгенерировать трехмерную поверхность потерь, которая имеет более узкие минимумы поверхность.
111rcp6qw3h5dt85yxjbzbh5ckzfjo2-tp3oc31ql Демистификация различных вариантов алгоритма оптимизации градиентного спуска
G-конвергенция на основе импульса
Градиентный спуск, основанный на импульсе, колеблется в и из минимумов, потому что к моменту достижения минимумов он накапливал бы больше истории, в результате чего все большие и большие шаги, очевидно, приводят к превышению цели. Несмотря на развороты, он все же сходится быстрее, чем ванильный градиентный спуск.

Нестеров Ускоренный градиентный спуск

Как мы можем избежать превышения минимумов?
В градиентном спуске на основе Momentum мы делаем одно движение в направлении истории градиента, а другое — в направлении текущего градиента, из-за этого двухступенчатого движения мы пересекаем минимумы. Вместо того, чтобы двигаться по два шага за раз, почему бы сначала не немного двигаться в направлении истории градиента, вычислить градиент в этой точке и обновить параметры.
12rcp6qw3h5dt85yxjbzbh5ckzfjo2-eu3t3314c Демистификация различных вариантов алгоритма оптимизации градиентного спуска
По сути, то, что мы делаем в Nesterov Accelerated Gradient Descent, — это то, что мы с нетерпением ждем, сможем ли мы приблизиться к минимумам или нет, прежде чем мы сделаем еще один шаг, основанный на текущем значении градиента, чтобы мы могли избежать проблемы перерегулирования.
13rcp6qw3h5dt85yxjbzbh5ckzfjo2-563z531hm Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Сравнение между NAG (красная кривая) и импульсом (черная кривая)
Мы можем видеть, что все колебания, производимые ускоренным градиентом Нестерова, намного меньше, чем колебания градиентного спуска на основе импульса. Взгляд в будущее помогает NAG скорректировать курс быстрее, чем Gradient Descent на основе Momentum. Следовательно, колебания меньше, и шансы на выход из долины минимумов также меньше.

Мини-пакетно-стохастический градиентный спуск

Должны ли мы использовать целые данные для вычисления градиентов?
Учтите, что у вас есть огромный набор данных с миллионами точек данных, если мы используем пакетный градиент, алгоритм выполнит миллион вычислений (вычислит производные для каждой из миллиона точек и накопит все эти производные), а затем внесет одно крошечное обновление в наши параметры.
Можем ли мы сделать что-то лучше?
Вместо того чтобы рассматривать все точки данных за один раз, мы разделим все данные на несколько подмножеств. Для каждого подмножества данных вычислите производные для каждой точки, присутствующей в подмножестве, и обновите параметры. Вместо того, чтобы вычислять производную для целых данных по функции потерь, мы приблизили ее к меньшему количеству точек или меньшему размеру партии.
Этот метод вычисления градиентов в партиях называется  Mini-Batch Gradient Descent . Если у нас есть миллион точек данных с размером пакета 10, у нас будет 100 000 пакетов, и мы бы сделали 100 000 обновлений параметров.
Если мы возьмем идею мини-спуска градиента до предела и посмотрим по одной точке за раз, вычислим производную и обновим параметры для каждой точки. Этот метод называется  стохастическим градиентным спуском.
14rcp6qw3h5dt85yxjbzbh5ckzfjo2-k040d31ut Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Стохастический градиент спуска сходимости
В Stochastic мы обновляем параметры для каждой точки, точки не работают согласованно. Каждая точка принимает жадное решение и обновляет параметры, наиболее подходящие для этой точки, что может быть в случае с остальными точками.
Мы можем уменьшить проблему колебаний путем рассмотрения подмножества данных или пакета данных и обновления параметров после расчета производных для каждой точки в этом пакете.
15rcp6qw3h5dt85yxjbzbh5ckzfjo2-i742s31wz Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Сравнение стохастика (синяя кривая) и мини-партии GD (красная кривая)
Мы можем видеть, что колебания уменьшились при мини-градиентном спуске, и колебания полностью содержатся в синей кривой. На практике мы выбираем размер пакета равным 16, 32 и 64.
Независимо от того, используем ли мы мини-пакет или стохастический градиентный спуск, стоит отметить, что мы аппроксимируем производные по функции потерь, мы не вычисляем истинное значение. производные функции потерь.
Количество обновлений (шагов), внесенных в параметры за одну эпоху,
  1. Пакетный градиентный спуск — 1
  2. Стохастический градиентный спуск — N (количество точек данных)
  3. Мини-градиентный спуск — N / B (B = размер партии)

AdaGrad

AdaGrad — градиентный спуск с адаптивной скоростью обучения
Основной мотивацией AdaGrad была идея скорости адаптивного обучения для различных функций в наборе данных, то есть вместо того, чтобы использовать одну и ту же скорость обучения для всех функций в наборе данных, нам может потребоваться разная скорость обучения для разных функций.
Зачем нам нужен уровень адаптивного обучения?
Рассмотрим набор данных, который имеет очень важную, но разреженную переменную, если эта переменная равна нулю в большинстве точек обучающих данных, производная, пропорциональная этой переменной, также будет равна нулю. Если производная равна нулю, то обновление веса будет равно нулю.
16rcp6qw3h5dt85yxjbzbh5ckzfjo2-ag45431oj Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Если наши параметры (веса) не движутся к минимумам, то модель не будет делать оптимальных прогнозов.
Чтобы помочь таким редким функциям, мы хотим убедиться, что всякий раз, когда значение этой функции не равно нулю, независимо от того, что является производной в этой точке, оно должно увеличиваться за счет большей скорости обучения.
17rcp6qw3h5dt85yxjbzbh5ckzfjo2-u84fh3100 Демистификация различных вариантов алгоритма оптимизации градиентного спуска
АдаГрад Интуиция
Если определенный параметр часто обновляется, это означает, что производная в большинстве случаев не равна нулю, для таких параметров мы хотим иметь меньшую скорость обучения в отличие от того, если у нас есть разреженный параметр, который будет выключен (ноль) в большинстве случаев это означает, что производная будет нулевой в большинстве случаев.
Для такой функции, когда эта функция включена (не ноль), мы хотим увеличить обновление градиента с более высокой скоростью обучения.
18rcp6qw3h5dt85yxjbzbh5ckzfjo2-kv4jl31u5 Демистификация различных вариантов алгоритма оптимизации градиентного спуска
В AdaGrad мы делим обучение с историей значения градиента до этой точки. Не разреженные функции будут иметь большое значение истории, потому что они будут получать частые обновления, разделив скорость обучения с большой историей, эффективная скорость обучения будет очень мала.
В случае редких особенностей значение истории градиента будет очень мало, что приведет к большой эффективной скорости обучения.
Учтите, что у нас есть данные с двумя функциями   (разреженная функция) и  b, что означает, что  w  подвергается меньшему количеству обновлений. Теперь мы сравним правило обновления AdaGrad с Vanilla GD (черная кривая), Momentum GD (красная), NAG (синяя) и AdaGrad (зеленая)
19rcp6qw3h5dt85yxjbzbh5ckzfjo2-d14o5315a Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Сравнение разных вариантов GD
Из вышеприведенного графика мы можем видеть, что AdaGrad делает большие шаги в направлении  w,  хотя это редкая особенность в отличие от других вариантов, потому что его значение градиента увеличивается за счет скорости обучения.
Недостатком AdaGrad является то, что скорость обучения снижается очень агрессивно с ростом знаменателя, что не очень хорошо для параметров, соответствующих плотным элементам. Когда  b  обновляется, снова и снова, знаменатель значительно увеличивается, и эффективная скорость обучения становится близкой к нулю, в результате AdaGrad больше не может двигаться в направлении  b  и застревает близко к конвергенции.

RMSProp

RMSProp — среднеквадратичное распространение
Чтобы не дать знаменателю быстро расти, почему бы не разрушить знаменатель и не предотвратить его быстрый рост?
RMSProp использует эту интуицию, чтобы предотвратить быстрый рост знаменателя для плотных переменных, чтобы эффективная скорость обучения не приближалась к нулю.
20rcp6qw3h5dt85yxjbzbh5ckzfjo2-h54pd31ri Демистификация различных вариантов алгоритма оптимизации градиентного спуска
RMSProp Уравнение
В RMSProp история градиентов рассчитывается с использованием экспоненциального затухающего среднего в отличие от суммы градиентов в AdaGrad, что помогает предотвратить быстрый рост знаменателя для плотных объектов.
21rcp6qw3h5dt85yxjbzbh5ckzfjo2-hs4rh31g3 Демистификация различных вариантов алгоритма оптимизации градиентного спуска
RMSProp Коричневая кривая рядом с AdaGrad Зеленая кривая
Поскольку знаменатель для плотных объектов ‘ b ‘ не гниет так агрессивно, как AdaGrad, RMSProp может двигаться в направлении  b, что в  конечном итоге приводит к сходимости.

Адам

Имя Адам получено из адаптивной оценки момента.
В градиентном спуске, основанном на Momentum, мы используем накопленную историю градиентов для более быстрого движения на мягких поверхностях, и мы увидели RMSProp, который также использует историю для затухания знаменателя и предотвращения его быстрого роста.
Эти алгоритмы используют историю по-разному. В Momentum GD мы используем историю, чтобы вычислить текущее обновление, тогда как в случае с RMSProp история использовалась для настройки скорости обучения (сокращение или повышение).
Адам объединяет эти две отдельные истории в один алгоритм.
22rcp6qw3h5dt85yxjbzbh5ckzfjo2-ku4ux3159 Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Адам поддерживает две истории: ‘m’ ‘, похожую на историю, используемую в Momentum GD, и’ vₜ ‘, похожую на историю, используемую в RMSProp. На практике Адам делает то, что известно как исправление смещения. Он использует следующие уравнения для «mₜ» и «vₜ»,
23rcp6qw3h5dt85yxjbzbh5ckzfjo2-oc4xh31hx Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Исправление смещения
Коррекция смещения гарантирует, что в начале обучения обновления не ведут себя странным образом. Ключевым моментом в Adam является то, что он сочетает в себе преимущества Momentum GD (ускорение движения в слабых регионах) и RMSProp GD (регулирование скорости обучения).
24rcp6qw3h5dt85yxjbzbh5ckzfjo2-a54yx31uj Демистификация различных вариантов алгоритма оптимизации градиентного спуска
Adam Optimizer (кривая голубого цвета)
Поскольку у Адама есть свойство Momentum GD, мы можем видеть, что он пересекает минимумы и возвращается, совершая несколько разворотов до схождения.

Резюме

В этой статье мы рассмотрели пакетный спуск с градиентом, необходимость разработки новых методов оптимизации, а затем кратко обсудили, как интерпретировать контурные графики.
После этого мы рассмотрели шесть различных методов оптимизации и три различных стратегии данных (пакетная, мини-пакетная и стохастическая) с интуитивным пониманием, которое помогает узнать, где использовать любой из этих алгоритмов.
На практике оптимизатор Adam с мини-пакетами размеров 32, 64 и 128 является выбором по умолчанию, по крайней мере, для всех задач классификации изображений, которые имеют дело с CNN и большой последовательностью для моделей последовательности.

Добавить комментарий

Войти с помощью: