Adagrad (Adaptive Gradient Algorithm) представляет собой адаптивный метод оптимизации, который корректирует скорость обучения каждого параметра модели на основе исторической информации о градиентах. В библиотеке ConvNetJS он реализован как один из встроенных оптимизаторов, позволяя эффективно обучать нейронные сети с различными архитектурами без ручного подбора коэффициента обучения для каждой весовой матрицы.
Основная идея Adagrad заключается в том, чтобы масштабировать градиенты каждого параметра пропорционально сумме квадратов прошлых градиентов. Это позволяет автоматически уменьшать шаг обучения для часто обновляемых параметров и увеличивать для редких.
Формула обновления весов:
[ _{t+1} = _t - g_t]
где:
Этот механизм обеспечивает динамическую адаптацию шага обучения, что особенно полезно при работе с редкими признаками или разреженными данными.
В 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 не требует сложной настройки скорости обучения для каждой весовой матрицы, что особенно удобно при глубоких сверточных сетях.
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 обеспечивает баланс между простотой реализации и эффективностью адаптивного градиентного спуска, особенно на задачах с высокоразреженными признаками или нестабильными масштабами входных данных.