Функция F.gelu
Функция F.gelu (Gaussian Error Linear Unit) применяет нелинейное преобразование к каждому элементу входного тензора. В отличие от функции ReLU, которая просто обнуляет отрицательные значения, GELU взвешивает входные значения по их величине. Активация вычисляется как произведение входа на функцию распределения стандартного нормального распределения: x * Φ(x). Функция имеет гладкую форму и часто показывает лучшие результаты в современных архитектурах, таких как GPT и BERT.
Первым параметром функция принимает тензор input, к которому применяется активация. Вторым параметром можно передать строку approximate для выбора способа вычисления: 'none' (точное вычисление), 'tanh' (приближение через тангенс) - используется по умолчанию.
Синтаксис
torch.nn.functional.gelu(input, approximate='tanh')
Пример
Давайте применим функцию gelu к тензору с отрицательными и положительными числами:
import torch
import torch.nn.functional as F
t = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0])
res = F.gelu(t)
print(res)
Результат выполнения кода:
tensor([-0.0036, -0.1587, 0.0000, 0.8413, 2.9964])
Пример
Функцию gelu часто применяют в нейронных сетях после линейных слоёв. Рассмотрим использование в составе простого полносвязного слоя:
import torch
import torch.nn as nn
import torch.nn.functional as F
layer = nn.Linear(10, 5)
t = torch.randn(3, 10)
res = F.gelu(layer(t))
print(res.shape)
Результат выполнения кода:
torch.Size([3, 5])
Пример
Рассмотрим разницу между точным и приближённым способом вычисления gelu. Параметр approximate может принимать значение 'tanh' или 'none':
import torch
import torch.nn.functional as F
t = torch.tensor([-0.5, 0.5])
res_tanh = F.gelu(t, approximate='tanh')
res_none = F.gelu(t, approximate='none')
print("tanh:", res_tanh)
print("none:", res_none)
Результат выполнения кода:
tanh: tensor([-0.1543, 0.3457])
none: tensor([-0.1543, 0.3457])