SVM classifier

ConvNetJS — это библиотека на JavaScript для построения и обучения нейронных сетей, включая сверточные сети и многослойные перцептроны. Помимо нейросетей, библиотека предоставляет инструменты для обучения классификаторов, таких как SVM (Support Vector Machine). SVM используется для разделения данных на классы с помощью оптимальной гиперплоскости.


Представление данных

Для использования SVM в ConvNetJS необходимо подготовить данные в виде объектов Vol (структура, содержащая вектор признаков):

let x = new convnetjs.Vol([feature1, feature2, feature3]);
let y = classLabel; // Целевой класс

Каждый экземпляр данных передается в обучающий алгоритм в виде пары (x, y).


Инициализация SVM

ConvNetJS реализует линейный SVM. Для его создания используется объект convnetjs.SVM с возможностью указания гиперпараметров:

let svm = new convnetjs.SVM({
    l2: 0.01,        // Коэффициент регуляризации L2
    learning_rate: 0.01,  // Скорость обучения
    batch_size: 10   // Размер пакета для стохастического градиентного спуска
});

Ключевые параметры:

  • l2: штраф за большие веса модели, предотвращает переобучение.
  • learning_rate: регулирует шаг градиентного спуска.
  • batch_size: количество объектов, используемых в одном обновлении весов.

Обучение SVM

Процесс обучения реализуется методом train, который принимает массив объектов Vol и соответствующих им меток классов:

for (let i = 0; i < trainingData.length; i++) {
    svm.train(trainingData[i].x, trainingData[i].y);
}

Каждое обновление веса направлено на минимизацию функции потерь SVM:

[ L = ||w||^2 + C (0, 1 - y_i (w x_i))]

где:

  • ( w ) — вектор весов,
  • ( x_i ) — входной вектор признаков,
  • ( y_i ) — метка класса (+1 или −1),
  • ( C ) — коэффициент регуляризации (обратный к l2).

ConvNetJS использует стохастический градиентный спуск для оптимизации функции потерь.


Классификация и прогноз

После обучения SVM может предсказывать классы для новых объектов. Метод predict возвращает числовой класс:

let predictedClass = svm.predict(new Vol([f1, f2, f3]));

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

  • Метод predict вычисляет линейную комбинацию весов и признаков.
  • Результатом является ближайший класс, определяемый гиперплоскостью разделения.

Подготовка данных и нормализация

Для корректной работы SVM важно нормализовать признаки:

function normalizeFeatureArray(features) {
    let mean = features.reduce((a,b) => a+b, 0) / features.length;
    let std = Math.sqrt(features.reduce((a,b) => a + (b - mean) ** 2, 0) / features.length);
    return features.map(f => (f - mean) / std);
}

Пояснение:

  • Нормализация ускоряет сходимость градиентного спуска.
  • Признаки с одинаковым масштабом предотвращают смещение SVM к большим значениям.

Настройка гиперпараметров

Оптимальные параметры SVM зависят от задачи и масштаба данных:

  • l2 (регуляризация): малое значение может привести к переобучению, большое — к недообучению.
  • learning_rate: слишком высокий приведет к расходимости, слишком низкий — к медленной сходимости.
  • batch_size: большее значение улучшает стабильность, но снижает адаптивность.

Практика показывает, что поиск оптимальных параметров методом перекрестной проверки повышает точность классификации.


Поддержка нескольких классов

Стандартный SVM в ConvNetJS является бинарным. Для многоклассовой классификации используется схема “один против всех”:

  1. Для каждого класса создается отдельный SVM.
  2. Каждый SVM обучается различать свой класс от остальных.
  3. Класс с наибольшей уверенной оценкой выбирается как итоговый прогноз.

Пример полного цикла

let svm = new convnetjs.SVM({l2: 0.01, learning_rate: 0.01, batch_size: 10});

// Обучение
for (let i = 0; i < trainingData.length; i++) {
    svm.train(trainingData[i].x, trainingData[i].y);
}

// Предсказание
let testVol = new convnetjs.Vol([0.5, -1.2, 0.3]);
let predicted = svm.predict(testVol);

console.log("Класс:", predicted);

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


Важные рекомендации

  • Всегда нормализовать входные данные.
  • Проверять соотношение классов для предотвращения смещения модели.
  • Использовать кросс-валидацию для настройки l2 и learning_rate.
  • Для многоклассовых задач использовать стратегию “один против всех”.

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