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
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:
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):
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:
- 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;
- todas as queries de uma vez, a forma de cada matriz e as nossas três linhas contra
F.scaled_dot_product_attention; - por que \(\sqrt{d_k}\): a variância dos scores medida e o softmax virando one-hot sem ele;
- a volta escrita à mão e conferida contra o autograd; o gradiente de uma linha saturada;
- máscaras: a causal e o padding com e sem a sua máscara;
- a equivariância a permutações ("cachorro morde homem") e a RoPE transformando rotações absolutas em deslocamentos;
- multi-head como um reshape (conferido contra
nn.MultiheadAttention) e o GQA; - a conta do \(n^2\): memória e tempo de uma camada ingênua contra o kernel fundido;
- 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;
- 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
- 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.
- 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.
- 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.
- 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.
- 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 é.
- 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.
- 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.
- 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.
- 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\).
- 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.
- 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.
-
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. ↩
-
Vaswani, A., et al. (2017). Attention Is All You Need — NeurIPS. Atenção escalada por produto escalar, multi-cabeça, posições senoidais. ↩
-
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. ↩
-
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. ↩