Adadelta

Adadelta — это адаптивный метод градиентного спуска, разработанный для улучшения сходимости нейронных сетей без необходимости ручного подбора скорости обучения. В библиотеке ConvNetJS он реализован как один из оптимизаторов для тренировки нейронных сетей.


Основная идея Adadelta

Метод Adadelta основан на двух ключевых принципах:

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

  2. Использование экспоненциального скользящего среднего квадратов градиентов Вместо накопления всех прошлых градиентов (как в Adagrad), Adadelta использует скользящее среднее квадратов градиентов с коэффициентом затухания, что предотвращает слишком маленькие шаги обучения на поздних этапах тренировки.


Формулы обновления параметров

Для параметра ( ) с градиентом ( g ) в шаге ( t ):

  1. Вычисляется скользящее среднее квадратов градиентов:

[ E[g^2]t = E[g^2]{t-1} + (1 - ) g_t^2]

где ( ) — коэффициент затухания (обычно около 0.95), ( E[g^2]_t ) — экспоненциальное скользящее среднее квадратов градиентов.

  1. Вычисляется адаптивный шаг:

[ _t = - g_t]

где ( E[^2]_{t-1} ) — скользящее среднее квадратов предыдущих обновлений, а ( ) — малое число для численной стабильности (обычно ( 1e-6 )).

  1. Обновление параметра:

[ _{t+1} = _t + _t]


Реализация в ConvNetJS

В ConvNetJS оптимизатор Adadelta создается через конструктор adadeltaSolver:

var trainer = new convnetjs.SGDTrainer(net, {
    method: 'adadelta',
    rho: 0.95,       // коэффициент затухания
    epsilon: 1e-6,   // числовая стабилизация
    batch_size: 1    // размер мини-батча
});
  • method: 'adadelta' — указывает использование Adadelta.
  • rho и epsilon соответствуют формулам обновления.
  • batch_size влияет на частоту обновлений весов.

После создания trainer применяется для обновления весов сети:

trainer.train(x, y);

где x — входной вектор или тензор, а y — целевое значение (метка или вектор меток).


Преимущества Adadelta

  • Автоматическая регулировка шага обучения: Не требуется задавать фиксированное значение learning rate.
  • Стабильная сходимость: Экспоненциальное скользящее среднее предотвращает исчезновение градиентов или слишком резкие изменения весов.
  • Подходит для глубоких сетей: Эффективно работает даже при больших сетевых архитектурах с сотнями слоев и большим количеством параметров.

Отличия от других оптимизаторов

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

Практические рекомендации

  • Подбор rho: Значение 0.95–0.99 обычно обеспечивает стабильную работу. Меньшее значение делает обновления более реактивными, но менее гладкими.
  • Использование epsilon: Малое значение предотвращает деление на ноль, его менять обычно не требуется.
  • Совместимость с мини-батчами: Adadelta стабильно работает даже с маленькими батчами, что удобно для онлайн-обучения.

Визуализация поведения

При обучении сети с Adadelta часто наблюдается:

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

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