Обзор

Глубокое обучение — это подполе машинного обучения, которое используется для выполнения сложных задач, таких как распознавание речи, классификация текста и т. д. Модель глубокого обучения состоит из функции активации, ввода, вывода, скрытых слоев, функции потерь и т. д. Любая модель глубокого обучения пытается обобщить данные с помощью алгоритма и пытается сделать прогнозы на невидимых данных. Нам нужен алгоритм, который сопоставляет примеры входных данных с примерами выходных данных и алгоритм оптимизации. Алгоритм оптимизации находит значения параметров (весов), которые минимизируют ошибку при отображении входных данных на выходные. Эти алгоритмы оптимизации или оптимизаторы сильно влияют на точность модели глубокого обучения. Они также влияют на скорость обучения модели. Но прежде всего возникает вопрос, что такое оптимизатор на самом деле?

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

Вы можете использовать различные оптимизаторы, чтобы изменить свои веса и скорость обучения. Однако выбор лучшего оптимизатора зависит от приложения. Как новичку, одна злая мысль, которая приходит в голову, заключается в том, что мы пробуем все возможности и выбираем ту, которая показывает лучшие результаты. Сначала это может не быть проблемой, но при работе с сотнями гигабайт данных даже одна эпоха может занять значительное время. Так что случайный выбор алгоритма — это не что иное, как азартная игра с вашим драгоценным временем, что вы рано или поздно поймете в своем путешествии.

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

В этом руководстве мы изучим следующие оптимизаторы и рассмотрим плюсы и минусы каждого алгоритма. Так что в конце статьи вы сможете сравнить различные оптимизаторы и процедуру, на которой они основаны.

  1. Градиентный спуск
  2. Стохастический градиентный спуск
  3. Пакетный градиентный спуск
  4. Мини-пакетный градиентный спуск
  5. Стохастический градиентный спуск с импульсом
  6. Адаград
  7. RMSProp
  8. АдаДельта
  9. Адам

Прежде чем продолжить, есть несколько терминов, с которыми вы должны быть знакомы.

Эпоха — количество запусков алгоритма на всем наборе обучающих данных.

Образец — отдельная строка набора данных.

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

Скорость обучения — это параметр, который предоставляет модели шкалу того, сколько весов модели следует обновить.

Функция стоимости/функция потерь — функция стоимости используется для расчета стоимости, которая представляет собой разницу между прогнозируемым значением и фактическим значением.

Weights/ Bias — обучаемые параметры в модели, которая управляет сигналом между двумя нейронами.

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

"Градиентный спуск – это итерационный алгоритм, который начинается со случайной точки функции и движется вниз по наклону пошагово, пока не достигнет нижней точки этой функции".

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

Приведенное выше уравнение означает, как рассчитывается градиент. Здесь альфа — это размер шага, который показывает, насколько далеко нужно двигаться против каждого градиента с каждой итерацией.

Как двигаться вниз по шагам?

Это суть алгоритма. Общая идея состоит в том, чтобы начать со случайной точки (в нашем примере с параболой начните со случайного «x») и найти способ обновлять эту точку с каждой итерацией, чтобы мы спускались по склону.

Шаги алгоритма

  1. Найдите наклон целевой функции относительно каждого параметра/функции. Другими словами, вычислите градиент функции.
  2. Выберите случайное начальное значение для параметров. (Чтобы пояснить, в примере с параболой дифференцируйте «y» по отношению к «x». Если бы у нас было больше признаков, таких как x1, x2 и т. д., мы берем частную производную от «y» по отношению к каждому из признаков.)
  3. Обновите функцию градиента, вставив значения параметров.
  4. Рассчитайте размер шага для каждой функции как размер шага = градиент * скорость обучения.
  5. Рассчитайте новые параметры как: новые параметры = старые параметры - размер шага
  6. Повторяйте шаги с 3 по 5, пока градиент не станет почти нулевым.

Упомянутая выше «скорость обучения» — гибкий параметр, сильно влияющий на сходимость алгоритма. Более высокие скорости обучения заставляют алгоритм делать огромные шаги вниз по склону, и он может перепрыгнуть через точку минимума, тем самым пропустив ее. Таким образом, всегда полезно придерживаться низкой скорости обучения, например 0,01. Также можно математически показать, что алгоритм градиентного спуска делает большие шаги вниз по склону, если начальная точка находится высоко вверху, и делает маленькие шаги по мере приближения к месту назначения, чтобы быть осторожным, чтобы не пропустить его, а также быть достаточно быстрым.

2. Стохастический градиентный спуск

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

Процедура сначала выбирает начальные параметры w и скорость обучения n. Затем случайным образом перемешивайте данные на каждой итерации, чтобы достичь приблизительного минимума.

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

3. Пакетный градиентный спуск

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

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

4. Мини-пакетный градиентный спуск

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

Мы не используем все наборы данных сразу и не используем один пример за раз. Мы используем пакет из фиксированного количества обучающих примеров, который меньше фактического набора данных, и называем его мини-пакетом. Это помогает нам реализовать преимущества обоих предыдущих вариантов, которые мы видели. Из-за этого мини-пакетный градиентный спуск идеален и обеспечивает хороший баланс между скоростью и точностью. Как и в случае с SGD, средняя стоимость за эпохи в мини-пакетном градиентном спуске колеблется, потому что мы усредняем небольшое количество примеров за раз.

5. Стохастический градиентный спуск с импульсом

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

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

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

6. Адаптивный градиентный спуск (AdaGrad)

Алгоритм адаптивного градиентного спуска немного отличается от других алгоритмов градиентного спуска. Это связано с тем, что он использует разные скорости обучения для каждой итерации. Изменение скорости обучения зависит от разницы параметров во время обучения. Чем больше параметров изменяются, тем меньше меняется скорость обучения. Эта модификация очень полезна, потому что наборы данных реального мира содержат как разреженные, так и плотные функции. Поэтому несправедливо иметь одинаковое значение скорости обучения для всех функций. Алгоритм Adagrad использует приведенную ниже формулу для обновления весов. Здесь альфа (t) обозначает разные скорости обучения на каждой итерации, n — константа, а E — небольшое положительное значение, чтобы избежать деления на 0.

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

Одним из недостатков оптимизатора AdaGrad является то, что он агрессивно и монотонно снижает скорость обучения. Может быть момент, когда скорость обучения становится чрезвычайно низкой. Это связано с тем, что квадраты градиентов в знаменателе продолжают накапливаться, и, таким образом, часть знаменателя продолжает увеличиваться. Из-за небольшой скорости обучения модель в конечном итоге становится неспособной получить больше знаний, и, следовательно, точность модели ставится под угрозу.

7. RMSProp

Алгоритм в основном фокусируется на ускорении процесса оптимизации за счет уменьшения количества вычислений функции для достижения локальных минимумов. Алгоритм сохраняет скользящее среднее квадратов градиентов для каждого веса и делит градиент на квадратный корень из среднего квадрата.

где гамма - фактор забывания. Веса обновляются по приведенной ниже формуле

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

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

8. АдаДельта

AdaDelta можно рассматривать как более надежную версию оптимизатора AdaGrad. Он основан на адаптивном обучении и предназначен для устранения существенных недостатков оптимизатора опор AdaGrad и RMS. Основная проблема с двумя вышеперечисленными оптимизаторами заключается в том, что начальную скорость обучения необходимо задавать вручную. Еще одна проблема — падающая скорость обучения, которая в какой-то момент становится бесконечно малой. Из-за чего спустя определенное количество итераций модель уже не может усвоить новые знания.

Чтобы справиться с этими проблемами, AdaDelta использует две переменные состояния для хранения среднего значения градиента второго момента и среднего значения второго момента изменения параметров в модели.

Здесь St и дельта Xt обозначают переменные состояния, g’t обозначает перемасштабированный градиент, дельта Xt-1 обозначает перемасштабированные квадраты градиентов, а эпсилон представляет небольшое положительное целое число для обработки деления на 0.

9. Адам

Имя Адам происходит от адаптивной оценки момента. Этот алгоритм оптимизации является дальнейшим расширением стохастического градиентного спуска для обновления весов сети во время обучения. В отличие от поддержания единой скорости обучения посредством обучения в SGD, оптимизатор Adam обновляет скорость обучения для каждого веса сети индивидуально. Создатели алгоритма оптимизации Адама знают о преимуществах алгоритмов AdaGrad и RMSProp, которые также являются расширениями алгоритмов стохастического градиентного спуска. Следовательно, оптимизаторы Adam наследуют функции алгоритмов поддержки Adagrad и RMS. В Адаме вместо адаптации скорости обучения на основе первого момента (среднего), как в RMS Prop, он также использует второй момент градиентов. Мы имеем в виду нецентрированную дисперсию вторым моментом градиентов (среднее значение не вычитаем).

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

Приведенная выше формула представляет собой работу оптимизатора Адама. Здесь B1 и B2 представляют собой скорость затухания среднего значения градиентов.

Если оптимизатор adam использует хорошие свойства всех алгоритмов и является лучшим доступным оптимизатором, то почему бы вам не использовать Adam в каждом приложении? И зачем было углубляться в изучение других алгоритмов? Это потому, что даже у Адама есть недостатки. Он имеет тенденцию сосредотачиваться на более быстром времени вычислений, тогда как алгоритмы, такие как стохастический градиентный спуск, сосредотачиваются на точках данных. Вот почему такие алгоритмы, как SGD, лучше обобщают данные за счет низкой скорости вычислений. Таким образом, алгоритмы оптимизации могут быть выбраны соответственно в зависимости от требований и типа данных.

Приведенные выше визуализации создают лучшую картину и помогают сравнивать результаты различных алгоритмов оптимизации.

Заключение

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

SGD — это очень простой алгоритм, и сейчас он почти не используется в приложениях из-за низкой скорости вычислений. Еще одна проблема с этим алгоритмом — постоянная скорость обучения для каждой эпохи. Кроме того, он не очень хорошо справляется с седловыми точками. AdaGrad работает лучше, чем стохастический градиентный спуск, как правило, из-за частых обновлений скорости обучения. Лучше всего использовать его для работы с разреженными данными. RMSProp показывает результаты, аналогичные алгоритму градиентного спуска с импульсом, но отличается способом вычисления градиентов. Наконец, оптимизатор Adam унаследовал хорошие черты RMSProp и других алгоритмов. Результаты оптимизатора Адама, как правило, лучше, чем у любого другого алгоритма оптимизации, имеют более быстрое время вычислений и требуют меньше параметров для настройки. Из-за всего этого Адам рекомендуется в качестве оптимизатора по умолчанию для большинства приложений. Выбор оптимизатора Adam для вашего приложения может дать вам наилучшую вероятность получения наилучших результатов.

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

Надеюсь, вам понравилось читать эту статью.

Спасибо, и продолжайте учиться!