Какие функции активации используются в нейросетях?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Функции активации в нейросетях
Функция активации — это нелинейная функция, которая применяется к выходу каждого нейрона. Без функций активации нейросеть была бы просто набором линейных трансформаций и не смогла бы аппроксимировать сложные нелинейные функции. Выбор функции активации существенно влияет на скорость обучения и качество модели.
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 |
| GELU | Transformer, современные сети | Лучше в больших моделях | Вычислительно дороже |
| 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 слоёв
- Не используй функции активации в выходном слое для задач регрессии