ConvNetJS — это библиотека для глубокого обучения на JavaScript, которая позволяет создавать, обучать и тестировать нейронные сети прямо в браузере или на Node.js без необходимости в сторонних зависимостях. Основная цель библиотеки — предоставить простые и эффективные инструменты для работы с многослойными перцептронами (MLP) и сверточными нейронными сетями (CNN).
Сети в ConvNetJS строятся с помощью объекта
Net, который представляет собой последовательность
слоев (Layer). Каждый слой определяет определённую функцию
преобразования данных:
InputLayer — слой входных данных,
задающий размерность входного вектора или изображения.FullyConnectedLayer — полносвязный
слой, где каждый нейрон связан со всеми нейронами предыдущего слоя.ConvLayer — сверточный слой,
выполняющий фильтрацию входного изображения с помощью наборов
фильтров.PoolLayer — слой подвыборки (пулинга),
уменьшающий размерность признаков и повышающий устойчивость к
смещениям.SoftmaxLayer — слой для классификации,
преобразующий выходы сети в вероятности.Каждый слой имеет параметры, определяющие количество нейронов, размер
фильтров, шаги (stride), функцию активации, а также методы прямого и
обратного распространения (forward и
backward).
Объект Trainer отвечает за процесс
обучения сети. Он инкапсулирует алгоритм оптимизации и вычисление
градиентов. Основные параметры:
method — оптимизатор
(sgd, adagrad, adam).learning_rate — скорость
обучения.momentum — моментум для ускорения
сходимости в стохастическом градиентном спуске.l2_decay — коэффициент регуляризации
для предотвращения переобучения.Процесс обучения включает три шага:
forward) —
вычисление выходов сети по входным данным.backward) —
обновление весов сети с использованием градиентов.ConvNetJS работает с объектами Vol,
представляющими многомерные массивы данных. Vol может быть
одномерным (для векторов признаков) или трёхмерным (для изображений с
каналами). Каждый Vol хранит:
w — массив значений нейронов.dw — массив градиентов для обновления
весов.sx, sy,
depth — размеры объёма по ширине, высоте и
глубине.Манипулирование Vol позволяет легко преобразовывать
данные для подачи на вход сверточной или полносвязной сети, а также
выполнять батчевое обучение.
Deep Q-Networks используют нейронную сеть для аппроксимации функции Q(s, a), которая оценивает качество действий в конкретном состоянии. В ConvNetJS реализация DQN сводится к построению MLP или CNN, где:
state).Прямое распространение: сеть вычисляет Q-значения текущего состояния:
let Q_values = net.forward(state_vol);
Обновление весов: используется цель из уравнения Беллмана:
[ Q_{}(s,a) = r + _a Q(s’, a)]
Где:
r — награда за действие.γ — коэффициент дисконтирования.s' — следующее состояние.Затем создается вектор ошибок, где градиент ненулевой только для выбранного действия:
let grad = new Vol(Q_values.sx, Q_values.sy, Q_values.depth, 0);
grad.w[action_index] = Q_target - Q_values.w[action_index];
net.backward(grad);
trainer.step(); // обновление весов
Replay Buffer хранит историю опыта агента в виде
(s, a, r, s'). Это позволяет:
Обучение проходит итерационно: выбирается случайный мини-батч, вычисляются целевые Q-значения, затем сеть обновляется методом стохастического градиентного спуска.
let net = new convnetjs.Net();
net.addLayer({ type: 'input', sx: 4, sy: 1, depth: 1 }); // состояние 4 параметра
net.addLayer({ type: 'fc', num_neurons: 64, activation: 'relu' });
net.addLayer({ type: 'fc', num_neurons: 64, activation: 'relu' });
net.addLayer({ type: 'regression', num_neurons: num_actions });
let trainer = new convnetjs.SGDTrainer(net, {
learning_rate: 0.001,
momentum: 0.9,
batch_size: 32,
l2_decay: 0.0001
});
Такой подход позволяет строить агента DQN, который обучается на входных состояниях среды, предсказывает Q-значения для действий и корректирует веса сети с учётом наград.
γ в диапазоне
0.9–0.99 для балансирования краткосрочных и долгосрочных наград.Вся архитектура DQN в ConvNetJS строится на принципах прямого и
обратного распространения, управляемых объектами Net и
Trainer, что позволяет гибко экспериментировать с
алгоритмами обучения и структурой сети.