ConvNetJS — это чисто JavaScript-библиотека для построения и обучения
нейронных сетей, включая сверточные (Convolutional) и полносвязные
(Fully Connected) слои. Она позволяет реализовать модели машинного
обучения прямо в браузере без необходимости серверной поддержки.
Основной объект для работы с сетью — ConvNetJS.Net, который
формируется путем последовательного добавления слоев через массив
layers.
Слои могут быть следующих типов:
fc (Fully Connected Layer) —
полносвязный слой, принимает входной вектор и формирует выходной через
линейное преобразование и функцию активации.softmax — слой для многоклассовой
классификации, преобразующий выходные значения в вероятности через
функцию Softmax.regression — слой для задач
регрессии.conv и pool — сверточные
и пуллинговые слои для обработки изображений (используются редко в
задачах текстовой классификации, но могут применяться для представлений
текста в виде векторов).Конфигурация слоя определяется параметрами: num_neurons,
activation, filter_size, stride,
pad и другими в зависимости от типа слоя.
Ключевой момент при работе с ConvNetJS для классификации текста — векторизация текста. Текстовые данные не могут напрямую подаваться на вход сети, поэтому применяются методы:
После векторизации создается входной слой
(input), размер которого соответствует длине
векторного представления текста.
Пример структуры сети для задачи классификации документов на несколько категорий:
var layers = [];
layers.push({type:'input', out_sx:1, out_sy:1, out_depth:VOCAB_SIZE});
layers.push({type:'fc', num_neurons:100, activation:'relu'});
layers.push({type:'fc', num_neurons:50, activation:'relu'});
layers.push({type:'softmax', num_classes:NUM_CLASSES});
var net = new convnetjs.Net();
net.makeLayers(layers);
Разбор структуры:
input — вектор длиной VOCAB_SIZE,
представляющий текст.softmax — конечный слой, возвращающий вероятности
принадлежности к классам.ConvNetJS использует объект Trainer для обучения модели.
В настройках задаются тип градиентного спуска, скорость обучения и
параметры регуляризации:
var trainer = new convnetjs.Trainer(net, {
method: 'adadelta',
batch_size: 20,
l2_decay: 0.001
});
Объяснение параметров:
method — алгоритм оптимизации (sgd,
adadelta, adam).batch_size — количество примеров на итерацию.l2_decay — коэффициент L2-регуляризации для
предотвращения переобучения.Обучение выполняется вызовом
trainer.train(input_vector, target_class), где
input_vector — входной вектор текста, а
target_class — целевой класс в виде индекса.
Для работы с ConvNetJS необходим массив объектов
Vol, где Vol — это структура,
содержащая входные данные сети.
var x = new convnetjs.Vol(input_vector);
trainer.train(x, target_class);
Vol хранит не только значения входного вектора, но и
градиенты, что необходимо для обратного распространения ошибки.
Для получения предсказания используется метод
net.forward():
var x = new convnetjs.Vol(input_vector);
var probabilities = net.forward(x);
var predicted_class = probabilities.w.indexOf(Math.max(...probabilities.w));
probabilities.w — массив вероятностей по каждому
классу.Math.max(...probabilities.w) позволяет выбрать наиболее
вероятный класс.Для оценки точности можно подсчитывать долю верно классифицированных примеров на тестовой выборке:
var correct = 0;
for(var i=0;i<test_data.length;i++){
var x = new convnetjs.Vol(test_data[i].vector);
var pred = net.forward(x);
var predicted_class = pred.w.indexOf(Math.max(...pred.w));
if(predicted_class === test_data[i].label) correct++;
}
var accuracy = correct / test_data.length;
ConvNetJS поддерживает следующие методы регуляризации:
l2_decay.layers.push({type:'fc', num_neurons:100, activation:'relu', dropout:0.5});
Dropout уменьшает зависимость сети от отдельных признаков и улучшает обобщающую способность модели на новых текстах.
ConvNetJS позволяет выполнять обучение по частям, что важно для больших текстовых корпусов:
for(var i=0;i<dataset.length;i++){
var x = new convnetjs.Vol(dataset[i].vector);
trainer.train(x, dataset[i].label);
}
Можно хранить состояние сети в браузере и постепенно добавлять новые примеры, не перезапуская обучение с нуля.
Классификация текста в ConvNetJS строится вокруг следующих ключевых компонентов:
Такая архитектура позволяет строить компактные, эффективные модели текстовой классификации, работающие полностью в браузере на JavaScript.