Класс SiLU
Класс SiLU (Sigmoid Linear Unit) реализует активационную функцию, которая вычисляется по формуле x * sigmoid(x). Эта функция является гладкой, нелинейной и не имеет проблемы "умирающих" нейронов, что делает её популярной в современных архитектурах глубоких нейронных сетей. В некоторых источниках она также известна как Swish.
Класс наследуется от torch.nn.Module и не имеет обучаемых параметров. Он применяется поэлементно к входному тензору и возвращает тензор той же формы.
Синтаксис
torch.nn.SiLU(inplace=False)
Параметры
Класс принимает один необязательный параметр:
-
inplace(bool, по умолчаниюFalse) - если установить вTrue, операция будет выполнена непосредственно на входном тензоре, изменяя его. Использование этого параметра может сэкономить память, но следует быть осторожным, чтобы не потерять исходные данные.
Пример
Создадим экземпляр класса SiLU и применим его к тензору:
import torch
# Создаем экземпляр SiLU
activation = torch.nn.SiLU()
# Входной тензор
t = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
# Применяем активацию
res = activation(t)
print(res)
Результат выполнения кода:
tensor([-0.2384, -0.2689, 0.0000, 0.7311, 1.7616])
Пример
Применим SiLU к двумерному тензору. Обратите внимание, что форма тензора сохраняется:
import torch
activation = torch.nn.SiLU()
# Двумерный тензор
t = torch.tensor([
[-3.0, -2.0, -1.0],
[0.0, 1.0, 2.0],
[3.0, 4.0, 5.0]
])
res = activation(t)
print(res)
Результат выполнения кода:
tensor([
[-0.1425, -0.2384, -0.2689],
[0.0000, 0.7311, 1.7616],
[2.8575, 3.9281, 4.9872]
])
Пример
Используем параметр inplace=True. В этом случае входной тензор будет изменён непосредственно:
import torch
activation = torch.nn.SiLU(inplace=True)
t = torch.tensor([-1.5, 0.0, 1.5])
print("Before:", t)
# Применяем активацию in-place
res = activation(t)
print("After:", t)
print("Returned:", res)
Результат выполнения кода:
Before: tensor([-1.5000, 0.0000, 1.5000])
After: tensor([-0.2689, 0.0000, 1.2840])
Returned: tensor([-0.2689, 0.0000, 1.2840])
Как видно, исходный тензор t был изменён, а возвращаемый тензор res указывает на те же данные.
Пример
Использование SiLU в составе последовательной модели torch.nn.Sequential:
import torch
# Создаем модель с линейным слоем и SiLU
model = torch.nn.Sequential(
torch.nn.Linear(5, 10),
torch.nn.SiLU(),
torch.nn.Linear(10, 1)
)
# Создаем случайный входной вектор
torch.manual_seed(0)
x = torch.randn(3, 5)
# Прямой проход
output = model(x)
print(output.shape)
print(output)
Результат выполнения кода:
torch.Size([3, 1])
tensor([[0.1702],
[0.1488],
[0.0123]])