Softmax classifier

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

Основные концепции

Softmax преобразует входной вектор z длиной N (число классов) в вектор вероятностей p, где каждая компонента (p_i) находится в диапазоне [0,1] и сумма всех компонент равна 1:

[ p_i = ]

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

Преимущества Softmax:

  • Генерирует интерпретируемое распределение вероятностей.
  • Позволяет использовать кросс-энтропийную функцию потерь.
  • Естественно интегрируется с многослойными сетями.

Создание Softmax слоя в ConvNetJS

В ConvNetJS Softmax реализован через объект SoftmaxLayer. Основные параметры при создании слоя:

var layer_def = {};
layer_def.type = 'softmax';
layer_def.num_classes = 10; // количество классов
var softmax_layer = new convnetjs.SoftmaxLayer(layer_def);

Параметр num_classes определяет размер выходного вектора. Layer автоматически создаёт веса и смещения, хотя в случае Softmax они часто инициализируются нейтрально, так как Softmax в ConvNetJS обычно используется в качестве выходного слоя, а обучение весов происходит через предыдущий FullyConnectedLayer.

Прямое распространение (forward)

Метод forward принимает входной вектор и возвращает вероятности по каждому классу:

var input_vol = new convnetjs.Vol([0.1, -0.2, 0.3, 0.4]);
var probs = softmax_layer.forward(input_vol);
console.log(probs.w); // массив вероятностей

Особенности реализации:

  • Вектор входных значений сначала нормализуется для предотвращения переполнения экспоненты.
  • Вычисляется экспонента каждого значения.
  • Происходит нормализация по сумме экспонент, формируя окончательное распределение вероятностей.

Обратное распространение ошибки (backward)

Softmax чаще всего используется с кросс-энтропийной функцией потерь:

[ L = -_i y_i (p_i)]

где (y_i) — это индикатор истинного класса (1 для правильного, 0 для остальных).

ConvNetJS реализует градиент через метод backward:

softmax_layer.backward(y); // y - индекс правильного класса

Градиент для каждого входного элемента вычисляется по формуле:

[ = p_i - y_i]

где (p_i) — выход softmax, а (y_i) — индикатор правильного класса. Такой подход упрощает вычисления и напрямую интегрируется с оптимизатором (Solver) для обновления весов предыдущего слоя.

Использование SoftmaxLayer в сети

Типичный пример полной конфигурации сети с Softmax в ConvNetJS:

var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:4});
layer_defs.push({type:'fc', num_neurons:5, activation:'relu'});
layer_defs.push({type:'softmax', num_classes:3});

var net = new convnetjs.Net();
net.makeLayers(layer_defs);

var trainer = new convnetjs.SGDTrainer(net, {learning_rate:0.01, l2_decay:0.001});

Пошаговая логика работы сети:

  1. Входной вектор подается на вход input слоя.
  2. Полносвязный слой (fc) вычисляет линейные комбинации и применяет активацию ReLU.
  3. Softmax слой преобразует выходы fc в вероятности классов.
  4. Тренировщик SGDTrainer использует кросс-энтропийный градиент для обновления весов полносвязного слоя.

Практические рекомендации

  • Для численно стабильной работы желательно добавлять смещение или нормализовывать входные данные.
  • Softmax следует использовать только в качестве последнего слоя сети при многоклассовой классификации.
  • Для больших сетей с сотнями классов важно учитывать оптимизации по вычислению экспоненты, чтобы избежать переполнения и потерь точности.

Взаимодействие с кросс-энтропией

ConvNetJS автоматически вычисляет потерю при вызове trainer.train(x, y), где x — входной вектор, а y — индекс истинного класса. Softmax слой совместно с кросс-энтропией обеспечивает корректное вычисление градиентов без дополнительной ручной работы.

Расширение функционала

SoftmaxLayer можно комбинировать с:

  • Dropout слоем для предотвращения переобучения.
  • Сверточными слоями перед полносвязным слоем для обработки изображений.
  • Batch Normalization для ускорения сходимости.

Такой подход позволяет создавать гибкие архитектуры с корректной обработкой вероятностей классов на выходе.