Классификация текста

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 для классификации текста — векторизация текста. Текстовые данные не могут напрямую подаваться на вход сети, поэтому применяются методы:

  1. Bag of Words (BoW) Каждое слово преобразуется в бинарный вектор фиксированной длины, где позиции соответствуют словарю, а значение 1 означает присутствие слова в документе.
  2. TF-IDF (Term Frequency–Inverse Document Frequency) Усиливает влияние редких, но значимых слов и снижает вес часто встречающихся. Преобразование текста в TF-IDF вектор позволяет лучше различать смысловые отличия между документами.
  3. Word Embeddings Слова кодируются плотными векторами фиксированной размерности (например, с помощью word2vec или GloVe). ConvNetJS поддерживает работу с любыми векторами, поэтому embedding можно подать как входной массив.

После векторизации создается входной слой (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, представляющий текст.
  • Два полносвязных слоя с функцией активации ReLU для нелинейной обработки признаков.
  • 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-регуляризация через l2_decay.
  • Dropout в полносвязных слоях для случайного отключения нейронов во время обучения:
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);
}

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


Особенности работы с текстовыми данными

  • Длина входного вектора должна быть постоянной, поэтому тексты приводятся к фиксированному размеру словаря или embedding.
  • Для длинных документов полезно применять усреднение векторов слов или n-граммное представление.
  • Предобученные embeddings позволяют ускорить обучение и повысить точность, особенно при ограниченном объеме обучающих данных.

Выводы по архитектуре сети для текста

Классификация текста в ConvNetJS строится вокруг следующих ключевых компонентов:

  1. Векторизация текста (BoW, TF-IDF, embeddings).
  2. Формирование сети с полносвязными слоями и Softmax на выходе.
  3. Настройка Trainer с оптимизацией и регуляризацией.
  4. Предсказание и оценка точности на тестовой выборке.
  5. Применение Dropout и L2 для предотвращения переобучения.

Такая архитектура позволяет строить компактные, эффективные модели текстовой классификации, работающие полностью в браузере на JavaScript.