Процесс одной эпохи обучения

Обучение нейронной сети с использованием ConvNetJS организовано вокруг понятий эпохи, батча и итерации градиентного спуска. Каждая эпоха представляет собой полный проход по всем обучающим данным, во время которого происходит обновление весов сети в соответствии с выбранным методом оптимизации.


Структура эпохи

Эпоха в ConvNetJS разбивается на следующие этапы:

  1. Подготовка данных Данные могут быть представлены как массив объектов типа Vol (объекты объемного тензора), где каждый Vol содержит входные значения сети. Перед началом эпохи данные могут быть перемешаны с помощью встроенной функции shuffle для предотвращения систематических ошибок при обучении.

  2. Итерация по батчам Для уменьшения вычислительной нагрузки и стабилизации градиентов данные делятся на батчи — небольшие группы примеров. Размер батча задается параметром batch_size в объекте тренера (Trainer). Каждый батч обрабатывается последовательно:

    • Вычисляются выходные значения сети для каждого примера.
    • Рассчитывается ошибка (loss) с помощью выбранной функции потерь (softmax, squared loss и др.).
    • Выполняется обратное распространение ошибки (backpropagation), в ходе которого вычисляются градиенты всех весов.
  3. Обновление весов ConvNetJS поддерживает несколько алгоритмов обновления весов: SGD, AdaGrad, RMSProp и др. Алгоритм выбирается при создании объекта Trainer. Основные параметры:

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

Пример внутреннего цикла одной эпохи

for(var i=0;i<num_batches;i++) {
    var batch_loss = 0.0;
    for(var j=0;j<batch_size;j++) {
        var example = getNextExample(); // получение следующего примера
        trainer.train(example.x, example.y); // прямой и обратный проход
        batch_loss += trainer.loss;
    }
    console.log("Batch "+i+" loss: "+(batch_loss/batch_size));
}

В этом цикле каждая итерация по батчу:

  • вызывает метод train() тренера, который объединяет прямой проход сети, вычисление потерь и обратное распространение;
  • суммирует ошибки для последующего анализа.

Вычисление потерь

ConvNetJS предоставляет несколько стандартных функций потерь:

  • Softmax Loss (SoftmaxLayer) — применяется для многоклассовой классификации, вычисляет отрицательный логарифм вероятности правильного класса.
  • Squared Loss — используется для регрессии, вычисляет среднеквадратичную ошибку.
  • SVMLoss — для обучения с максимизацией разделяющей границы.

Каждая функция потерь автоматически интегрирована с механизмом обратного распространения. В момент вызова trainer.train() вычисляется градиент ошибки по каждому весу, который затем применяется в шаге оптимизации.


Мониторинг прогресса

Во время одной эпохи рекомендуется отслеживать несколько показателей:

  • loss — средняя ошибка по батчу;
  • accuracy — доля правильных предсказаний;
  • learning_rate — может динамически изменяться при использовании schedule;
  • визуализация градиентов и распределения весов для выявления проблем с затухающими или взрывающимися градиентами.

Особенности ConvNetJS

  • Объект Trainer абстрагирует детали обновления весов и предоставляет интерфейс для обучения с минимальными усилиями.
  • Поддержка mini-batch позволяет эффективно обучать сети даже на ограниченных ресурсах браузера.
  • Доступность слоев и функций потерь прямо в JS-коде облегчает прототипирование и эксперименты без компиляции.

Итоговая схема одной эпохи

  1. Перемешивание данных.

  2. Разделение на батчи.

  3. Для каждого батча:

    • прямой проход;
    • вычисление функции потерь;
    • обратное распространение ошибки;
    • обновление весов;
    • накопление и логирование статистики.

Эта последовательность обеспечивает постепенное приближение весов сети к оптимальным значениям и формирует основу для построения более сложных циклов обучения с несколькими эпохами.