Сигмоида

Сигмоида — одна из фундаментальных активационных функций в нейронных сетях, широко применяемая для построения многослойных перцептронов. В библиотеке ConvNetJS она реализована через объект SigmoidLayer и используется как для скрытых слоев, так и для выходных, когда требуется нормализация значений в диапазон от 0 до 1.


Основные свойства сигмоидной функции

Сигмоид определяется формулой:

[ (x) = ]

Ключевые характеристики:

  • Диапазон выходных значений: (0 < (x) < 1)
  • Ненасыщенность вблизи нуля: при малых по модулю значениях функции градиенты относительно входа велики, что способствует эффективному обучению.
  • Затухание градиента на больших значениях: для больших положительных или отрицательных аргументов производная стремится к нулю, что может замедлять обучение глубоких сетей.

Производная сигмоиды имеет простую форму через саму функцию:

[ ’(x) = (x) (1 - (x))]

Это облегчает вычисление градиентов во время обратного распространения ошибки.


Реализация SigmoidLayer в ConvNetJS

Создание слоя сигмоиды в 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);
    }
}

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


Применение в нейронных сетях

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

[ L = -[t y + (1-t)(1-y)]]

где (t) — метка класса, (y) — выход сигмоиды.


Особенности использования в ConvNetJS

  • Память: каждый SigmoidLayer хранит копии входных и выходных значений (in_act, out_act), что необходимо для обратного распространения.
  • Совместимость: слой легко интегрируется в любую архитектуру ConvNetJS, включая многослойные перцептроны (MLP) и небольшие сверточные сети.
  • Ограничения: в глубоких сетях сигмоида может замедлять обучение. Для предотвращения этого используют нормализацию входных данных и небольшие размеры сети.

Практический пример использования

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