Sigmoid, Tanh, ReLU и другие функции активации в Synaptic

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


Sigmoid

Sigmoid — классическая S-образная функция активации, определяемая формулой:

[ (x) = ]

Основные характеристики:

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

В Synaptic использование функции Sigmoid выглядит так:

const { Layer, Network, Trainer } = require('synaptic');

let inputLayer = new Layer(2);
let hiddenLayer = new Layer(3);
let outputLayer = new Layer(1);

hiddenLayer.set({
    squash: require('synaptic').Neuron.squash.LOGISTIC
});

outputLayer.set({
    squash: require('synaptic').Neuron.squash.LOGISTIC
});

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

Функция Sigmoid хорошо подходит для задач классификации, где результат интерпретируется как вероятность.


Tanh

Tanh (гиперболический тангенс) — функция активации с диапазоном от -1 до 1:

[ (x) = ]

Преимущества по сравнению с Sigmoid:

  • Центрированность около нуля ускоряет сходимость градиентного спуска.
  • Снижение смещения активаций в сети.

В Synaptic Tanh подключается через Neuron.squash.TANH:

hiddenLayer.set({
    squash: require('synaptic').Neuron.squash.TANH
});

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


ReLU (Rectified Linear Unit)

ReLU — линейная функция активации с отсечкой отрицательных значений:

[ f(x) = (0, x)]

Ключевые свойства:

  • Диапазон выхода: от 0 до +∞.
  • Быстрое вычисление и простая производная, что ускоряет обучение.
  • Склонность к “умиранию нейронов” (dead neurons) при отрицательных суммах входов.

В Synaptic ReLU реализуется через модуль Neuron.squash.RELU:

hiddenLayer.set({
    squash: require('synaptic').Neuron.squash.RELU
});

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


Линейная и другие функции активации

Помимо перечисленных, Synaptic поддерживает:

  • Linear: ( f(x) = x ). Используется в выходных слоях регрессионных задач.
  • Step (пороговая): выдает 0 или 1 в зависимости от порога. Редко используется в современных сетях из-за отсутствия дифференцируемости.
  • Leaky ReLU: модификация ReLU с небольшой положительной границей для отрицательных значений, предотвращает проблему “умирающих нейронов”.

Пример установки линейной функции активации:

outputLayer.set({
    squash: require('synaptic').Neuron.squash.IDENTITY
});

Выбор функции активации

  • Sigmoid: простая классификация, вероятностная интерпретация.
  • Tanh: рекуррентные сети и глубокие слои с центрированными данными.
  • ReLU / Leaky ReLU: глубокие сети, свёрточные сети, когда требуется высокая производительность.
  • Linear: выходной слой регрессии.

Важный аспект — производная функции активации, которая используется для обратного распространения ошибки. В Synaptic каждая функция активации имеет встроенную производную, что позволяет тренировать сеть стандартным методом Trainer.


Практические советы

  1. Согласованность функций: использовать одну функцию активации в скрытых слоях.
  2. Выбор функции под задачу: для регрессии линейная активация, для вероятностной классификации — Sigmoid.
  3. Инициализация весов: ReLU требует положительной начальной дисперсии для эффективного обучения.
  4. Комбинирование функций: выходной слой может иметь другую функцию активации, чем скрытые слои.

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