Adam

Adam (Adaptive Moment Estimation) представляет собой один из наиболее популярных алгоритмов оптимизации для обучения нейронных сетей. Он сочетает преимущества методов Momentum и RMSProp, адаптивно подстраивая скорость обучения для каждого параметра сети на основе первых двух моментов градиентов: среднего и дисперсии.

В ConvNetJS Adam реализован в виде объекта adam, который можно использовать как оптимизатор при обучении нейросетей с помощью trainer.


Основные принципы работы

Adam поддерживает два ключевых параметра для каждого веса сети:

  1. m (first moment) – скользящее среднее градиентов (аналог импульса в Momentum).
  2. v (second moment) – скользящее среднее квадратов градиентов (аналог RMSProp).

На каждом шаге обновления весов вычисляются поправки для сглаживания и нормализации градиентов:

[ _t = , _t = ]

[ w_{t+1} = w_t - ]

где:

  • ( ) – шаг обучения,
  • ( _1 ) и ( _2 ) – коэффициенты экспоненциального сглаживания для моментов,
  • ( ) – маленькая константа для предотвращения деления на ноль.

Создание оптимизатора Adam в ConvNetJS

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:

  1. Вычисляется градиент потерь по каждому весу.

  2. Обновляются моменты:

    m = beta1 * m + (1 - beta1) * grad;
    v = beta2 * v + (1 - beta2) * grad * grad;
  3. Применяется bias-correction для первых шагов обучения:

    m_hat = m / (1 - Math.pow(beta1, t));
    v_hat = v / (1 - Math.pow(beta2, t));
  4. Производится шаг оптимизации:

    w += -learning_rate * m_hat / (Math.sqrt(v_hat) + epsilon);

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


Преимущества использования Adam

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

Особенности работы с ConvNetJS

  • Adam в ConvNetJS полностью интегрирован с trainer, нет необходимости вручную хранить состояния моментов.
  • Для больших сетей рекомендуется контролировать память, так как Adam хранит два дополнительных тензора (m и v) на каждый параметр.
  • В сочетании с L2-регуляризацией можно эффективно бороться с переобучением без изменения структуры сети.

Практическое использование

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 позволяет легко реализовать мощные нейронные сети с минимальной настройкой.