Softmax classifier является одним из базовых элементов для задач многоклассовой классификации. В библиотеке ConvNetJS он реализован как отдельный слой, предоставляющий функционал для прямого вычисления вероятностей классов на основе входных признаков.
Softmax преобразует входной вектор z длиной N (число классов) в вектор вероятностей p, где каждая компонента (p_i) находится в диапазоне [0,1] и сумма всех компонент равна 1:
[ p_i = ]
Ключевой особенностью является экспоненциальное усиление различий между входными значениями, что делает класс с наибольшей оценкой доминирующим в распределении вероятностей.
Преимущества Softmax:
В 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 принимает входной вектор и возвращает
вероятности по каждому классу:
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); // массив вероятностей
Особенности реализации:
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) для обновления весов предыдущего
слоя.
Типичный пример полной конфигурации сети с 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});
Пошаговая логика работы сети:
input слоя.fc) вычисляет линейные комбинации и
применяет активацию ReLU.fc в вероятности
классов.SGDTrainer использует кросс-энтропийный
градиент для обновления весов полносвязного слоя.ConvNetJS автоматически вычисляет потерю при вызове
trainer.train(x, y), где x — входной вектор, а
y — индекс истинного класса. Softmax слой совместно с
кросс-энтропией обеспечивает корректное вычисление градиентов без
дополнительной ручной работы.
SoftmaxLayer можно комбинировать с:
Такой подход позволяет создавать гибкие архитектуры с корректной обработкой вероятностей классов на выходе.