Sigmoid и Tanh

Функция активации Sigmoid

Функция Sigmoid является одной из классических функций активации, применяемых в нейронных сетях. Она преобразует любое вещественное значение (x) в диапазон от 0 до 1, что делает её удобной для задач бинарной классификации и вероятностного моделирования. Математически функция определяется как:

[ (x) = ]

Ключевые особенности Sigmoid:

  • Диапазон значений: ((0, 1))
  • Плавная, монотонная кривая
  • Дифференцируема на всей числовой оси
  • Выход часто интерпретируется как вероятность

Недостатки:

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

В Keras.js применение функции Sigmoid осуществляется через слой активации или непосредственно в слое Dense. Пример использования в Jav * aScript:

const layer = new KerasJS.layers.Dense({
  units: 10,
  activation: 'sigmoid',
  inputShape: [20]
});

Этот код создаёт полносвязный слой с 10 нейронами, принимающий на вход вектор длиной 20 и использующий Sigmoid для вычисления выходов.


Функция активации Tanh

Функция Tanh (гиперболический тангенс) является расширением идеи Sigmoid. Она преобразует входные значения в диапазон от -1 до 1, что помогает нейронам быть центрированными вокруг нуля, ускоряя обучение. Формула:

[ (x) = ]

Особенности Tanh:

  • Диапазон значений: ((-1, 1))
  • Центрирована около нуля, что улучшает работу градиентного спуска
  • Плавная и дифференцируемая функция
  • Широко применяется в рекуррентных нейронных сетях (RNN) и LSTM

Недостатки:

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

Применение в Keras.js аналогично Sigmoid:

const layer = new KerasJS.layers.Dense({
  units: 16,
  activation: 'tanh',
  inputShape: [30]
});

Здесь создаётся слой с 16 нейронами, принимающий на вход вектор длиной 30 и использующий Tanh для активации.


Выбор между Sigmoid и Tanh

Когда использовать Sigmoid:

  • На последнем слое для бинарной классификации
  • Когда требуется вероятность в диапазоне ([0, 1])
  • В простых сетях, где глубина ограничена

Когда использовать Tanh:

  • В скрытых слоях нейросети для улучшенной сходимости
  • В рекуррентных сетях и LSTM, где центрирование вокруг нуля критично
  • Когда значения признаков могут быть отрицательными и положительными

Реализация и вычислительные аспекты

В Keras.js обе функции активации реализуются на уровне слоев, но также возможна ручная обработка входного массива с помощью методов map и экспоненты. Пример реализации Sigmoid вручную:

function sigmoid(x) {
  return 1 / (1 + Math.exp(-x));
}

const input = [0.5, -1.2, 3.0];
const output = input.map(sigmoid);

Для Tanh:

function tanh(x) {
  return Math.tanh(x);
}

const input = [-2, 0, 2];
const output = input.map(tanh);

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


Градиенты Sigmoid и Tanh

Для корректного обучения нейросетей важно понимать производные этих функций:

  • Sigmoid: [ ’(x) = (x) (1 - (x))]

  • Tanh: [ ’(x) = 1 - ((x))^2]

Производные используются при обратном распространении ошибки (backpropagation) и напрямую влияют на скорость обучения и стабильность сети. В Keras.js эти вычисления автоматически выполняются внутри слоя, но понимание формул помогает при отладке и анализе модели.


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

  • Для глубоких сетей скрытые слои лучше строить с Tanh или ReLU, а Sigmoid оставить для выхода.
  • Перед использованием Sigmoid или Tanh желательно нормализовать входные данные, чтобы уменьшить вероятность насыщения функций.
  • В JavaScript большие массивы можно обрабатывать с использованием TypedArray, что ускоряет вычисления при ручной реализации активации.