Стохастический градиентный спуск

Стохастический градиентный спуск (SGD, Stochastic Gradient Descent) является ключевым методом оптимизации нейронных сетей в библиотеке ConvNetJS. В отличие от классического градиентного спуска, который вычисляет градиенты по всей обучающей выборке, SGD обновляет параметры сети после обработки каждого отдельного примера или небольшой мини-партии (mini-batch). Такой подход позволяет ускорить обучение и избежать застревания в локальных минимумах функции потерь.


Основные компоненты SGD в ConvNetJS

1. Параметры оптимизатора

ConvNetJS предоставляет возможность тонко настраивать поведение SGD через объект Trainer. Основные параметры включают:

  • learning_rate – скорость обучения. Определяет величину шага в направлении отрицательного градиента. Слишком большое значение может привести к расходимости, слишком маленькое – к медленному обучению.
  • momentum – коэффициент импульса. Позволяет сглаживать обновления весов, учитывая предыдущее направление движения, что ускоряет сходимость и уменьшает колебания.
  • l2_decay – коэффициент L2-регуляризации. Используется для предотвращения переобучения, добавляя штраф за большие значения весов.
  • batch_size – размер мини-партии. В ConvNetJS можно использовать как отдельные примеры, так и небольшие группы для более стабильного обновления градиентов.

Пример инициализации тренера:

var trainer = new convnetjs.SGDTrainer(net, {
  learning_rate: 0.01,
  momentum: 0.9,
  batch_size: 20,
  l2_decay: 0.001
});

Алгоритм обновления весов

SGD в ConvNetJS работает по следующему принципу:

  1. Прямое распространение (Forward Pass) Каждое входное изображение или вектор признаков проходит через все слои сети, вычисляется предсказание и функция потерь.

  2. Обратное распространение (Backward Pass) Вычисляются градиенты функции потерь по весам и смещениям каждого слоя. ConvNetJS использует эффективные методы хранения градиентов, чтобы минимизировать нагрузку на память.

  3. Обновление весов Каждый параметр w обновляется по формуле:

    [ v = v - ( + l2_decay w)] [ w = w + v]

    Здесь v – это накопленный импульс для данного веса. Такой подход позволяет ускорить движение по длинным узким каньонам функции потерь и уменьшить вероятность застревания в локальных экстремумах.


Использование мини-партий

Mini-batch SGD сочетает преимущества стохастического и пакетного градиентного спуска. В ConvNetJS обновление весов можно выполнять после нескольких примеров, собранных в мини-партию. Это улучшает стабильность градиентов и снижает шум, свойственный чисто стохастическому подходу.

Пример обработки мини-партий:

var batchSize = 10;
for(var i = 0; i < data.length; i += batchSize) {
  var batch = data.slice(i, i + batchSize);
  for(var j = 0; j < batch.length; j++) {
    trainer.train(batch[j].x, batch[j].y);
  }
}

Адаптивные схемы изменения скорости обучения

ConvNetJS позволяет динамически менять learning_rate в процессе обучения. Часто применяются следующие подходы:

  • Линейное уменьшение: скорость обучения постепенно уменьшается с каждой эпохой.
  • Экспоненциальное уменьшение: learning_rate умножается на коэффициент меньше 1 после каждой эпохи.
  • Кастомные правила: реализуются через собственные функции обратного вызова на каждой итерации.

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


Практические советы

  • Использовать momentum в диапазоне 0.8–0.95 для ускорения сходимости на сложных архитектурах.
  • Подбирать learning_rate постепенно: начинать с 0.01–0.001 и корректировать в зависимости от колебаний функции потерь.
  • Минимизировать переобучение с помощью L2-регуляризации и ограничения размера мини-партии.
  • Проверять значения градиентов для обнаружения проблем с градиентным взрывом или затуханием.

Отслеживание процесса обучения

ConvNetJS предоставляет метрики для контроля эффективности SGD:

  • trainer.loss – текущая величина функции потерь.
  • trainer.iter – номер итерации обновления.
  • accuracy – можно вычислить отдельно на проверочной выборке для мониторинга качества предсказаний.

Графическое отображение потерь на каждой итерации позволяет визуально отслеживать стабилизацию сети.


Стохастический градиентный спуск в ConvNetJS представляет собой гибкий инструмент, позволяющий эффективно оптимизировать нейронные сети любой архитектуры, от простых многослойных перцептронов до глубоких сверточных сетей. Точное управление параметрами learning_rate, momentum и l2_decay обеспечивает стабильное и быстрое обучение при минимальных вычислительных затратах.