Ir para o conteúdo

Overview

Uma convolução decide de antemão quais entradas podem influenciar quais saídas: as vizinhas, sempre, com os mesmos pesos. A atenção faz a escolha oposta. Ela calcula as forças de conexão a partir dos dados, em tempo de execução, para cada par de posições.

Esse é o mecanismo inteiro e vale guardá-lo como definição de uma linha: atenção é uma camada densa cujos pesos são uma função da entrada. Todo o resto deste capítulo — o \(\sqrt{d_k}\), as máscaras, as múltiplas cabeças, o cache que domina sua conta de inferência — decorre dessa frase e do custo de levá-la a sério.

Historicamente ela chegou como remendo. A tradução sequência-a-sequência comprimia a frase de origem inteira em um único vetor e frases longas pioravam quanto mais longas fossem; Bahdanau et al. deixaram o decodificador olhar de volta para cada posição da origem1. Três anos depois o remendo havia devorado a arquitetura: "Attention Is All You Need" removeu a recorrência e manteve apenas o olhar de volta2.

Roteiro do capítulo

Este capítulo e o próximo acompanham uma frase do texto cru até a palavra que vem depois: "o gato subiu no" → " telhado". Cada passo tem a sua página, cada número nela pode ser conferido à mão e cada página começa dos números que a anterior produziu. Esta página diz por que a atenção existe e reúne os slides, o laboratório e os pontos principais.

Do texto à próxima palavra, passo a passo

O caminho do texto ao próximo token em sete passos: tokens, embeddings, query/key/value, máscara e cabeças, o bloco, a saída e a geração. ATENÇÃO TRANSFORMERS Tokenstexto → ids Embeddingsids → X Q · K · Vuma cabeça Máscaraduas cabeças BlocoLN · MLP Saídalogits → p Geraçãoescolher texto → → próximo token

Um modelo de linguagem nunca vê letras. O texto é cortado em tokens, cada token vira um vetor, a atenção deixa esses vetores trocarem informação e no fim o vetor do último token vira uma probabilidade para cada token que pode vir a seguir. São sete passos, cada um feito na sua página:

Passo O que entra → o que sai Página
1 texto → pedaços → ids inteiros Tokens
2 ids → um vetor por token, mais a posição Embeddings
3 vetores → uma cabeça de atenção, à mão Query, key, value
4 a máscara causal e duas cabeças lado a lado Máscaras e cabeças
5 atenção + MLP + conexões residuais O bloco
6 o último vetor → um score por token → probabilidades A saída
7 escolher um token, anexar, repetir; de volta ao texto Geração

Os passos 1 a 4 são este capítulo; os passos 5 a 7, o capítulo de Transformers. Uma página à parte, O custo da atenção, trata do que a atenção custa quando roda de verdade: o cache de KV e o \(O(n^2)\).

O exemplo que atravessa as páginas

Uma frase passa por todas as páginas: "o gato subiu no", que o modelo deve continuar com " telhado". O modelo é um brinquedo montado exatamente como um de verdade — o GPT-2 small, o modelo dos laboratórios e do Transformer Explainer —, só que com números menores, para que cada matriz caiba na página. Os pesos foram escolhidos à mão (quase todos 0, 1 e metades) para que você consiga acompanhar cada conta e para que o brinquedo faça nesta frase o que um modelo treinado faz.

o brinquedo destas páginas GPT-2 small
tamanho do vocabulário \(V\) 12 tokens 50.257 tokens
tokens em "o gato subiu no" 5 6 (corta " gato" em g + ato)
números por token \(d\) 4 768
cabeças \(h\) × números por cabeça 2 × 2 12 × 64
blocos \(L\) 1 12
largura oculta do MLP 8 (\(2d\)) 3072 (\(4d\))
pesos 256 124 milhões

Slides

Clique nos slides e use as setas ← → para navegar; F abre em tela cheia e P abre a visão do apresentador, com as notas. Seis dos simuladores destas páginas rodam dentro dos slides. Abrir os slides numa aba nova

O que veio antes: a recorrência e o alcance do gradiente

Antes da atenção, uma sequência era lida um passo de cada vez. Uma RNN carrega um estado \(h_t\) e o reescreve a cada token:

\[ h_t = \tanh\!\left(W h_{t-1} + U x_t\right) \]

Pense no estado como uma folha de anotações de tamanho fixo que você reescreve a cada palavra lida. Para lembrar a primeira palavra no fim de um parágrafo, a anotação dela precisa sobreviver a todas as reescritas do caminho.

O LSTM3 acrescenta a isso uma célula \(c_t\) e três portas que a própria rede aprende a abrir e fechar — esquecer, entrar e sair (a de esquecer veio depois, em 20004; a célula de 1997 guardava o conteúdo com um fator fixo igual a 1):

\[ f_t = \sigma\!\left(W_f [h_{t-1}, x_t]\right) \qquad i_t = \sigma\!\left(W_i [h_{t-1}, x_t]\right) \qquad o_t = \sigma\!\left(W_o [h_{t-1}, x_t]\right) \]
\[ c_t = f_t \odot c_{t-1} + i_t \odot \tanh\!\left(W_c [h_{t-1}, x_t]\right) \qquad h_t = o_t \odot \tanh(c_t) \]

A célula é o truque inteiro. A RNN simples multiplica o estado por uma matriz a cada passo; o LSTM multiplica por \(f_t\), um número entre 0 e 1 escolhido pela rede. Com \(f_t\) perto de 1 a informação atravessa muitos passos sem ser reescrita — a mesma ideia do atalho residual do capítulo 9, dezenove anos antes dele.

Mas perto de 1 não é 1. O gradiente que vai do último token ao primeiro continua sendo um produto de \(T\) fatores e um produto de muitos números menores que 1 encolhe depressa: \(0{,}9^{64} \approx 10^{-3}\). O painel mede os três caminhos na mesma escala:

Com 64 tokens e pesos de escala 1, o gradiente chega ao primeiro token com \(5 \times 10^{-4}\) do que saiu do último na RNN simples e com \(4 \times 10^{-2}\) pelo caminho da célula do LSTM. Suba para 256 tokens e viram \(10^{-14}\) e \(2 \times 10^{-6}\). As duas curvas são retas num gráfico logarítmico, que é a assinatura de um decaimento exponencial: o LSTM não resolveu o problema, comprou uma constante melhor.

A atenção não tem esse produto. A saída lê todas as posições de uma vez, então o caminho até qualquer token tem um passo: o gradiente chega multiplicado por um peso de atenção, não por um produto com um fator por passo de distância. Some a isso o segundo custo da recorrência, que o gráfico não mostra: os \(T\) passos são sequenciais e uma GPU inteira fica esperando um estado de cada vez. Foi essa combinação — alcance e paralelismo — que aposentou a recorrência, não um ganho de acurácia isolado.

A ideia: cada palavra relê as outras

Compare duas frases:

  • "Sentei no banco da praça."
  • "Fui ao banco sacar dinheiro."

A primeira camada do modelo (a de embedding, passo 2) entrega para "banco" o mesmo vetor nas duas frases: ela olha só para o token, não para os vizinhos. Quem desfaz a ambiguidade é a atenção. Ela deixa cada palavra montar um vetor novo misturando os vetores das outras, com mais peso para as que importam: "banco" puxa informação de "sentei" e "praça" na primeira frase e de "sacar" e "dinheiro" na segunda. A saída de uma camada de atenção é isso — um vetor por token, agora com contexto.

Como essa mistura é calculada (e como o modelo decide quais vizinhos importam) é o assunto dos passos 3 e 4, a partir de Query, key, value. Antes, o texto precisa virar vetores: passo 1, tokens.

Laboratório: o mecanismo, calculado e medido

Cada afirmação deste capítulo é calculada num notebook no Colab. Ele roda no navegador, em CPU; não é preciso instalar nada e o único download é um modelo de linguagem pequeno e público (SmolLM2-135M, cerca de 270 MB) na seção 9. São dez seções, cada uma terminando num checkpoint com valor de verificação:

  1. o dicionário suave à mão: o exemplo da página Query, key, value e o que se mexe quando o valor ou a query muda;
  2. todas as queries de uma vez, a forma de cada matriz e as nossas três linhas contra F.scaled_dot_product_attention;
  3. por que \(\sqrt{d_k}\): a variância dos scores medida e o softmax virando one-hot sem ele;
  4. a volta escrita à mão e conferida contra o autograd; o gradiente de uma linha saturada;
  5. máscaras: a causal e o padding com e sem a sua máscara;
  6. a equivariância a permutações ("cachorro morde homem") e a RoPE transformando rotações absolutas em deslocamentos;
  7. multi-head como um reshape (conferido contra nn.MultiheadAttention) e o GQA;
  8. a conta do \(n^2\): memória e tempo de uma camada ingênua contra o kernel fundido;
  9. o cache de KV de um modelo de verdade, medido contra a fórmula, a geração com e sem ele e para onde olham as cabeças dele;
  10. um modelo de uma camada de atenção que precisa usar a ordem para responder, com uma tabela a preencher.

Abrir o laboratório no Colab — salve uma cópia no seu Drive (Arquivo → Salvar uma cópia no Drive) para rodar e editar.

Pontos principais

  1. O texto chega ao modelo como tokens: pedaços de um vocabulário fixo, achados pelo BPE (fundir o par mais frequente, de novo e de novo), cada um com um id inteiro. Um tokenizador ajustado em inglês escreve o português com mais tokens: cerca de 1,9 por palavra no GPT-2 contra 1,1 no inglês.
  2. Um id é um nome, não um número para fazer conta. A tabela de embeddings o transforma num vetor por consulta e uma posição é somada (ou, com a RoPE, aplicada a q e k), porque a atenção sozinha não enxerga ordem.
  3. Atenção é uma camada densa cujos pesos são calculados a partir da entrada — a escolha de projeto oposta aos pesos fixos, locais e compartilhados de uma convolução. Ela venceu a recorrência por alcance (um passo até qualquer token) e paralelismo.
  4. Ela funciona como um dicionário suave: compara uma pergunta com todas as chaves e devolve uma média ponderada dos valores. A saída é um vetor com contexto por token.
  5. Q, K e V são três projeções da mesma entrada. A separação é o que permite a um token pedir algo que ele não é.
  6. O \(\sqrt{d_k}\) existe porque a variância dos scores cresce com \(d_k\). Sem ele o softmax satura e o gradiente some. Registre a entropia da atenção; é barato e diagnóstico.
  7. A máscara é uma matriz somada e é toda a distinção encoder/decoder. Esquecer a máscara de documento ao empacotar é um bug de pré-treino real e comum.
  8. A atenção não enxerga ordem. A RoPE codifica rotações absolutas que rendem deslocamentos relativos no produto escalar — o que explica por que ela funciona e por que o contexto pode ser estendido reescalando frequências.
  9. Cabeças são paralelismo de graça, não capacidade extra: \(h\) cabeças de largura \(d/h\) custam o que custa uma cabeça de largura \(d\).
  10. O cache de KV domina a memória de inferência (128 KiB por token no Llama 3 8B). \(h_{kv}\) é o único termo que você pode encolher e é por isso que GQA é universal e MLA é para onde a fronteira foi. Inferência é limitada por banda, não por computação: otimize bytes movidos.
  11. FlashAttention é exato e de graça. Esparsidade, janelas deslizantes e SSMs trocam alguma coisa; em 2026 as trocas vencedoras são pilhas híbridas e atenção esparsa treinável.


  1. Bahdanau, D., Cho, K., & Bengio, Y. (2015). Neural Machine Translation by Jointly Learning to Align and Translate — ICLR. Atenção como correção para o gargalo de tamanho fixo. ↩

  2. Vaswani, A., et al. (2017). Attention Is All You Need — NeurIPS. Atenção escalada por produto escalar, multi-cabeça, posições senoidais. ↩

  3. Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory — Neural Computation 9(8), 1735–1780. A célula com portas que segurou o gradiente por mais passos do que a recorrência simples conseguia. ↩

  4. Gers, F. A., Schmidhuber, J., & Cummins, F. (2000). Learning to Forget: Continual Prediction with LSTM — Neural Computation 12(10), 2451–2471. A porta de esquecimento. ↩