Класс TransformerEncoderLayer
Класс TransformerEncoderLayer реализует один слой стандартного энкодера трансформера.
Слой состоит из двух основных подблоков: механизма многоголового внимания (self-attention)
и полносвязной сети (feed-forward network). Каждый подблок сопровождается слоем нормализации
и остаточной связью. Первым параметром в конструктор передаётся размерность признаков
модели (d_model), вторым - количество голов внимания (nhead).
Дополнительные параметры позволяют настраивать размерность внутреннего слоя,
функции активации, дропаут и другие аспекты.
Синтаксис
torch.nn.TransformerEncoderLayer(
d_model,
nhead,
dim_feedforward=2048,
dropout=0.1,
activation='relu',
layer_norm_eps=1e-5,
batch_first=False,
norm_first=False,
bias=True,
device=None,
dtype=None
)
Основные параметры
Рассмотрим ключевые параметры конструктора TransformerEncoderLayer:
-
d_model- размерность признаков входного тензора -
nhead- количество голов в механизме многоголового внимания -
dim_feedforward- размерность внутреннего слоя полносвязной сети (по умолчанию 2048) -
dropout- коэффициент дропаута (по умолчанию 0.1) -
activation- функция активации полносвязной сети ('relu' или 'gelu') -
batch_first- еслиTrue, входной тензор имеет форму (batch, seq, feature)
Пример
Создадим слой энкодера трансформера с размерностью признаков 512 и 8 головами внимания:
import torch
import torch.nn as nn
encoder_layer = nn.TransformerEncoderLayer(
d_model=512,
nhead=8,
dim_feedforward=2048,
dropout=0.1,
activation='relu'
)
print(encoder_layer)
Результат выполнения кода:
"TransformerEncoderLayer(...)"
Пример
Создадим слой с параметром batch_first=True и применим его к входным данным:
import torch
import torch.nn as nn
torch.manual_seed(0)
encoder_layer = nn.TransformerEncoderLayer(
d_model=512,
nhead=8,
batch_first=True
)
t = torch.randn(4, 10, 512)
res = encoder_layer(t)
print(res.shape)
Результат выполнения кода:
torch.Size([4, 10, 512])
Пример
Используем слой с функцией активации gelu и коэффициентом дропаута 0.2:
import torch
import torch.nn as nn
torch.manual_seed(0)
encoder_layer = nn.TransformerEncoderLayer(
d_model=256,
nhead=4,
dim_feedforward=1024,
dropout=0.2,
activation='gelu',
batch_first=True
)
t = torch.randn(2, 8, 256)
res = encoder_layer(t)
print(res[0, 0, :5])
Результат выполнения кода:
tensor([-0.0992, -0.1592, -0.1421, 0.0935, -0.2088])
Смотрите также
-
класс
TransformerEncoder,
который объединяет несколько слоёв энкодеров в последовательную цепочку -
класс
TransformerDecoderLayer,
который реализует один слой декодера трансформера -
класс
MultiheadAttention,
который является основой механизма внимания внутри слоя -
класс
LayerNorm,
который используется для нормализации внутри слоя