Трансформеры «кодировщик-декодировщик»

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

James Chapman

Curriculum Manager, DataCamp

Кодировщик встречает декодировщик

Исходная архитектура трансформера

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

Кодировщик встречает декодировщик

Кодировщик и декодировщик вместе

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

Механизм перекрёстного внимания

 

  1. Информация обрабатывается в декодировщике
  2. Финальные скрытые состояния блока кодировщика

 

Пример перекрёстного внимания

Декодировщик с перекрёстным вниманием

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

Модификация DecoderLayer

 

  1. Информация обрабатывается в декодировщике
  2. Финальные скрытые состояния блока кодировщика

 

  • x: поток информации декодировщика, становится запросом перекрёстного внимания
  • y: выход кодировщика, становится ключом и значениями перекрёстного внимания
class DecoderLayer(nn.Module):
    def __init__(self, d_model, num_heads, d_ff, dropout):
        super().__init__()
        self.self_attn = MultiHeadAttention(
                          d_model, num_heads)
        self.cross_attn = MultiHeadAttention(
                          d_model, num_heads)
        ...


def forward(self, x, y, tgt_mask, cross_mask): self_attn_output = self.self_attn(x, x, x, tgt_mask) x = self.norm1(x + self.dropout(self_attn_output)) cross_attn_output = self.cross_attn(x, y, y, cross_mask) x = self.norm2(x + self.dropout(cross_attn_output)) ...
Трансформерные модели с PyTorch

Модификация DecoderTransformer

 

Только декодировщик
class TransformerDecoder(nn.Module):
...
def forward(self, x, tgt_mask):
    x = self.embedding(x)
    x = self.positional_encoding(x)
    for layer in self.layers:
        x = layer(x, tgt_mask)
    x = self.fc(x)
    return F.log_softmax(x, dim=-1)

 

Кодировщик-декодировщик
class TransformerDecoder(nn.Module):
...

def forward(self, x, y, tgt_mask, cross_mask): x = self.embedding(x) x = self.positional_encoding(x) for layer in self.layers: x = layer(x, y, tgt_mask, cross_mask) x = self.fc(x) return F.log_softmax(x, dim=-1)
Трансформерные модели с PyTorch

Кодировщик встречает декодировщик

Кодировщик и декодировщик вместе

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

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

 

Пример выходных данных для перевода

  • jugar (играть): 0,03
  • viajar (путешествовать): 0,96
  • dormir (спать): 0,01

Для других задач могут потребоваться иные функции активации

Декодировщик с головой трансформера

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

Всё вместе!

Общая схема трансформера «кодировщик-декодировщик»

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

Всё вместе!

class InputEmbeddings(nn.Module):
  ...  
class PositionalEncoding(nn.Module):
  ...  
class MultiHeadAttention(nn.Module):
  ...
class FeedForwardSubLayer(nn.Module):
  ...  
class EncoderLayer(nn.Module):
  ...
class DecoderLayer(nn.Module):
  ...
class TransformerEncoder(nn.Module):
  ...
class TransformerDecoder(nn.Module):
  ...
class ClassificationHead(nn.Module):
  ...
class Transformer(nn.Module):
    def __init__(self, vocab_size, d_model, num_heads, 
                 num_layers, d_ff, max_seq_len, dropout):
        super().__init__()


self.encoder = TransformerEncoder(vocab_size, d_model, num_heads, num_layers, d_ff, dropout, max_seq_len) self.decoder = TransformerDecoder(vocab_size, d_model, num_heads, num_layers, d_ff, dropout, max_seq_len)
def forward(self, x, src_mask, tgt_mask, cross_mask): encoder_output = self.encoder(x, src_mask) decoder_output = self.decoder(x, encoder_output, tgt_mask, cross_mask) return decoder_output
Трансформерные модели с PyTorch

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

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

Preparing Video For Download...