Adam (Adaptive Moment Estimation) представляет собой один из наиболее популярных алгоритмов оптимизации для обучения нейронных сетей. Он сочетает преимущества методов Momentum и RMSProp, адаптивно подстраивая скорость обучения для каждого параметра сети на основе первых двух моментов градиентов: среднего и дисперсии.
В ConvNetJS Adam реализован в виде объекта
adam, который можно использовать как оптимизатор при
обучении нейросетей с помощью trainer.
Adam поддерживает два ключевых параметра для каждого веса сети:
На каждом шаге обновления весов вычисляются поправки для сглаживания и нормализации градиентов:
[ _t = , _t = ]
[ w_{t+1} = w_t - ]
где:
var trainer = new convnetjs.SGDTrainer(net, {
method: 'adam',
learning_rate: 0.001,
beta1: 0.9,
beta2: 0.999,
epsilon: 1e-8,
l2_decay: 0.0001
});
Ключевые параметры:
learning_rate – скорость обучения, обычно небольшое
значение 0.001–0.01.beta1 – коэффициент для первого момента, стандартное
значение 0.9.beta2 – коэффициент для второго момента, стандартное
значение 0.999.epsilon – предотвращает деление на ноль, рекомендуемое
значение 1e-8.l2_decay – коэффициент L2-регуляризации весов, помогает
предотвращать переобучение.Adam автоматически хранит состояния моментов m и
v для каждого параметра сети. При каждом вызове
train:
Вычисляется градиент потерь по каждому весу.
Обновляются моменты:
m = beta1 * m + (1 - beta1) * grad;
v = beta2 * v + (1 - beta2) * grad * grad;Применяется bias-correction для первых шагов обучения:
m_hat = m / (1 - Math.pow(beta1, t));
v_hat = v / (1 - Math.pow(beta2, t));Производится шаг оптимизации:
w += -learning_rate * m_hat / (Math.sqrt(v_hat) + epsilon);Это позволяет Adam адаптировать размер шага обучения для каждого веса индивидуально, ускоряя сходимость и улучшая стабильность.
trainer, нет
необходимости вручную хранить состояния моментов.m и v) на
каждый параметр.for(var i=0;i<1000;i++) {
var x = new convnetjs.Vol(input_data[i]);
var y = target_data[i];
var stats = trainer.train(x, y);
if(i % 100 === 0) {
console.log('iteration', i, 'loss', stats.loss);
}
}
trainer.train(x, y) автоматически обновляет веса с
использованием Adam.stats.loss позволяет отслеживать динамику
обучения.beta1, beta2 и
epsilon редко требуют изменения, но для специфических задач
с шумными градиентами их можно подбирать вручную.Adam является стандартом де-факто для большинства современных задач глубокого обучения и в ConvNetJS позволяет легко реализовать мощные нейронные сети с минимальной настройкой.