編碼器—解碼器式 Transformer

Transformer Models with PyTorch

James Chapman

Curriculum Manager, DataCamp

編碼器遇上解碼器

原始 Transformer 架構

Transformer Models with PyTorch

編碼器遇上解碼器

合併的編碼器與解碼器

Transformer Models with PyTorch

交叉注意力機制

 

  1. 解碼器 處理的資訊
  2. 來自 編碼器 區塊的最終隱藏狀態

 

交叉注意力範例

具交叉注意力的解碼器

Transformer Models with PyTorch

修改 DecoderLayer

 

  1. 解碼器 全程處理的資訊
  2. 來自 編碼器 區塊的最終隱藏狀態

 

  • x解碼器資訊流,作為交叉注意力的 query
  • y編碼器輸出,作為交叉注意力的 keyvalues
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)) ...
Transformer Models with PyTorch

修改 DecoderTransformer

 

僅解碼器(decoder-only)
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)

 

編碼器—解碼器(encoder-decoder)
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)
Transformer Models with PyTorch

編碼器遇上解碼器

合併的編碼器與解碼器

Transformer Models with PyTorch

Transformer head

 

翻譯的輸出範例

  • jugar(_玩_):0.03
  • viajar(_旅行_):0.96
  • dormir(_睡覺_):0.01

其他任務可能需要不同的 activation

帶有 Transformer head 的解碼器

Transformer Models with PyTorch

整合全貌!

整體編碼器—解碼器 Transformer

Transformer Models with 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
Transformer Models with PyTorch

一起來練習吧!

Transformer Models with PyTorch

Preparing Video For Download...