Класс TransformerDecoderLayer
Класс TransformerDecoderLayer реализует один слой стандартного декодера трансформера.
Он принимает на вход последовательность, обрабатывает её через механизм самовнимания,
затем через механизм перекрёстного внимания с учётом выходов энкодера,
после чего пропускает через полносвязную сеть прямого распространения.
Слой поддерживает маскирование, выпадающие слои, предварительную нормализацию и другие настройки.
Синтаксис
torch.nn.TransformerDecoderLayer(
d_model,
nhead,
dim_feedforward=2048,
dropout=0.1,
activation='relu',
layer_norm_eps=1e-5,
batch_first=False,
norm_first=False,
bias=True,
dtype=None,
device=None
)
Основные параметры конструктора:
-
d_model- размерность признакового пространства; -
nhead- количество голов внимания; -
dim_feedforward- размерность скрытого слоя полносвязной сети; -
dropout- вероятность выпадения нейронов; -
activation- функция активации ('relu' или 'gelu'); -
layer_norm_eps- эпсилон для слоевой нормализации; -
batch_first- еслиTrue, то размерности (batch, seq, feature); -
norm_first- еслиTrue, то нормализация применяется до основных операций.
Пример
Создадим слой декодера трансформера с размерностью признаков 512
и восемью головами внимания:
import torch
layer = torch.nn.TransformerDecoderLayer(
d_model=512,
nhead=8,
dim_feedforward=2048,
dropout=0.1
)
print(layer)
Результат выполнения кода:
TransformerDecoderLayer(
(self_attn): MultiheadAttention(
(out_proj): NonDynamicallyQuantizableLinear(in_features=512, out_features=512, bias=True)
)
(multihead_attn): MultiheadAttention(
(out_proj): NonDynamicallyQuantizableLinear(in_features=512, out_features=512, bias=True)
)
(linear1): Linear(in_features=512, out_features=2048, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
(linear2): Linear(in_features=2048, out_features=512, bias=True)
(norm1): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(norm2): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(norm3): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(dropout1): Dropout(p=0.1, inplace=False)
(dropout2): Dropout(p=0.1, inplace=False)
(dropout3): Dropout(p=0.1, inplace=False)
)
Пример
Применим слой декодера к случайным данным в формате (seq, batch, feature):
import torch
torch.manual_seed(0)
layer = torch.nn.TransformerDecoderLayer(
d_model=512,
nhead=8
)
tgt = torch.rand(10, 2, 512) # (seq_len, batch, features)
memory = torch.rand(15, 2, 512) # (seq_len, batch, features)
res = layer(tgt, memory)
print(res.shape)
Результат выполнения кода:
torch.Size([10, 2, 512])
Пример
Используем слой с масками для предотвращения подсматривания в будущее:
import torch
torch.manual_seed(0)
layer = torch.nn.TransformerDecoderLayer(
d_model=512,
nhead=8
)
tgt = torch.rand(5, 3, 512)
memory = torch.rand(7, 3, 512)
tgt_mask = torch.triu(
torch.ones(5, 5),
diagonal=1
).bool()
res = layer(
tgt,
memory,
tgt_mask=tgt_mask
)
print(res.shape)
Результат выполнения кода:
torch.Size([5, 3, 512])
Пример
Создадим слой с параметром batch_first=True для более удобного формата:
import torch
torch.manual_seed(0)
layer = torch.nn.TransformerDecoderLayer(
d_model=512,
nhead=8,
batch_first=True,
norm_first=True
)
tgt = torch.rand(2, 10, 512) # (batch, seq_len, features)
memory = torch.rand(2, 15, 512) # (batch, seq_len, features)
res = layer(tgt, memory)
print(res.shape)
Результат выполнения кода:
torch.Size([2, 10, 512])
Пример
Применим слой с функцией активации GELU вместо стандартной ReLU:
import torch
torch.manual_seed(0)
layer = torch.nn.TransformerDecoderLayer(
d_model=256,
nhead=4,
dim_feedforward=1024,
dropout=0.2,
activation='gelu'
)
tgt = torch.rand(8, 4, 256)
memory = torch.rand(12, 4, 256)
res = layer(tgt, memory)
print(res.shape)
Результат выполнения кода:
torch.Size([8, 4, 256])
Смотрите также
-
класс
TransformerDecoder,
который представляет собой полный декодер из нескольких слоёв -
класс
TransformerEncoderLayer,
который реализует слой энкодера трансформера -
класс
Transformer,
который объединяет энкодер и декодер в одну модель -
класс
MultiheadAttention,
который реализует многоголовое внимание