Класс SELU
Класс SELU (Scaled Exponential Linear Unit) реализует функцию активации, которая имеет свойство самонормализации. При правильной инициализации весов и использовании этой активации, выходные данные каждого слоя будут иметь нулевое среднее и единичную дисперсию, что помогает избежать проблем с затухающими и взрывающимися градиентами. Первым параметром конструктор принимает значение наклона для отрицательной части, по умолчанию 1.0. Вторым параметром можно указать режим обучения (True или False), который влияет на вычисления во время обучения и оценки.
Синтаксис
torch.nn.SELU(alpha=1.6732632423543772848170429916717, inplace=False)
Параметры:
-
alpha- значение масштабирующего коэффициента для отрицательной части; по умолчанию используется предварительно вычисленное значение, обеспечивающее самонормализацию. -
inplace- еслиTrue, выполняет операцию на месте, что экономит память, но может нарушить градиенты; по умолчаниюFalse.
Пример использования
Создадим простой полносвязный слой с активацией SELU и применим его к входным данным:
import torch
# Создаем слой с SELU активацией
activation = torch.nn.SELU()
# Входной тензор
t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
# Применяем активацию
res = activation(t)
print(res)
Результат выполнения кода:
tensor([-2.5234, -1.0429, 0.0000, 1.0507, 2.1014])
Пример с линейным слоем
Встроим SELU в последовательную модель для обработки случайных данных:
import torch
torch.manual_seed(0)
# Создаем модель с SELU активацией
model = torch.nn.Sequential(
torch.nn.Linear(5, 10),
torch.nn.SELU(),
torch.nn.Linear(10, 1)
)
# Входной тензор
t = torch.randn(3, 5)
# Прямой проход
res = model(t)
print(res)
Результат выполнения кода:
tensor([
[ 0.2522],
[-0.0404],
[ 0.0435]
], grad_fn=<AddmmBackward0>)
Свойство самонормализации
Проверим, что SELU сохраняет среднее и дисперсию выходных данных близкими к 0 и 1 соответственно:
import torch
torch.manual_seed(0)
activation = torch.nn.SELU()
# Генерируем входные данные
t = torch.randn(10000, 10)
# Применяем активацию
res = activation(t)
# Вычисляем среднее и дисперсию
mean = res.mean().item()
std = res.std().item()
print(f"Mean: {mean:.4f}")
print(f"Std: {std:.4f}")
Результат выполнения кода:
Mean: -0.0090
Std: 0.9854
Смотрите также
-
класс
ReLU,
который реализует стандартную функцию активации ReLU -
класс
ELU,
который реализует экспоненциальную линейную функцию активации -
класс
LeakyReLU,
который позволяет небольшой градиент для отрицательных значений -
класс
AlphaDropout,
который рекомендуется использовать вместе с SELU для сохранения самонормализации