Arquitetura Transformers e Attention

Meta: explicar o mecanismo de self-attention, por que a posição precisa ser injetada, e o que mudou entre o paper de 2017 e os LLMs que você usa hoje.

Resumo em 3 frases

  1. Self-attention resolve cada token olhando para todos os outros e misturando os valores com pesos — sem recorrência e sem convolução, o que permite treino massivamente paralelo.
  2. A equação é softmax(QKᵀ/√d_k)V; a divisão por √d_k existe só para o softmax não saturar, e a posição entra por fora porque atenção, sozinha, não sabe ordem.
  3. Do paper original até hoje: a mesma receita, mas com RMSNorm, RoPE, SwiGLU, GQA e FlashAttention — quase todas otimizações de constante, não de complexidade.

O problema que o Transformer resolveu

Antes de 2017, o estado da arte eram RNN/LSTM, lidos um passo por vez. Dois problemas:

  1. Não paralelizava no treino. A posição t depende do estado em t−1, então a GPU ficava ociosa. Nenhum modelo grande era treinável.
  2. Dependência de longo alcance. Levar informação da primeira palavra até a última atravessava um caminho longo e sujeta a desaparecimento de gradiente.

Vaswani et al. (2017) removem recorrência e convolução inteiramente. Daí o nome.

Self-attention

Cada token é projetado em três vetores por matrizes treináveis:

  • Q (query) — o que estou procurando
  • K (key) — o que eu tenho a oferecer
  • V (value) — o que eu entrego se houver interesse

Leia passo a passo:

  1. — matriz de scores de compatibilidade entre cada par (token que pergunta, token que responde).
  2. Divide por — scaling. Com grande os produtos têm variância alta e o softmax satura (gradiente morre). A divisão normaliza.
  3. softmax — cada linha vira distribuição; os pesos somam 1. Esses são os attention weights.
  4. Multiplica por — a saída de cada posição é a média ponderada dos valores, com o peso dado por quanto cada token importa.

O ponto 4 é o coração da coisa: cada token renova o próprio significado usando o contexto inteiro, em uma única operação.

Multi-head

Uma cabeça só é forçada a aprender uma única noção de relação. Com h cabeças em paralelo, cada uma com projeções próprias, o modelo pode capturar relações diferentes (dependência sintática em uma, coreferência em outra).

⚠️ Armadilha: não há roteamento, e a especialização é emergente, não projetada. Nenhum sistema pode assumir “a cabeça 3 faz coreferência” — isso não sobrevive a um fine-tune. E attention weights não são explicações.

Máscara causal

Em modelos decoder-only, ao prever o token na posição t o modelo só pode ver posições ≤ t. Isso é a máscara causal: soma-se ao triângulo superior dos scores antes do softmax, zerando qualquer dependência do futuro.

Sem ela, o modelo “veria a resposta enquanto aprende a prevê-la” e a loss cairia para quase zero sem nenhum aprendizado real.

Modelos encoder-only (BERT) não usam máscara: veem o texto inteiro dos dois lados.

Positional encoding

Atenção é permutacional: reordenar as entradas apenas reordena as saídas. O modelo não tem ideia do que é “primeiro”.

MétodoComo funcionaOnde é usado
Sinusoidal (2017)somas de senos com frequências decrescentes, por fórmula fechadapaper original
Absoluto aprendidoum vetor de posição por índiceBERT, GPT-2
RoPE (Su et al., 2021)rotaciona Q e K por ângulos dependentes da posiçãoLLaMA, Mistral, Gemma, Qwen

RoPE virou o padrão porque o produto passa a codificar distância relativa de forma natural, e a extrapolação para sequências mais longas fica mais bem comportada.

Bloco residual + normalização

Cada subcamada é embrulhada em x + Sublayer(x). O residual dá um caminho direto para o gradiente e permite empilhar dezenas de camadas.

  • Pre-LayerNorm (padrão dos LLMs atuais): normaliza antes da subcamada, com um segundo residual. Mais fácil de treinar que o post-LN do paper original.
  • RMSNorm (Zhang & Sennrich, 2019): em vez de subtrair a média e dividir pelo desvio padrão, apenas divide pela raiz da média dos quadrados. A recentração foi removida por ser dispensável. Mais barato, qualidade equivalente — padrão em LLaMA e derivados.

Feed-forward

Cada posição passa, independentemente das outras, por um MLP de duas camadas com expansão — tipicamente no paper original. Aqui mora a maior parte dos parâmetros do modelo e é onde a rede ajusta o conhecimento.

Variante atual: SwiGLU (Shazeer, 2020) — uma porta multiplicativa no lugar do ReLU/GELU simples. Para manter o número de parâmetros, a camada oculta encolhe de para cerca de (regra do LLaMA).

Famílias de arquitetura

FamíliaAtençãoExemplosGera texto?
Encoder-onlybidirecionalBERT, RoBERTa❌ (representação)
Decoder-onlycausalGPT, LLaMA, Mistral✅
Encoder-decoderencoder bidirecional + decoder cross-atendendoT5, BART, transformer original✅

Os LLMs de chat que você conhece são decoder-only.

O que mudou desde 2018

ComponenteOriginalModerno
Normalizaçãopost-LayerNormRMSNorm (pre-norm)
Posiçãosinusoidal / absolutoRoPE
MLPReLU, 4dSwiGLU, 8d/3
Cabeças KVmulti-head densoGQA/MQA (Ainslie et al., 2023)
Implementaçãomatriz de atenção materializadaFlashAttention (Dao et al., 2022)
Dropoutpresente em tudoremovido em vários pontos

Ressalva importante: GQA e FlashAttention otimizam constantes, não complexidade. GQA reduz o número de cabeças K/V (encolhe o KV Cache, enorme ganho no decode); FlashAttention faz tiling e é IO-aware, mantendo a atenção exata (mesma matemática). As duas compram fatores — e fatores se esgotam. Só uma mudança de complexidade (atenção esparsa/sliding window, ou Paper - Mamba) altera o regime.

O teto: O(n²)

A atenção é quadrática no comprimento da sequência. Dobrar o contexto dobra o custo. Reações conhecidas:

  1. Otimizar sem mudar a matemática — FlashAttention.
  2. Atenção esparsa / sliding window — cada token só olha w vizinhos: custo .
  3. Atenção linear — reordena operações para complexidade linear.
  4. Trocar de paradigma — Mamba (Gu & Dao, 2023) usa state space models seletivos com complexidade linear.

Perguntas para validar

  1. Por que a divisão por é necessária? O que acontece sem ela?
  2. Se eu remover a máscara causal de um decoder-only, o que a loss faz? Por quê?
  3. RoPE e codificação posicional absoluta: o que cada uma faz melhor?
  4. Em um contexto de 1M de tokens, GQA e FlashAttention resolvem o problema? Justifique separando tempo de memória.

Referências

Ver também