Сигмоида — одна из фундаментальных активационных функций в нейронных
сетях, широко применяемая для построения многослойных перцептронов. В
библиотеке ConvNetJS она реализована через объект
SigmoidLayer и используется как для скрытых слоев, так и
для выходных, когда требуется нормализация значений в диапазон от 0 до
1.
Сигмоид определяется формулой:
[ (x) = ]
Ключевые характеристики:
Производная сигмоиды имеет простую форму через саму функцию:
[ ’(x) = (x) (1 - (x))]
Это облегчает вычисление градиентов во время обратного распространения ошибки.
Создание слоя сигмоиды в ConvNetJS осуществляется следующим образом:
var layer = new convnetjs.SigmoidLayer({
num_neurons: 100 // количество нейронов в слое
});
Параметры:
num_neurons — обязательный параметр, определяющий число
нейронов в слое.inputs — автоматически вычисляется при подключении к
предыдущему слою.activation — внутренняя переменная, где хранится выход
каждого нейрона после применения функции активации.Слой сигмоиды не содержит весов, поэтому не нуждается в оптимизации весов напрямую. Его роль заключается исключительно в преобразовании линейного выхода предыдущего слоя.
Прямое распространение (forward pass):
При вызове метода forward входной массив значений
передаётся в слой, и к каждому элементу применяется сигмоидная
функция:
layer.forward = function(V) {
this.in_act = V; // сохранение входа
var N = V.w.length;
this.out_act = new convnetjs.Vol(1,1,N);
for(var i=0;i<N;i++) {
this.out_act.w[i] = 1.0 / (1.0 + Math.exp(-V.w[i]));
}
return this.out_act;
}
Здесь V — объект типа Vol, представляющий
входные данные. Выход сохраняется в out_act.
Обратное распространение (backward pass):
Сигмоида имеет компактное выражение для градиента:
[ = y_i (1 - y_i)]
В коде ConvNetJS это реализовано так:
layer.backward = function() {
var N = this.in_act.w.length;
this.in_act.dw = new Array(N);
for(var i=0;i<N;i++) {
var y = this.out_act.w[i];
this.in_act.dw[i] = this.out_act.dw[i] * y * (1.0 - y);
}
}
Таким образом, каждый градиент корректируется производной сигмоиды, что позволяет эффективно обновлять веса предыдущего слоя.
[ L = -[t y + (1-t)(1-y)]]
где (t) — метка класса, (y) — выход сигмоиды.
SigmoidLayer хранит
копии входных и выходных значений (in_act,
out_act), что необходимо для обратного
распространения.var layer_defs = [];
layer_defs.push({type:'input', out_sx:1, out_sy:1, out_depth:10});
layer_defs.push({type:'fc', num_neurons:20});
layer_defs.push({type:'sigmoid'}); // слой сигмоиды
layer_defs.push({type:'fc', num_neurons:2});
layer_defs.push({type:'softmax'});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
В этом примере сигмоида используется для промежуточного слоя после
полностью связанного (fc) слоя. Далее применяется softmax
для конечной классификации.
Сигмоида обеспечивает плавное нелинейное преобразование данных между слоями, нормализуя их в диапазоне ([0,1]), что удобно для дальнейшей обработки.
Сигмоида в ConvNetJS — простой, но важный инструмент для построения нейронных сетей, обеспечивающий стабильные выходы и понятные градиенты для обратного распространения, особенно в задачах бинарной классификации.