Трансформеры-энкодеры

Трансформерные модели с PyTorch

James Chapman

Curriculum Manager, DataCamp

Оригинальный трансформер

Архитектура трансформера из академической статьи «Attention Is All You Need».

Трансформерные модели с PyTorch

Оригинальный трансформер

Архитектура оригинального трансформера

Трансформерные модели с PyTorch

Трансформеры только с энкодером

Архитектура трансформера-энкодера

Тело трансформера: стек энкодеров из N слоёв

Слой энкодера

  • Многоголовое самовнимание
  • Полносвязный (под)слой
  • Нормализация слоёв, дропаут

Голова трансформера

Трансформерные модели с PyTorch

Трансформеры только с энкодером

Архитектура трансформера-энкодера

Тело трансформера: стек энкодеров из N слоёв

Слой энкодера

  • Многоголовое самовнимание
  • Полносвязный (под)слой
  • Нормализация слоёв, дропаут

Голова трансформера: обрабатывает закодированные входы для получения предсказания

Задача с учителем: классификация, регрессия

Трансформерные модели с PyTorch

Полносвязный подслой в слоях энкодера

Полносвязный подслой после внимания

class FeedForwardSubLayer(nn.Module):
    def __init__(self, d_model, d_ff):
        super().__init__()
        self.fc1 = nn.Linear(d_model, d_ff)
        self.fc2 = nn.Linear(d_ff, d_model)
        self.relu = nn.ReLU()


def forward(self, x): return self.fc2(self.relu(self.fc1(x)))

2 x полносвязных слоя + активация ReLU

  • d_ff: размерность между линейными слоями

  • forward(): обрабатывает выходы механизма внимания для извлечения сложных нелинейных зависимостей

Трансформерные модели с PyTorch

Слой энкодера

class EncoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super().__init__()
        self.self_attn = MultiHeadAttention(d_model, num_heads)
        self.ff_sublayer = FeedForwardSubLayer(d_model, d_ff)

self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.dropout = nn.Dropout(dropout)
def forward(self, x, src_mask): attn_output = self.self_attn(x, x, x, src_mask) x = self.norm1(x + self.dropout(attn_output)) ff_output = self.ff_sublayer(x) x = self.norm2(x + self.dropout(ff_output)) return x

Слой энкодера

  • Многоголовое самовнимание
  • Полносвязный подслой
  • Нормализация слоёв и дропаут

forward():

  • mask исключает обработку токенов заполнения
Трансформерные модели с PyTorch

Маскирование в механизме внимания

Последовательности с заполнением

Маска заполнения в самовнимании

Трансформерные модели с PyTorch

Тело трансформера-энкодера

class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, d_model, num_layers, num_heads, d_ff, dropout, max_seq_length):
        super().__init__()

self.embedding = InputEmbeddings(vocab_size, d_model)
self.positional_encoding = PositionalEncoding(d_model, max_seq_length)
self.layers = nn.ModuleList( [EncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)] )
def forward(self, x, src_mask): x = self.embedding(x) x = self.positional_encoding(x) for layer in self.layers: x = layer(x, src_mask) return x
Трансформерные модели с PyTorch

Голова трансформера-энкодера

class ClassifierHead(nn.Module):
    def __init__(self, d_model, num_classes):
        super().__init__()
        self.fc = nn.Linear(d_model, num_classes)

    def forward(self, x):
        logits = self.fc(x)
        return F.log_softmax(logits, dim=-1)
class RegressionHead(nn.Module):
    def __init__(self, d_model, output_dim):
        super().__init__()
        self.fc = nn.Linear(d_model, output_dim)

    def forward(self, x):
        return self.fc(x)

Голова классификатора

  • Задачи: классификация текста, анализ тональности, NER, извлекающий QA и др.
  • fc: полносвязный линейный слой
    • Преобразует скрытые состояния энкодера в вероятности num_classes классов

Голова регрессии

  • Задачи: оценка читаемости текста, языковой сложности и др.
    • output_dim равен 1 при предсказании одного числового значения
Трансформерные модели с PyTorch

Давайте потренируемся!

Трансформерные модели с PyTorch

Preparing Video For Download...