Класс GLU
Класс GLU применяет гейтированную линейную активацию ко входному тензору.
Он разделяет вход на две равные части по размерности признаков (по умолчанию последней оси),
затем применяет функцию sigmoid к одной части, а другую оставляет без изменений,
после чего выполняет поэлементное умножение. Первым параметром конструктора
принимается dim - ось, по которой происходит разделение (по умолчанию -1).
Синтаксис
torch.nn.GLU(dim=-1)
Параметры
Модуль принимает один параметр:
- dim - ось, по которой входной тензор будет разделён на две части. Значение по умолчанию - -1 (последняя ось).
Пример использования с тензором
Рассмотрим простой пример применения GLU к тензору размерности (2, 6):
import torch
t = torch.tensor([
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
[7.0, 8.0, 9.0, 10.0, 11.0, 12.0]
])
glu = torch.nn.GLU(dim=-1)
res = glu(t)
print(res)
Результат выполнения кода:
tensor([
[ 1.0000, 2.0000, 3.0000],
[ 7.0000, 8.0000, 9.0000]
])
Входной тензор был разделён пополам по последней оси: первая половина (1, 2, 3) и (7, 8, 9)
осталась без изменений, а вторая половина (4, 5, 6) и (10, 11, 12) была преобразована через sigmoid.
Затем произошло поэлементное умножение.
Пример использования в нейронной сети
Рассмотрим встраивание GLU в последовательную модель:
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 8),
nn.GLU(dim=-1),
nn.Linear(4, 2)
)
x = torch.randn(5, 10)
res = model(x)
print(res.shape)
Результат выполнения кода:
torch.Size([5, 2])
Сначала линейный слой преобразует вход размерности (5, 10) в (5, 8).
Затем GLU разделяет размерность 8 на две части по 4 и применяет механизм гейтирования,
на выходе получается тензор (5, 4). Финальный линейный слой уменьшает размерность до (5, 2).
Пример с указанием оси
Продемонстрируем работу GLU с трёхмерным тензором, указав ось для разделения:
import torch
t = torch.randn(2, 6, 4)
glu = torch.nn.GLU(dim=1)
res = glu(t)
print(res.shape)
Результат выполнения кода:
torch.Size([2, 3, 4])
При указании dim=1 разделение происходит по оси с размерностью 6,
в результате размерность этой оси уменьшается вдвое (с 6 до 3).