← Назад к вопросам

Какие функции активации используются в нейросетях?

2.0 Middle🔥 241 комментариев
#Глубокое обучение#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Функции активации в нейросетях

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

1. ReLU (Rectified Linear Unit)

Одна из самых популярных функций активации для скрытых слоёв.

Формула

ReLU(x) = max(0, x)

Свойства

  • Простая и быстрая в вычислении
  • Помогает сети избежать проблемы затухающего градиента
  • Биологически вдохновлена (нейроны либо активны, либо нет)
  • Имеет мёртвые нейроны (ReLU(x) = 0 при x < 0)

Реализация

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras import layers

def relu(x):
    return np.maximum(0, x)

# График
x = np.linspace(-5, 5, 100)
y = relu(x)
plt.plot(x, y, label='ReLU')
plt.grid(True)
plt.legend()
plt.title('ReLU Activation Function')
plt.show()

# В Keras
model.add(layers.Dense(64, activation='relu'))
# или
model.add(layers.ReLU())

Проблема: Мёртвые нейроны

# ReLU может привести к мёртвым нейронам
x = np.array([-5, -3, 0, 2, 5])
output = relu(x)
print(output)  # [0, 0, 0, 2, 5]
# После обучения некоторые нейроны могут вообще не активироваться

2. Leaky ReLU

Попытка решить проблему мёртвых нейронов в ReLU.

Формула

Leaky ReLU(x) = x если x > 0, alpha * x если x <= 0

Обычно alpha = 0.01

Реализация

def leaky_relu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)

x = np.array([-5, -3, 0, 2, 5])
output = leaky_relu(x)
print(output)  # [-0.05, -0.03, 0, 2, 5]

# В Keras
model.add(layers.Dense(64))
model.add(layers.LeakyReLU(alpha=0.01))
# или
model.add(layers.Dense(64, activation=layers.LeakyReLU(alpha=0.01)))

3. ELU (Exponential Linear Unit)

Плавная альтернатива ReLU.

Формула

ELU(x) = x если x > 0, alpha * (exp(x) - 1) если x <= 0
def elu(x, alpha=1.0):
    return np.where(x > 0, x, alpha * (np.exp(x) - 1))

x = np.linspace(-3, 3, 100)
y = elu(x)
plt.plot(x, y, label='ELU')
plt.grid(True)
plt.legend()
plt.show()

# В Keras
model.add(layers.Dense(64, activation='elu'))

4. GELU (Gaussian Error Linear Unit)

Используется в современных моделях (BERT, GPT).

Формула

GELU(x) = x * Phi(x)

Где Phi(x) — функция кумулятивного распределения нормального распределения.

from tensorflow.keras import layers
from tensorflow.keras import activations
import numpy as np

def gelu_approx(x):
    # Приблизительная реализация
    cdf = 0.5 * (1.0 + np.tanh(np.sqrt(2.0 / np.pi) * (x + 0.044715 * x**3)))
    return x * cdf

x = np.linspace(-3, 3, 100)
y = gelu_approx(x)
plt.plot(x, y, label='GELU')
plt.grid(True)
plt.legend()
plt.show()

# В Keras (новые версии)
model.add(layers.Dense(64, activation='gelu'))

5. Sigmoid (Логистическая функция)

Классическая функция активации, сейчас в основном для выходных слоёв бинарной классификации.

Формула

Sigmoid(x) = 1 / (1 + exp(-x))

Свойства

  • Выход в диапазоне (0, 1) — интерпретируется как вероятность
  • Гладкая дифференцируемая функция
  • Проблема: затухающие градиенты при |x| велико
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.linspace(-5, 5, 100)
y = sigmoid(x)
plt.plot(x, y, label='Sigmoid')
plt.grid(True)
plt.legend()
plt.axhline(y=0.5, color='r', linestyle='--', alpha=0.5)
plt.show()

# В Keras
# Для бинарной классификации
model.add(layers.Dense(1, activation='sigmoid'))

6. Tanh (гиперболический тангенс)

Полезна для скрытых слоёв, выход в диапазоне (-1, 1).

Формула

Tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))

Свойства

  • Выход в диапазоне (-1, 1), что означает центрирование
  • Производная больше, чем у sigmoid
  • Часто работает лучше sigmoid в скрытых слоях
def tanh(x):
    return np.tanh(x)

x = np.linspace(-3, 3, 100)
y = tanh(x)
plt.plot(x, y, label='Tanh')
plt.grid(True)
plt.legend()
plt.show()

# В Keras
model.add(layers.Dense(64, activation='tanh'))

7. Softmax

Используется в выходном слое для мультиклассовой классификации.

Формула

Softmax(x_i) = exp(x_i) / sum(exp(x_j) для всех j)

Выход — вероятностное распределение над классами.

def softmax(x):
    exp_x = np.exp(x - np.max(x))  # численная стабильность
    return exp_x / np.sum(exp_x)

logits = np.array([1.0, 2.0, 3.0])
probabilities = softmax(logits)
print(probabilities)  # [0.09003057, 0.24472142, 0.66524800]
print(np.sum(probabilities))  # 1.0 (сумма = 1)

# В Keras
model.add(layers.Dense(10, activation='softmax'))  # 10 классов

8. Swish (SiLU)

Само-управляемая функция активации, найдена через NAS.

Формула

Swish(x) = x * Sigmoid(x)
def swish(x):
    return x / (1 + np.exp(-x))  # x * sigmoid(x)

x = np.linspace(-5, 5, 100)
y = swish(x)
plt.plot(x, y, label='Swish')
plt.grid(True)
plt.legend()
plt.show()

# В Keras
model.add(layers.Dense(64, activation='swish'))
model.add(layers.Dense(64, activation='silu'))  # альтернативное имя

Сравнение и выбор

ФункцияПрименениеПлюсыМинусы
ReLUСкрытые слоиБыстрая, избегает затуханияМёртвые нейроны
Leaky ReLUСкрытые слоиРешает мёртвые нейроныМинимальный эффект
ELUСкрытые слоиГладкая, здоровые градиентыМедленнее ReLU
GELUTransformer, современные сетиЛучше в больших моделяхВычислительно дороже
SigmoidВыход (бинарная)Интерпретируется как вероятностьЗатухающие градиенты
TanhСкрытые слои, RNNВыход центрированЗатухающие градиенты
SoftmaxВыход (мультикласс)Вероятностное распределениеНе для скрытых слоёв
SwishСкрытые слоиСовременная, smoothВычислительно сложнее

Полный пример с разными функциями

from tensorflow.keras import Sequential, layers
from tensorflow.keras.datasets import mnist
from tensorflow.keras.optimizers import Adam

# Загрузить данные
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(-1, 28*28) / 255.0
X_test = X_test.reshape(-1, 28*28) / 255.0
y_train_cat = tf.keras.utils.to_categorical(y_train)
y_test_cat = tf.keras.utils.to_categorical(y_test)

# Модель с ReLU (стандарт)
model_relu = Sequential([
    layers.Dense(128, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model_relu.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history_relu = model_relu.fit(X_train, y_train_cat, epochs=10, verbose=0)

# Модель с GELU (современная)
model_gelu = Sequential([
    layers.Dense(128, activation='gelu'),
    layers.Dense(64, activation='gelu'),
    layers.Dense(10, activation='softmax')
])

model_gelu.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history_gelu = model_gelu.fit(X_train, y_train_cat, epochs=10, verbose=0)

print(f'ReLU accuracy: {model_relu.evaluate(X_test, y_test_cat)[1]:.4f}')
print(f'GELU accuracy: {model_gelu.evaluate(X_test, y_test_cat)[1]:.4f}')

Выводы

  • ReLU — стандартный выбор для скрытых слоёв, быстрая и эффективная
  • Leaky ReLU или ELU — если ReLU не работает хорошо
  • GELU — для современных больших моделей (BERT, GPT)
  • Sigmoid — только для выходного слоя бинарной классификации
  • Softmax — для выходного слоя мультиклассовой классификации
  • Tanh — для RNN и LSTM слоёв
  • Не используй функции активации в выходном слое для задач регрессии
Какие функции активации используются в нейросетях? | PrepBro