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

Урок объясняет три ключевые активации — relu, sigmoid, softmax — и зачем вообще нужна нелинейность.

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

Без активаций стопка линейных слоёв схлопывается в один линейный слой — сколько ни добавляй, получится та же прямая. Нелинейность активаций — то, что даёт нейросети её мощь.

Три рабочих лошадки

АктивацияФормулаГде применяют
relumax(0, x)скрытые слои (по умолчанию)
sigmoid1 / (1 + e^-x)выход бинарной классификации
softmaxнормированные экспонентывыход многоклассовой классификации

Считаем активации руками

Реализуем relu, sigmoid и softmax на чистом Python — код запускается:

import math

def relu(x):
    return max(0.0, x)

def sigmoid(x):
    return 1 / (1 + math.exp(-x))

def softmax(xs):
    m = max(xs)
    exps = [math.exp(x - m) for x in xs]
    s = sum(exps)
    return [round(e / s, 3) for e in exps]

print("relu(-2):", relu(-2), "relu(3):", relu(3))
print("sigmoid(0):", round(sigmoid(0), 3))
print("softmax([2,1,0.1]):", softmax([2, 1, 0.1]))

Вывод:

relu(-2): 0.0 relu(3): 3
sigmoid(0): 0.5
softmax([2,1,0.1]): [0.659, 0.242, 0.099]

Обратите внимание: softmax превращает любые числа в вероятности, которые в сумме дают 1 (0.659 + 0.242 + 0.099 = 1.0) — поэтому он идеален для выхода классификатора.

Активации в Keras

Их указывают параметром activation у слоя (требует TF):

from tensorflow.keras import layers

layers.Dense(64, activation="relu")     # скрытый слой
layers.Dense(1, activation="sigmoid")   # бинарный выход
layers.Dense(10, activation="softmax")  # 10 классов

Как работает под капотом

Активация применяется поэлементно к выходу слоя. relu популярна потому, что её производная — это просто 0 или 1, что делает обучение быстрым и устойчивым к затуханию градиента (в отличие от sigmoid, которая «насыщается» на краях и почти обнуляет градиент). softmax внутри вычитает максимум перед экспонентой — это защищает от переполнения при больших значениях.

Частые ошибки

  • Ставить softmax в скрытые слои. softmax — для выхода классификатора, в скрытых слоях нужна relu.
  • Использовать sigmoid на многоклассовом выходе. Для нескольких взаимоисключающих классов нужен softmax.
  • Сеть без активаций. Тогда все слои схлопываются в один линейный — модель не выучит ничего сложного.

Итог

  • Активации добавляют нелинейность; без них стек слоёв = один линейный слой.
  • relu (max(0,x)) — стандарт для скрытых слоёв.
  • sigmoid — для бинарного выхода, softmax — для многоклассового (даёт вероятности, сумма = 1).
  • softmax и sigmoid не ставят в скрытые слои.
Проверьте себя
1. Что произойдёт со стеком линейных слоёв без функций активации?
AОн станет быстрее
BОн схлопнется в один линейный слой
CОн начнёт переобучаться
DНичего не изменится в выразительности, но обучится лучше
2. Какую активацию ставят на выход многоклассового классификатора?
Arelu
Bsigmoid
Csoftmax
Dникакую
3. Почему relu — стандарт для скрытых слоёв?
AОна даёт вероятности
BПростая производная (0 или 1), устойчива к затуханию градиента
CОна всегда возвращает 1
DОна единственная нелинейная