O LSTM resolve o problema ou só o empurra para mais longe?
| caminho do último token até o primeiro | 64 tokens | 256 tokens |
|---|---|---|
| RNN simples, escala dos pesos 1 (medido no simulador) | ||
| caminho da célula do LSTM, |
||
| atenção | um passo | um passo |
| texto | tokens do GPT-2 |
|---|---|
| the cat climbed the | 4 |
| o gato subiu no | 6 |
| uma frase em inglês de 16 palavras | 17 |
| a versão em português, 13 palavras | 25 |
GPT-2: 256 bytes + 50.000 fusões + 1 token especial = 50.257. "o gato subiu no" = o ␣g ato ␣sub iu ␣no. O espaço pertence à palavra seguinte: "the" é o id 1169, "␣the" é o 262.
Conte os pares vizinhos de um corpus, funda o mais frequente, anote, repita. Para tokenizar um texto novo, repita as fusões na ordem.
| depois da fusão | pedaços | quantos |
|---|---|---|
| início: caracteres | o ␣ g a t o ␣ s u b i u ␣ n o |
15 |
1 ␣+n · 2 ␣n+o · 3 t+o · 4 ␣+s |
o ␣ g a to ␣s u b i u ␣no |
11 |
8 ␣+g · 9 ␣g+a · 10 ␣ga+to |
o ␣gato ␣s u b i u ␣no |
8 |
13 i+u |
o ␣gato ␣s u b iu ␣no |
7 |
40 ␣s+u · 41 ␣su+b |
o ␣gato ␣sub iu ␣no |
5 |
Corpus de brinquedo: 8 frases ("o gato sentou no telhado.", "o cão quer subir no sofá." …), 23 caracteres, 41 fusões; "subiu" não está nele. O modelo de brinquedo fica com 12 tokens: o = 0, ␣no = 1, ␣gato = 2, ␣sub = 4, iu = 5 → [0, 2, 4, 5, 1].
Uma consulta à tabela de embeddings
| token (id) | ||||
|---|---|---|---|---|
| 1 | o (0) |
[−0,5; −0,5; 0; 1] | [0; 0; 0; 0] | [−0,5; −0,5; 0; 1] |
| 2 | ␣gato (2) |
[1; −0,5; 0; −0,5] | [0,5; 0; −0,5; 0] | [1,5; −0,5; −0,5; −0,5] |
| 3 | ␣sub (4) |
[−0,5; 1; 0; −0,5] | [0; 0,5; 0; −0,5] | [−0,5; 1,5; 0; −1] |
| 4 | iu (5) |
[0; 0,5; −0,5; 0] | [−0,5; 0; 0,5; 0] | [−0,5; 0,5; 0; 0] |
| 5 | ␣no (1) |
[−0,5; 0; −0,5; 1] | [0; −0,5; 0; 0,5] | [−0,5; −0,5; −0,5; 1,5] |
Brinquedo: V = 12, d = 4, 8 posições, pesos escolhidos à mão. GPT-2 small: E é 50.257 × 768 (38,6M de parâmetros, 31% do modelo), P é 1024 × 768, as duas aprendidas. O Llama não tem P: a RoPE gira q e k.
A camada de embedding dá um vetor a "banco". É o mesmo vetor nas duas frases?
estoque = {"maçã": 3, "pera": 7}
estoque["pera"] # casamento exato → 7
Um dicionário exige casamento exato e devolve um valor.
A atenção compara a pergunta com todas as chaves, dá a cada uma uma nota de semelhança e devolve uma média ponderada de todos os valores.
A média é uma função suave das notas, então dá para derivar — e a rede aprende, por gradiente, o que perguntar e o que anunciar.
X: uma linha por token, n tokens de d números · dk: o comprimento de cada query e chave · softmax: escore dividido pela soma da linha.
Três projeções da mesma entrada; WQ, WK e WV são os únicos parâmetros aprendidos. É por isso que um token pode pedir uma coisa, anunciar outra e entregar uma terceira — um pronome pode consultar por "o substantivo a que me refiro" sem ser um substantivo.
"sentei · banco · praça", duas dimensões escolhidas à mão. Os valores se leem como
| token | chave |
valor |
|---|---|---|
| sentei | ||
| banco | ||
| praça |
A query de "banco" é
| token | ① score |
② |
③ |
③ peso |
④ |
|---|---|---|---|---|---|
| sentei | 0,71 | 2,03 | 2,03 / 27,29 = 0,074 | ||
| banco | 2,12 | 8,34 | 0,306 | ||
| praça | 2,83 | 16,92 | 0,620 | ||
| soma | 27,29 | 1 |
"banco" entrou em cima do muro (
| tensor | forma | o que é |
|---|---|---|
| um vetor por token | ||
| aprendidas | ||
| aprendida | ||
| uma query e uma chave por token | ||
| um valor por token | ||
| um score para cada par — o |
||
| linha |
||
| um vetor novo, com contexto, por token |
Laboratório, seção 2: n = 6, d = 16, dk = 8, dv = 4 → A é 6 × 6, O é 6 × 4, 16·8 + 16·8 + 16·4 = 320 parâmetros — nenhum depende de n. As nossas três linhas batem com F.scaled_dot_product_attention a menos de 1,2 × 10−7.
Se
argmax duro e sem gradiente.Por que não dividir por
Uma query contra 16 chaves, 200 linhas; mediana sobre as linhas.
| maior peso, com |
maior peso, sem | linhas mortas, sem | |||
|---|---|---|---|---|---|
| 4 | 0,21 | 0,26 | 0,37 | 0,27 | 0% |
| 64 | 0,22 | 0,27 | 0,94 | 0,054 | 17% |
| 1024 | 0,22 | 0,28 | 0,99999 | 0,000011 | 64% |
Maior peso: o máximo de uma linha de A (uniforme seria 1/16 ≈ 0,06). ‖∂L/∂S‖: o tamanho do gradiente que chega aos scores da linha. "Morta" = ‖∂L/∂S‖ abaixo de 10−3. Notebook, seção 3.
Laboratório, seção 4: queries × 100 → quatro de cinco linhas imprimem maior peso 1,0 e os gradientes delas caem de 0,15–0,51 para algo entre 10−34 e 7 × 10−4.
Somadas aos scores antes do softmax, como
| posição | enxerga | deve prever |
|---|---|---|
| 1 | o |
␣gato |
| 2 | o␣gato |
␣sub |
| 3 | o␣gato␣sub |
iu |
| 4 | o␣gato␣subiu |
␣no |
| 5 | o␣gato␣subiu␣no |
␣telhado |
␣gato e aprenderia a copiar.| máscara | proíbe | onde |
|---|---|---|
| causal | olhar o futuro | todo decoder autorregressivo |
| de padding | atender ao enchimento <pad> |
todo batch de sequências de tamanhos diferentes |
| janela deslizante | olhar mais de |
Mistral, Gemma, pilhas híbridas |
| de documento | cruzar para outro documento empacotado | todo pré-treino moderno |
Um vetor zero não é "nada": o score dele é 0, não
A atenção é equivariante a permutações: embaralhe os tokens e as saídas embaralham junto. "cachorro morde homem" = "homem morde cachorro" (no laboratório: diferença de
| esquema | mecanismo | veredito |
|---|---|---|
| senoidal | sen/cos fixos somados à entrada | histórico |
| absoluta aprendida | um vetor treinável por posição | não passa do comprimento treinado |
| ALiBi | penalidade linear na distância, nos scores | largamente superada |
| RoPE | girar Q e K por um ângulo ∝ posição | universal |
| NoPE / híbrida | nenhum sinal em algumas camadas | crescendo em contexto longo |
Laboratório, seção 6: a mesma q e a mesma k nas posições (3, 1), (10, 8) e (1000, 998) dão o mesmo score, +0,033671; os deslocamentos 1 e 3 dão −0,81 e +1,18.
| passo | forma |
|---|---|
| separar as cabeças | |
| scores, uma |
|
| concatenar, depois |
Quatro matrizes
B: sequências no lote · n: tokens · h: cabeças, cada uma com d/h dimensões.
Gerar o token
| termo | o que é | Llama 3 8B |
|---|---|---|
| K e V | 2 | |
| camadas | 32 | |
| cabeças de chave/valor | 8 | |
| dimensões por cabeça | 128 | |
| bytes por número | 16 bits | 2 |
| por token | 128 KiB | |
| tokens × sequências: 128k = 131 072 tokens, um usuário | 16 GiB |
| esquema | cabeças de KV | cache | qualidade | 2026 |
|---|---|---|---|---|
| MHA | 1× | referência | histórico em contexto longo | |
| MQA | 1 | mensuravelmente pior | onde a memória domina | |
| GQA | ≈ MHA | o padrão | ||
| MLA | — | ~1/57 | reportada ≥ MHA | DeepSeek-V2/V3 |
Decodificar lê o cache inteiro para produzir um token: o limite é a banda de memória, não os FLOPs. GQA, cache quantizado, PagedAttention, batches maiores — todos atacam bytes movidos.
F.scaled_dot_product_attention.Laboratório, seção 8, uma camada com 8 cabeças: S ocupa 8 · 4096² · 4 bytes = 512 MiB com n = 4096 e o trabalho cresce 4× a cada dobra; na CPU do laboratório a versão ingênua levou 216 ms e o kernel fundido, 77 ms.
SmolLM2-135M (arquitetura do Llama: RoPE, GQA):
Notebook no Colab, ~2 h, CPU. Cada seção termina num checkpoint com valor de verificação.
Roteiro: (1) o que a recorrência não conseguia fazer; (2) a ideia: um dicionário suave, Q/K/V, uma conta à mão; (3) os detalhes que fazem funcionar: √d_k, máscaras, posição, cabeças; (4) o custo: o cache de KV e o O(n²). Fecha com o laboratório no Colab.
Padrão: 64 tokens, escala 1. RNN 5e-4, célula do LSTM 4e-2. Arraste para 256: 1e-14 e 2e-6. As duas são retas no gráfico logarítmico — decaimento exponencial. O LSTM comprou uma constante melhor. A atenção é plana em 1/n: pequena, mas igual para todas as posições.
Pergunte antes: "quantos tokens tem 'o gato subiu no'?" A maioria diz 4 palavras = 4 tokens; o GPT-2 usa 6. Na frase longa, 25 tokens para 13 palavras (1,92 por palavra contra 1,06 do inglês): mais conta, menos contexto e uma conta maior para o mesmo conteúdo.
A palavra nova é o ponto: "subiu" nunca esteve no corpus e o BPE a escreve com dois pedaços conhecidos, ␣sub (de subir) e iu (de dormiu, fugiu). Só 10 das 41 fusões tocam a frase. O GPT-2 corta "subiu" do mesmo jeito, mas corta "gato" em ␣g + ato: o vocabulário dele foi ajustado em inglês.
Avance pelas fusões: 15 caracteres, 5 pedaços, ids [0, 2, 4, 5, 1]. Depois os casos: "… telhado." acrescenta ␣telhado e "."; "o pássaro subiu no telhado." escreve "pássaro" letra a letra (␣ p á s s a r o, sem id entre os 12); a frase em inglês passando pelo tokenizador português: 22 pedaços.
X (5 x 4) é o que a atenção recebe. O mesmo id recebe sempre a mesma linha: "banco" ganha um vetor só nas duas frases do próximo slide. Fazer o vetor depender dos vizinhos é o trabalho da atenção.
Começa nos números do slide anterior. Depois: (a) valor de praça → [0, 1]: o veredito vira e nenhum peso se mexe; (b) query → [1, 0]: o peso sai de praça, 0,40/0,40/0,20; (c) query → 0: uniforme, uma média simples.
Leia por linha: para onde cada token olha; cada linha soma 1. As três primeiras cabeças são padrões que modelos treinados têm de verdade (conteúdo, token anterior, distância). Depois: desmarque "dividir por √d_k" e arraste d_k para cima — a matriz vira binária. Depois marque a máscara causal: o triângulo de cima escurece. A máscara volta daqui a quatro slides.
Variância 1/d_k: todo score perto de zero, um softmax quase uniforme que não escolhe ninguém.
Laboratório, seção 5: troque o último token; sem a máscara as cinco linhas mudam, com ela só a última.
O código do laboratório (seção 7, com a função atencao da seção 2), três tokens, d = 4, h = 2. A cabeça 1 é o banco dos slides 13 a 15: a linha termina em [0,85; 0,15]; a cabeça 2 faz banco olhar para sentei (0,77). Avançar linha a linha. Depois: "com a máscara causal" - banco perde praça e volta a ficar em cima do muro, [0,60; 0,40]; sentei só vê a si mesmo. "uma cabeça só (h = 1)": os mesmos números, √4 = 2, banco divide 0,38/0,38/0,23 - uma linha não aponta para as duas coisas. "chaves todas iguais": todo peso 1/3, uma média simples.
Comece em 8B, GQA, 32k, 8 requisições: 34,4 GB de cache + 16 GB de pesos, cabe. Troque para MHA: o cache cresce 4× (137 GB) e não cabe. Volte a GQA e suba para 128k: 137 GB de novo. 70B ou 405B: só os pesos (140 GB, 810 GB em 16 bits) já não cabem numa placa de 80 GB.