Обзор оптимизации Adagrad

Adagrad (алгоритм адаптивного градиента) предназначен для адаптивного масштабирования скорости обучения каждого параметра на основе исторической информации о градиенте. Он особенно полезен для разреженных данных и успешно используется в различных задачах НЛП и нейронных сетей.

Давайте воспользуемся аналогией с человеком, идущим по лабиринту, чтобы добраться до выхода (или самой низкой точки долины), чтобы сравнить SGD, Momentum и Adagrad.

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

SGD обновляет параметры исключительно на основе градиента текущей партии (или отдельного примера). Он может быть шумным, что приводит к частой смене направления и медленному сближению.

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

Momentum учитывает предыдущее направление обновления и объединяет его с текущим градиентом. Это придает оптимизатору некоторую «инерцию», позволяя ему преодолевать плато и избегать застревания в небольших канавах, подобно тому, как наш фигурист использует инерцию, чтобы скользить через небольшие препятствия.



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

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

Для SGD формула обновления веса была следующей:

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

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

В случае Адаграда уравнение принимает вид:

α_t^iадаптируемая скорость обучения — это деление глобальной скорости обучения (заданной вначале). ϵ — это небольшой сглаживающий член, предотвращающий деление на ноль (обычно устанавливается на небольшое значение, например 1×10−8).

Чтобы найти v_t,, мы просуммируем производную потерь по w. Поскольку мы возводим результат в квадрат, это будет большое число. Когда число станет большим, α_t^i станет еще меньше. Это означает, что процесс обновления весов будет медленно уменьшаться.

Реализация Кераса

tf.keras.optimizers.Adagrad(
    learning_rate=0.001,
    initial_accumulator_value=0.1,
    epsilon=1e-07,
    weight_decay=None,
    clipnorm=None,
    clipvalue=None,
    global_clipnorm=None,
    use_ema=False,
    ema_momentum=0.99,
    ema_overwrite_frequency=None,
    jit_compile=True,
    name="Adagrad",
    **kwargs
)
  • learning_rate — начальное значение скорости обучения. Скорость обучения определяет размер шага на каждой итерации при движении к минимуму функции потерь.
  • initial_accumulator_value — начальное значение аккумулятора. В Адаграде аккумулятор хранит сумму квадратов прошлых градиентов. Это значение устанавливает его отправную точку. Обычно он инициализируется небольшим положительным значением, чтобы гарантировать, что мы не будем делить на ноль на начальных шагах.
  • epsilon — небольшая константа, добавляемая к знаменателю, чтобы предотвратить деление на ноль при обновлении параметров. Это сглаживающий термин.
  • weight_decay добавляет штраф L2 (уменьшение веса) на веса. Регуляризация может помочь предотвратить переобучение.
  • clipnorm обеспечивает обрезку градиентов параметров модели, если их норма L2 превышает это значение. Это может предотвратить большие значения градиента (которые могут привести к нестабильности модели).
  • clipvalue обрезает градиенты параметров модели по этому указанному значению. Это означает, что значения градиента не могут превышать это число или опускаться ниже его отрицательного значения.
  • global_clipnorm используется для глобального обрезки градиентов по их норме L2 (т. е. с учетом всех градиентов вместе). Это еще один метод предотвращения больших значений градиента.
  • use_ema — это флаг, указывающий, следует ли использовать экспоненциальную скользящую среднюю (EMA) для параметров. EMA может стабилизировать скользящее среднее значений параметров с течением времени.
  • ema_momentum — импульс для EMA.
  • ema_overwrite_frequency определяет, как часто параметры должны перезаписываться их значением EMA.
  • jit_compile позволяет компилировать этап обновления оптимизатора с использованием компилятора XLA (ускоренной линейной алгебры) TensorFlow, что может ускорить вычисления.
  • name — это имя экземпляра оптимизатора.

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

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

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

Читать далее











Источники

https://insideaiml.com/blog/Optimizers-in-Machine-Learning-and-Deep-Learning.-1048

https://www.youtube.com/watch?v=GSmW59dM0-o

https://keras.io/api/optimizers/adagrad/

https://www.tensorflow.org/api_docs/python/tf/keras/optimizers