Adagrad

Adagrad (Adaptive Gradient Algorithm) представляет собой адаптивный метод оптимизации, который корректирует скорость обучения каждого параметра модели на основе исторической информации о градиентах. В библиотеке ConvNetJS он реализован как один из встроенных оптимизаторов, позволяя эффективно обучать нейронные сети с различными архитектурами без ручного подбора коэффициента обучения для каждой весовой матрицы.

Принцип работы

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

Формула обновления весов:

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

где:

  • (_t) — текущее значение параметра;
  • () — базовая скорость обучения;
  • (g_t) — градиент функции потерь по параметру на шаге (t);
  • (G_t = _{i=1}^{t} g_i^2) — сумма квадратов градиентов за все предыдущие шаги;
  • () — малое число для предотвращения деления на ноль.

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

Использование в ConvNetJS

В ConvNetJS оптимизатор Adagrad подключается через объект Trainer. Для создания тренера с Adagrad используется следующая конструкция:

var trainer = new convnetjs.Trainer(net, {
    method: 'adagrad',
    learning_rate: 0.01,
    l2_decay: 0.001
});

Ключевые параметры:

  • learning_rate — базовая скорость обучения;
  • l2_decay — коэффициент L2-регуляризации;
  • batch_size — размер мини-батча для стохастического градиентного спуска;
  • epsilon — внутренний параметр Adagrad, по умолчанию 1e-8.

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

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

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

Ограничения и нюансы

  • Затухающая скорость обучения: со временем сумма квадратов градиентов (G_t) только растет, что приводит к постепенному уменьшению эффективного шага обучения. В долгих тренировках это может замедлять сходимость.
  • Не оптимально для всех задач: на некоторых задачах глубокого обучения методы вроде RMSProp или Adam показывают лучшие результаты, поскольку они корректируют снижение шага обучения динамически, избегая чрезмерного затухания.

Пример применения

var layer_defs = [];
layer_defs.push({type:'input', out_sx:28, out_sy:28, out_depth:1});
layer_defs.push({type:'conv', sx:5, filters:8, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, stride:2});
layer_defs.push({type:'softmax', num_classes:10});

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

var trainer = new convnetjs.Trainer(net, {
    method: 'adagrad',
    learning_rate: 0.01,
    l2_decay: 0.001
});

for(var i=0;i<1000;i++){
    var x = getNextTrainingSample(); // возвращает массив 28*28
    var stats = trainer.train(x, correct_label);
}

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

Настройка гиперпараметров

  • learning_rate обычно выбирается в диапазоне (0.01 - 0.1);
  • l2_decay помогает бороться с переобучением, особенно в глубоких сетях;
  • batch_size влияет на шум градиента: меньшие батчи увеличивают шум и могут улучшать обобщение, большие — ускоряют обучение.

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