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

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

Градиентный спуск - широко используемый алгоритм для оптимизации и наиболее распространенный способ оптимизации нейронных сетей. Общая идея градиентного спуска заключается в итеративном обновлении параметров, чтобы минимизировать функцию стоимости. Предположим, вы заблудились в горах в густом тумане; вы можете только чувствовать наклон земли под ногами. В этот момент вам нужно только как можно скорее добраться до дна долины, тогда хороший способ быстро добраться до дна долины - это спуститься с горы в направлении самого крутого склона. Именно это и делает Gradient Descent: он измеряет локальный градиент ошибки функция относительно вектора параметров θ, и она идет в направлении нисходящего градиента. Мы пытаемся сделать наш градиент нулевым, как только он становится равным нулю, мы достигли минимума!

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

Здесь альфа-символ - это скорость обучения. Это повлияет на скорость оптимизации нашей нейронной сети. Если у нас большая скорость обучения, мы достигнем минимума потерь быстрее, потому что мы делаем большие шаги, однако в результате мы можем не достичь идеального минимума, поскольку мы делаем большие шаги, и, следовательно, мы можем перескочить это. Меньшая скорость обучения решит эту проблему, но потребуется много шагов, чтобы потери нейронной сети снизились до приемлемого значения. Поэтому мы всегда стараемся выбрать наиболее оптимальное значение для нашей скорости обучения. Обычно безопасным значением является сохранение альфа в диапазоне от 0,1 до 0,001.

Поскольку наша цель - минимизировать функцию стоимости, чтобы найти оптимизированное значение для весов, мы выполняем несколько итераций с разный вес и рассчитайте стоимость, чтобы получить минимальную стоимость, как показано ниже:

У горы может быть два разных основания. Таким же образом мы можем получить локальный и глобальный минимум указывает на значение между стоимостью и весом.

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

Как мы можем избежать локальных минимумов и всегда пытаться получить оптимизированные веса на основе глобальных минимумов?

Итак, сначала давайте разберемся с различными типами градиентного спуска.

Существуют разные типы градиентных спусков.

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

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

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

Недостатки:

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

Пакетный градиентный спуск может сходиться к глобальному минимуму для выпуклых функций и к локальному минимуму для невыпуклых функций.

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

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

x + = - скорость_обучения * dx

Где x - параметр, dx - градиент, а скорость обучения постоянна.

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

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

Когда мы немного уменьшаем скорость обучения, сходимость SGD и BGD одинакова.

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

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

Отличие от SGD в том, что каждый цикл воздействует не на каждый образец, а на пакет из n образцов.

Значение настройки гиперпараметров: n обычно составляет 50 ~ 256.

Недостаток:

1. Нет никакой гарантии получения хорошей сходимости при использовании мини-пакетного градиентного спуска.

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

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

Импульс

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

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

Ускоренные градиенты Нестерова (NAG)

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

NAG почти всегда ускоряет обучение по сравнению с обычной оптимизацией Momentum.

Адаград

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

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

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

Встраивание слов в GloVe использует adagrad, где редкие слова требовали большего обновления, а частые слова требовали меньшего обновления. Нам не нужно было настраивать скорость обучения вручную в Adagrad.

  1. Это достигается за счет ограничения окна накопленного в прошлом градиента до некоторого фиксированного размера w. Текущее среднее значение в Adadelta зависит от предыдущего среднего и текущего градиента.
  2. В Adadelta нам не нужно устанавливать скорость обучения по умолчанию, поскольку мы берем отношение текущего среднего значения предыдущих временных шагов к текущему градиенту.

RMSProp

Полное название алгоритма RMSProp называется Root Mean Square Prop, который представляет собой алгоритм адаптивной оптимизации скорости обучения, предложенный Джеффом Хинтоном. Хотя AdaGrad замедляется слишком быстро и в конечном итоге никогда не сходится к глобальному оптимуму, алгоритм RMSProp исправляет это, накапливая только градиенты из самых последних итераций (в отличие от всех градиентов с начала обучения). Это достигается за счет использования экспоненциального затухания на первом этапе.

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

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

1. Скорость обучения настраивается автоматически в RMSProp, и он выбирает разную скорость обучения для каждого параметра.

2. RMSProp делит скорость обучения на среднее значение экспоненциального затухания квадратов градиентов.

Адам

Adam, который означает адаптивную оценку момента, объединяет идеи оптимизации Momentum и RMSProp: так же, как оптимизация Momentum, он отслеживает экспоненциально убывающее среднее прошлых градиентов, а также отслеживает экспоненциально убывающее среднее квадратов прошлых градиентов, точно так же, как RMSProp.

1. Adam можно рассматривать как комбинацию Adagrad и RMSprop, (Adagrad), которая хорошо работает с разреженными градиентами, и (RMSProp), которая хорошо работает в онлайн-режиме и без стационарных настроек соответственно.

2. Поскольку Adam является алгоритмом с адаптивной скоростью обучения (например, AdaGrad и RMSProp), он требует меньшей настройки гиперпараметра скорости обучения η, что делает его еще проще в использовании, чем Gradient Descent.

3. Адам вычислительно эффективен и очень мало требует памяти.

4. Оптимизатор Adam - один из самых популярных и известных алгоритмов оптимизации градиентного спуска.

Заключение

Как выбрать оптимизаторы?

  • Если данных мало, используйте самоприменимые методы, а именно Adagrad, Adadelta, RMSprop, Adam.
  • RMSprop, Adadelta, Adam во многих случаях имеют схожие эффекты.
  • Адам просто добавил коррекцию смещения и импульс на основе RMSprop,
  • Поскольку градиент становится разреженным, Адам будет работать лучше, чем RMSprop.

В целом, Адам - ​​лучший выбор.

  1. SGD используется во многих статьях без импульса и т. Д. Хотя SGD может достигать минимального значения, он занимает больше времени, чем другие алгоритмы, и может застрять в седловой точке.
  2. Если требуется более быстрая сходимость или обучаются более глубокие и сложные нейронные сети, необходим адаптивный алгоритм.