Pular para conteúdo

Aula 17 - Arquitetura de Modelos de Linguagem (Transformers) 🤖

Objetivo Pedagógico

Objetivo: Compreensão da arquitetura Transformer (Vaswani et al., 2017), Mecanismo de Atenção Auto-Supervisionada (Self-Attention), Codificadores Posicionais (RoPE) e fluxo de inferência autoregressivo em LLMs.


📑 1. Fundamentos Teóricos & Análise Técnica

A revolução contemporânea da Inteligência Artificial Generativa e dos Grandes Modelos de Linguagem (Large Language Models - LLMs) é impulsionada pela arquitetura Transformer ("Attention Is All You Need", 2017).

O elemento revolucionário que aposentou as redes recorrentes é o Mecanismo de Atenção com Produto Escalar Escalonado (Scaled Dot-Product Attention): Em vez de comprimir um texto sequencialmente em um único vetor de estado, o modelo avalia as relações de dependência direta entre todos os tokens simultaneamente: $\(\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V\)$ Onde: - \(Q\) (Query): O que o token atual está procurando. - \(K\) (Key): O que cada outro token na sequência tem a oferecer. - \(V\) (Value): O conteúdo informacional real transportado pelo token. - \(\sqrt{d_k}\): Fator de escalonamento que impede que o produto escalar atinja magnitudes extremas que saturariam a derivada da função softmax.

Em modelos autoregressivos como GPT, Claude e Llama (Decoder-Only), uma máscara triangular superior (Causal Masking) impede que um token veja o futuro durante a geração de texto.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    Input["Tokens de Entrada: [O, gato, sentou]"] --> Emb["Embeddings + Rotary Position Embeddings (RoPE)"]
    Emb --> QKV["Projeções Lineares: Q, K, V"]
    QKV --> MultiHead["Multi-Head Attention (Divisão em H cabeças paralelas)"]
    MultiHead --> Softmax["Matriz de Atenção (Softmax com Máscara Causal)"]
    Softmax --> FFN["Feed-Forward Network (SwiGLU / MLP)"]
    FFN --> RMSNorm["RMSNorm + Conexões Residuais"]
    RMSNorm --> NextToken["Distribuição de Probabilidade do Próximo Token"]
    style Input fill:#e1f5fe,stroke:#01579b
    style QKV fill:#fff3e0,stroke:#e65100
    style MultiHead fill:#e8f5e9,stroke:#2e7d32
    style NextToken fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Atenção Multi-Cabeça (Multi-Head Attention): Permite ao modelo focar simultaneamente em diferentes aspectos (sintáticos, semânticos, temporais). - Codificação Posicional com RoPE: Rotação de vetores no espaço complexo para preservar a distância relativa entre palavras sem degradar com sequências longas. - Geração Autoregressiva Token a Token: Cada novo token gerado é anexado à entrada para a próxima iteração com auxílio de KV-Cache. - Leis de Escala (Scaling Laws): A previsibilidade matemática de que o aumento de parâmetros e dados de pré-treino gera saltos qualitativos de raciocínio.


🛠️ 2. Implementação Prática em LLMs, Transformers e Atenção Multi-Cabeça

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// self_attention_math.py (Implementação Numérica de Scaled Dot-Product Attention)
import torch
import torch.nn.functional as F
import math

def scaled_dot_product_attention(Q: torch.Tensor, K: torch.Tensor, V: torch.Tensor, mask: torch.Tensor = None):
    d_k = Q.size(-1)
    # 1. Produto escalar entre Queries e Keys
    scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)

    # 2. Aplicação de Máscara Causal (se fornecida)
    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)

    # 3. Normalização Softmax para obter pesos de atenção
    attention_weights = F.softmax(scores, dim=-1)

    # 4. Multiplicação pelos Valores
    output = torch.matmul(attention_weights, V)
    return output, attention_weights

# Exemplo: 1 sequência de 4 tokens com dimensão 8
Q = torch.randn(1, 4, 8)
K = torch.randn(1, 4, 8)
V = torch.randn(1, 4, 8)
out, weights = scaled_dot_product_attention(Q, K, V)
print("Formato da Saída da Atenção:", out.shape) # (1, 4, 8)

💡 Análise Passo a Passo do Código

  1. Divisão por sqrt(d_k): Estabiliza os gradientes da softmax durante o treinamento em ponto flutuante.
  2. Masked Fill com -1e9: Força probabilidade zero nos tokens futuros para garantir comportamento puramente autoregressivo.
  3. Matmul com Valores: Gera uma nova representação de cada token enriquecida contextualmente pelas outras palavras da sentença.

🎯 3. Próximos Passos & Sequência Didática