解码器 Transformer

使用 PyTorch 的 Transformer 模型

James Chapman

Curriculum Manager, DataCamp

从原始到仅解码器的 Transformer

原始 Transformer 架构

使用 PyTorch 的 Transformer 模型

从原始到仅解码器的 Transformer

仅解码器 Transformer 架构

自回归序列生成: 文本生成与补全

使用 PyTorch 的 Transformer 模型

从原始到仅解码器的 Transformer

仅解码器 Transformer 架构

自回归序列生成: 文本生成与补全

掩码多头自注意力

  • 隐藏序列中较后的 token
使用 PyTorch 的 Transformer 模型

从原始到仅解码器的 Transformer

仅解码器 Transformer 架构

自回归序列生成: 文本生成与补全

掩码多头自注意力

  • 隐藏序列中较后的 token

仅解码器 Transformer 头部

  • 线性层 + 词表 Softmax
  • 预测最_可能_的下一个 token
使用 PyTorch 的 Transformer 模型

掩码自注意力/因果注意力

掩码自注意力

  • 自回归因果行为的关键
  • 三角形(因果)注意力掩码
使用 PyTorch 的 Transformer 模型

掩码自注意力/因果注意力

掩码自注意力

  • 自回归因果行为的关键
  • 三角形(因果)注意力掩码
  • 仅关注序列中先前的 token
使用 PyTorch 的 Transformer 模型

掩码自注意力/因果注意力

掩码自注意力

tgt_mask = (1 - torch.triu(
  torch.ones(1, seq_len, seq_len), diagonal=1)
).bool()
  • 自回归因果行为的关键
  • 三角形(因果)注意力掩码
  • 仅关注序列中先前的 token

    • "favorite""orange""is""my""favorite"
  • 强制因果注意力:预测下一个要生成的词,如 "fruit"

使用 PyTorch 的 Transformer 模型

解码器层

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.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, tgt_mask):
        attn_output = self.self_attn(x, x, x, tgt_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
使用 PyTorch 的 Transformer 模型

解码器 Transformer 主体与头部

class TransformerDecoder(nn.Module):
    def __init__(self, vocab_size, d_model, num_layers, num_heads, d_ff, dropout, max_seq_length):
        super(TransformerDecoder, self).__init__()
        self.embedding = InputEmbeddings(vocab_size, d_model)
        self.positional_encoding = PositionalEncoding(d_model, max_seq_length)
        self.layers = nn.ModuleList([DecoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])

self.fc = nn.Linear(d_model, vocab_size)
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)
  • self.fc:具有 vocab_size 个神经元的输出线性层
  • 在前向传播中加入 self.fc 和 softmax 激活
使用 PyTorch 的 Transformer 模型

实例化仅解码器 Transformer

decoder = TransformerDecoder(vocab_size, d_model, num_layers, num_heads, d_ff, dropout, max_seq_length=seq_length)

output = decoder(input_sequence, tgt_mask)
tensor([[[ -9.4692,  -9.8429,  -9.3077,  ...,  -9.9523, -10.2669,  -9.7084],
         [ -9.1556,  -9.6133, -10.0923,  ...,  -9.3810,  -9.0420,  -9.1780],
         ...,
         [ -9.5327, -10.3534,  -9.8443,  ...,  -9.8170,  -8.8491,  -8.8322],
         [ -9.6086,  -9.6336, -10.1595,  ...,  -9.8550,  -9.9955,  -8.7121]],

        [[ -9.5865,  -8.0360,  -8.5056,  ...,  -9.9855,  -9.5677,  -9.0352],
         [ -9.7213,  -8.6451,  -8.3779,  ...,  -9.2994,  -9.2601,  -9.8509],
         ...,
         [ -9.0471,  -9.7410, -10.0160,  ..., -10.0195,  -9.4651,  -8.9605],
         [ -9.5767, -10.2692,  -8.8394,  ...,  -8.3458,  -9.1479, -10.0650]]],
       grad_fn=<LogSoftmaxBackward0>)
使用 PyTorch 的 Transformer 模型

Passons à la pratique !

使用 PyTorch 的 Transformer 模型

Preparing Video For Download...