Обучение нейронной сети с использованием ConvNetJS организовано вокруг понятий эпохи, батча и итерации градиентного спуска. Каждая эпоха представляет собой полный проход по всем обучающим данным, во время которого происходит обновление весов сети в соответствии с выбранным методом оптимизации.
Эпоха в ConvNetJS разбивается на следующие этапы:
Подготовка данных Данные могут быть представлены
как массив объектов типа Vol (объекты объемного тензора),
где каждый Vol содержит входные значения сети. Перед
началом эпохи данные могут быть перемешаны с помощью встроенной функции
shuffle для предотвращения систематических ошибок при
обучении.
Итерация по батчам Для уменьшения вычислительной
нагрузки и стабилизации градиентов данные делятся на
батчи — небольшие группы примеров. Размер батча
задается параметром batch_size в объекте тренера
(Trainer). Каждый батч обрабатывается последовательно:
softmax, squared loss и
др.).Обновление весов 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 предоставляет несколько стандартных функций потерь:
SoftmaxLayer) —
применяется для многоклассовой классификации, вычисляет отрицательный
логарифм вероятности правильного класса.Каждая функция потерь автоматически интегрирована с механизмом
обратного распространения. В момент вызова trainer.train()
вычисляется градиент ошибки по каждому весу, который
затем применяется в шаге оптимизации.
Во время одной эпохи рекомендуется отслеживать несколько показателей:
loss — средняя ошибка по батчу;accuracy — доля правильных предсказаний;learning_rate — может динамически изменяться при
использовании schedule;Trainer абстрагирует детали
обновления весов и предоставляет интерфейс для обучения с минимальными
усилиями.Перемешивание данных.
Разделение на батчи.
Для каждого батча:
Эта последовательность обеспечивает постепенное приближение весов сети к оптимальным значениям и формирует основу для построения более сложных циклов обучения с несколькими эпохами.