Класс TransformerEncoder
Класс TransformerEncoder представляет собой стек из нескольких слоёв
кодировщика трансформера. Он принимает на вход последовательность
векторов и применяет к ней механизм самовнимания и полносвязные слои.
Первый параметр - слой кодировщика TransformerEncoderLayer,
второй - количество слоёв num_layers. Класс также поддерживает
дополнительные параметры, такие как norm для нормализации на
выходе и enable_nested_tensor для оптимизации.
Синтаксис
torch.nn.TransformerEncoder(
encoder_layer,
num_layers,
norm=None,
enable_nested_tensor=True,
mask=None
)
Основные параметры
Рассмотрим основные параметры конструктора:
-
encoder_layer- экземпляр классаTransformerEncoderLayer, который будет использоваться в каждом блоке кодировщика. -
num_layers- количество слоёв кодировщика в стеке. -
norm- слой нормализации, применяемый после всех слоёв кодировщика (обычноLayerNorm). -
enable_nested_tensor- флаг, позволяющий использовать вложенные тензоры для оптимизации производительности.
Пример использования
Создадим простой кодировщик трансформера и применим его к последовательности:
import torch
import torch.nn as nn
# Parameters
d_model = 512
nhead = 8
num_layers = 6
seq_len = 10
batch_size = 32
# Create encoder layer and encoder
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
batch_first=True
)
encoder = nn.TransformerEncoder(
encoder_layer,
num_layers=num_layers
)
# Input tensor
src = torch.randn(batch_size, seq_len, d_model)
# Forward pass
output = encoder(src)
print(output.shape)
Результат выполнения кода:
torch.Size([32, 10, 512])
Пример с маской
Кодировщик поддерживает маскирование для исключения определённых
элементов последовательности. Передадим маску в метод forward:
import torch
import torch.nn as nn
torch.manual_seed(0)
# Parameters
d_model = 64
nhead = 4
num_layers = 2
seq_len = 8
batch_size = 16
# Create encoder
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
batch_first=True
)
encoder = nn.TransformerEncoder(
encoder_layer,
num_layers=num_layers
)
# Input and mask
src = torch.randn(batch_size, seq_len, d_model)
src_mask = torch.zeros(seq_len, seq_len)
src_mask[3, 5] = float('-inf') # Mask one position
# Forward pass with mask
output = encoder(src, mask=src_mask)
print(output.shape)
Результат выполнения кода:
torch.Size([16, 8, 64])
Пример с маской ключей
Также можно использовать маску ключей для игнорирования определённых
позиций в последовательности. Передадим маску в метод forward:
import torch
import torch.nn as nn
torch.manual_seed(1)
# Parameters
d_model = 128
nhead = 8
num_layers = 3
seq_len = 12
batch_size = 8
# Create encoder
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
batch_first=True
)
encoder = nn.TransformerEncoder(
encoder_layer,
num_layers=num_layers
)
# Input and key padding mask
src = torch.randn(batch_size, seq_len, d_model)
src_key_padding_mask = torch.zeros(batch_size, seq_len, dtype=torch.bool)
src_key_padding_mask[:, 5:9] = True # Pad positions
# Forward pass with key padding mask
output = encoder(
src,
mask=None,
src_key_padding_mask=src_key_padding_mask
)
print(output.shape)
Результат выполнения кода:
torch.Size([8, 12, 128])
Пример с нормализацией
Добавим слой нормализации на выходе кодировщика для стабилизации
обучения. Передадим слой LayerNorm в параметр norm:
import torch
import torch.nn as nn
torch.manual_seed(2)
# Parameters
d_model = 256
nhead = 4
num_layers = 4
seq_len = 16
batch_size = 4
# Create encoder layer
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
batch_first=True
)
# Create norm layer
norm = nn.LayerNorm(d_model)
# Create encoder with norm
encoder = nn.TransformerEncoder(
encoder_layer,
num_layers=num_layers,
norm=norm
)
# Input tensor
src = torch.randn(batch_size, seq_len, d_model)
# Forward pass
output = encoder(src)
print(output.shape)
Результат выполнения кода:
torch.Size([4, 16, 256])
Смотрите также
-
класс
TransformerEncoderLayer,
который представляет один слой кодировщика трансформера -
класс
Transformer,
который объединяет кодировщик и декодировщик в одну модель -
класс
TransformerDecoder,
который реализует стек слоёв декодировщика трансформера -
класс
MultiheadAttention,
который реализует механизм многоголового самовнимания