∑
Projeto Axioma
llms.newortho.com.br
Capa do módulo M5
M5 · 5 semanas

A matemática do Transformer

Toda a arquitetura cabe em três multiplicações e um softmax.
Assistir ao filmeAbrir no EstúdioPraticar com o tutorVer em markdown

Tokenização, embeddings, posição, consultas, chaves e valores, atenção escalada, múltiplas cabeças, MLP, normalização, conexões residuais e a cabeça de saída. O módulo em que todas as peças anteriores se encaixam.

Este é o objetivo declarado do projeto. Ao terminar, você consegue narrar o caminho completo de um token, da string ao logit, sabendo qual operação matemática acontece em cada etapa e por quê.

1. Tokenização e o problema dos números fatiados

Antes de qualquer matemática, o texto vira uma lista de inteiros. O tokenizador quebra a string em pedaços do vocabulário, que podem ser palavras inteiras, pedaços de palavra ou até bytes isolados, e troca cada pedaço pelo seu índice.

Essa etapa parece administrativa e não é. Ela explica limitações reais. Um número como 1234 pode virar dois tokens, 12 e 34, ou três, dependendo do tokenizador. O modelo nunca vê o número como quantidade, vê símbolos arbitrários que precisou aprender a relacionar. É uma das raízes concretas de erros aritméticos.

Também explica por que contar letras em uma palavra é difícil para um LLM: as letras individuais quase nunca são tokens separados, então a informação que a pergunta exige simplesmente não está disponível na representação de entrada.

2. Embeddings e posição

Cada índice de token é usado para buscar uma linha em uma matriz de embeddings. Essa linha é um vetor de dimensão d, tipicamente entre 768 e alguns milhares, e é a primeira representação numérica com significado do token.

A operação é uma consulta em tabela, mas equivale matematicamente a multiplicar um vetor one-hot pela matriz de embeddings. Vale conhecer as duas leituras, porque papers usam a segunda.

Como a atenção, por construção, não distingue ordem, a posição precisa ser injetada explicitamente. Modelos somam ou combinam uma codificação posicional ao embedding. Sem isso, gato mordeu cachorro e cachorro mordeu gato seriam entradas idênticas para o mecanismo de atenção.

A representação da posição t é a linha da matriz de embeddings correspondente ao token, somada à codificação posicional daquela posição.

3. Consultas, chaves e valores

De cada vetor de entrada o modelo deriva três vetores diferentes, multiplicando por três matrizes de pesos aprendidas: W maiúsculo com subscrito Q, K e V.

A analogia que funciona é a de uma busca. A consulta é o que este token está procurando. A chave é o que cada token oferece como rótulo de si mesmo. O valor é a informação que cada token entrega se for selecionado. Três papéis distintos, extraídos do mesmo vetor por três projeções diferentes.

Nada disso é imposto por regra. As três matrizes são aprendidas no treino, e o modelo descobre sozinho que projeções tornam a busca útil.

Q, K e V são obtidos multiplicando a matriz de entradas X por três matrizes de pesos distintas e aprendidas.

4. Atenção escalada: a fórmula inteira, agora entendida

Q vezes K transposta calcula, de uma vez, o produto escalar entre toda consulta e toda chave. O resultado é uma matriz de pontuações: a célula da linha i e coluna j diz o quanto a posição i acha a posição j relevante. Você já sabe que produto escalar mede concordância de direção, e é exatamente isso que está sendo medido.

A divisão pela raiz de d k existe por uma razão numérica precisa. Em dimensões altas, produtos escalares crescem em magnitude proporcionalmente à raiz da dimensão. Sem a divisão, as pontuações ficariam grandes demais, o softmax saturaria em praticamente zero ou um, e os gradientes desapareceriam. A raiz de d k mantém a escala em uma faixa onde o treino funciona.

O softmax é aplicado linha a linha, transformando cada linha de pontuações em uma distribuição que soma um: os pesos de atenção. Por fim, multiplicar por V produz, para cada posição, uma média ponderada dos valores de todas as posições, com os pesos que acabaram de ser calculados.

Em modelos causais existe ainda uma máscara: antes do softmax, todas as posições futuras recebem menos infinito, o que faz o softmax lhes atribuir probabilidade zero. É assim que o modelo é impedido de ver o que ainda não foi gerado.

Atenção é o softmax das pontuações escaladas, somadas à máscara causal, multiplicado pela matriz de valores.
Uma linha de atenção, à mão

Suponha três posições, com pontuações escaladas iguais a 2,0, 1,0 e 0,1 para a primeira consulta. O softmax dessa linha, que você já calculou no M4, dá 0,659, 0,242 e 0,099. A saída para essa posição é 0,659 vezes o valor da posição um, mais 0,242 vezes o da posição dois, mais 0,099 vezes o da posição três. Atenção é, literalmente, uma média ponderada.

5. Múltiplas cabeças

Em vez de uma atenção sobre a dimensão inteira, o modelo divide o espaço em h fatias e roda o mesmo procedimento em paralelo em cada uma, com matrizes Q, K e V próprias. Cada fatia é uma cabeça.

A motivação é de capacidade. Uma única atenção precisa comprometer-se com um tipo de relação por posição. Com várias cabeças, uma pode acompanhar concordância gramatical, outra referência de pronomes, outra proximidade posicional, e assim por diante. As descobertas de interpretabilidade mostram que cabeças de fato se especializam, ainda que raramente de forma tão limpa quanto o exemplo sugere.

As saídas das cabeças são concatenadas e passam por uma última projeção, W com subscrito O, que devolve o resultado à dimensão original do modelo.

6. MLP: onde a informação é processada

Depois da atenção vem um bloco totalmente conectado aplicado a cada posição independentemente: expande o vetor para uma dimensão maior, tipicamente quatro vezes maior, aplica uma não linearidade, e comprime de volta.

Se a atenção é a etapa em que as posições conversam entre si, o MLP é a etapa em que cada posição pensa sozinha sobre o que acabou de receber. É também onde mora a maior parte dos parâmetros do modelo, e há evidência de interpretabilidade de que muito do conhecimento factual está armazenado ali.

O MLP multiplica por uma matriz que expande, aplica a não linearidade g, e multiplica por outra matriz que comprime de volta.

7. Normalização de camada e conexões residuais

A normalização de camada recentra e reescala o vetor de ativações para média zero e desvio padrão um, e depois aplica dois parâmetros aprendidos de ganho e deslocamento. Serve para manter as ativações em uma faixa estável através de dezenas de camadas, sem o que o treino se torna instável.

A conexão residual soma a entrada do bloco à sua saída. Parece um detalhe e é estrutural: garante um caminho direto para o gradiente atravessar a rede inteira sem ser multiplicado sucessivamente por derivadas pequenas. É o que torna possível treinar oitenta ou cem camadas empilhadas.

Junte as duas e você tem a forma canônica de um bloco: x recebe x mais atenção da versão normalizada de x, e depois x recebe x mais MLP da versão normalizada de x.

O bloco de Transformer moderno: normaliza, aplica a operação, soma de volta à entrada. Duas vezes, uma para atenção e uma para o MLP.

8. Logits e a cabeça de saída

Depois do último bloco, o vetor da última posição é multiplicado por uma matriz de saída de shape dimensão do modelo por tamanho do vocabulário. O resultado é um logit por token possível.

Muitos modelos amarram essa matriz à matriz de embeddings de entrada, usando a transposta da mesma tabela. A leitura é bonita: prever o próximo token vira medir o produto escalar entre o estado final e o embedding de cada token candidato, ou seja, perguntar de qual token o estado atual mais se aproxima em direção.

Sobre esses logits roda o softmax com temperatura, o corte por top-k ou top-p, e o sorteio. O token escolhido é anexado à sequência e o processo inteiro recomeça. Este é o fluxograma completo, do prompt ao token, que o projeto se propôs a tornar transparente.

Os logits são o produto do estado final pela transposta da matriz de embeddings, e as probabilidades saem do softmax com temperatura.

Exercícios

Tente responder antes de abrir.

1. Por que a atenção precisa de codificação posicional?
Porque a operação de atenção é invariante à ordem: ela calcula produtos escalares entre todos os pares, sem nenhuma noção de quem veio antes. Sem posição injetada, permutar a frase não mudaria o resultado.
2. Qual o shape de QKᵀ para uma sequência de n tokens?
n por n. Cada célula é a pontuação de relevância de uma posição em relação a outra, o que explica por que o custo da atenção cresce com o quadrado do comprimento do contexto.
3. O que aconteceria sem a divisão por √dk?
As pontuações teriam magnitude proporcional à raiz da dimensão, o softmax saturaria perto de zero e um, e os gradientes ficariam próximos de zero, travando o treino.
4. Explique a máscara causal em termos de softmax.
Somar menos infinito às posições futuras faz a exponencial delas valer zero, então o softmax lhes atribui probabilidade zero. O token só pode atender a si mesmo e ao passado.
5. Em uma frase, qual a divisão de trabalho entre atenção e MLP?
A atenção move informação entre posições; o MLP processa a informação dentro de cada posição.

Trilhos do tutor

Dúvidas frequentes

Por que dividir pela raiz de dk e não pelo próprio dk?
Porque o que cresce com a dimensão é o desvio padrão do produto escalar, e não a magnitude bruta dele. Se as coordenadas de q e k forem aproximadamente independentes e de variância um, a soma de d k produtos tem variância d k, logo desvio padrão igual à raiz de d k. Dividir por esse desvio devolve as pontuações a uma faixa de variância um, que é exatamente onde o softmax ainda tem gradiente útil. Dividir pelo próprio d k encolheria demais e achataria a distribuição de atenção.
A máscara causal é aplicada antes ou depois do softmax?
Antes, e isso é essencial. A máscara soma menos infinito às posições futuras enquanto elas ainda são pontuações, e a exponencial de menos infinito vale zero, então o softmax atribui probabilidade zero a elas e ainda assim a linha soma um. Se você zerasse os pesos depois do softmax, a linha deixaria de somar um e seria preciso renormalizar na mão. Somar a máscara antes resolve as duas coisas de uma vez.
Se atenção é só uma média ponderada, de onde vem a inteligência do modelo?
De três lugares que a média ponderada sozinha não mostra. Primeiro, os pesos não são fixos: eles são recalculados a cada posição e a cada entrada, a partir de projeções aprendidas. Segundo, o bloco se repete dezenas de vezes, e cada camada trabalha sobre o resultado da anterior. Terceiro, entre as atenções está o MLP, que é onde a maior parte dos parâmetros mora e onde a informação recolhida é de fato processada. A média ponderada é o mecanismo de transporte, não o modelo inteiro.
Qual a diferença entre chave e valor? Parecem a mesma informação.
São projeções diferentes do mesmo vetor de entrada, e cumprem papéis que não se confundem. A chave existe para ser comparada com as consultas e decide o quanto aquela posição será atendida. O valor existe para ser entregue e decide o que aquela posição contribui quando é atendida. Separar as duas permite que uma posição seja fácil de encontrar por um critério e entregue conteúdo de outra natureza, e o modelo aprende essa separação sozinho durante o treino.
Cada cabeça de atenção realmente aprende uma coisa diferente?
Em parte. Trabalhos de interpretabilidade encontram cabeças com comportamento reconhecível, por exemplo cabeças que acompanham o token anterior ou que ligam pronomes a seus antecedentes. Mas a especialização raramente é limpa: a mesma cabeça costuma participar de vários padrões, e um padrão costuma estar espalhado por várias cabeças. Trate os exemplos didáticos como ilustração do porquê de haver várias cabeças, e não como descrição fiel do que cada uma faz.
Por que concatenar as cabeças e ainda passar por uma projeção W com subscrito O?
Por duas razões. A primeira é de forma: a concatenação devolve um vetor do tamanho da dimensão do modelo, mas ele é apenas a justaposição de fatias independentes, e a projeção final permite que informação de uma cabeça influencie coordenadas associadas a outra. A segunda é de aprendizado: sem essa matriz, o modelo não teria como ponderar a importância relativa das cabeças, e cada fatia entraria na conexão residual com o mesmo peso.
Por que o MLP expande a dimensão antes de comprimir de volta?
Porque a não linearidade precisa de espaço para trabalhar. Em uma dimensão maior é possível separar padrões que ficariam sobrepostos no espaço original, e a compressão seguinte escolhe o que vale a pena manter. A expansão de quatro vezes é convenção empírica, não teorema: valores diferentes funcionam, e arquiteturas recentes ajustam esse fator junto com o tipo de não linearidade usada.
Normalização de camada e normalização de lote são a mesma coisa?
Não. A normalização de camada calcula média e desvio padrão sobre as coordenadas de um único vetor, uma posição por vez, e por isso funciona igual em treino e em inferência e não depende de quantos exemplos há no lote. A normalização de lote calcula essas estatísticas sobre o lote inteiro, o que cria dependência entre exemplos e complica o uso em sequências de comprimento variável. Transformers usam normalização de camada justamente para evitar essa dependência.
O que muda entre normalizar antes ou depois do bloco?
Muda a estabilidade do treino. Na forma que o módulo apresenta, a normalização acontece antes da operação e a soma residual recebe a saída direto, o que deixa um caminho totalmente livre para o gradiente atravessar a rede. Na forma original do artigo de 2017, a normalização vinha depois da soma, e treinar modelos muito profundos exigia aquecimento cuidadoso da taxa de aprendizado. A prática atual prefere normalizar antes, porque o treino fica mais tolerante.
Por que amarrar a matriz de saída à matriz de embeddings?
Por economia e por coerência. Economia porque a tabela de embeddings costuma ser uma das maiores do modelo, e reutilizá-la na saída elimina uma segunda tabela do mesmo tamanho. Coerência porque a leitura fica limpa: prever o próximo token vira medir o produto escalar entre o estado final e o embedding de cada candidato, ou seja perguntar de qual token o estado atual mais se aproxima em direção. Nem todo modelo faz isso, mas é prática comum.
Por que os modelos erram contas simples se sabem tanta coisa?
Uma das raízes está na tokenização. Um número como 1234 pode virar dois ou três tokens conforme o tokenizador, e nenhum desses pedaços carrega a noção de quantidade. O modelo aprendeu a relacionar símbolos que aparecem juntos, e não a executar um algoritmo posicional de soma. Some a isso o fato de que cada passo produz apenas uma distribuição sobre o próximo token, sem memória de trabalho separada, e fica claro por que contas longas quebram com facilidade.
Por que contar as letras de uma palavra é difícil para um LLM?
Porque as letras individuais quase nunca são tokens separados. A palavra chega ao modelo como um ou dois pedaços, e a decomposição em caracteres simplesmente não está presente na representação de entrada. Para responder, o modelo precisa recuperar da memória de treino como aquele pedaço se soletra, o que é indireto e falível. É o mesmo problema de fundo dos erros de aritmética: a pergunta exige uma informação que a tokenização apagou.
O custo da atenção cresce com o quadrado do contexto. Isso é inevitável?
É inevitável na forma exata apresentada no módulo, porque a matriz de pontuações compara todos os pares de posições e o número de pares cresce com o quadrado do comprimento. Existem alternativas que trocam exatidão por custo, por exemplo restringir cada posição a uma janela local, atender a um subconjunto esparso de posições ou aproximar o produto por métodos de baixa dimensão. Todas mudam o que é calculado, então a fórmula deste módulo continua sendo a referência do que está sendo aproximado.
A conexão residual não estraga o resultado ao somar a entrada crua na saída?
Não, e o motivo é que o bloco não precisa produzir a saída inteira: ele produz apenas a correção a ser somada. Isso torna a identidade fácil de representar, porque basta o bloco devolver algo próximo de zero para a informação atravessar intacta. O ganho decisivo aparece no gradiente, que encontra um caminho direto até as camadas iniciais sem ser multiplicado sucessivamente por derivadas pequenas. É essa soma aparentemente ingênua que viabiliza dezenas de camadas empilhadas.
Onde exatamente entram temperatura e top-p no fluxo do Transformer?
Bem no final, depois de tudo o que o módulo descreve. O modelo termina o último bloco, projeta o estado final na matriz de saída e produz um logit por token do vocabulário. Só então a temperatura divide esses logits, o softmax os converte em probabilidades, o corte por top-k ou top-p descarta candidatos e o sorteio escolhe um token. Nada disso faz parte do modelo: são decisões de amostragem aplicadas sobre a saída dele, e é por isso que dá para mudá-las sem retreinar nada.
Depois de escolher um token, o modelo recalcula tudo do zero?
Conceitualmente sim: o token escolhido é anexado à sequência e o processo inteiro recomeça com um contexto uma posição maior. Na prática, as implementações guardam as chaves e os valores já calculados das posições anteriores, porque eles não mudam quando um token novo entra no final. Assim, cada passo novo calcula apenas a consulta, a chave e o valor da posição recém acrescentada, e reaproveita o resto. O resultado é idêntico, só que muito mais barato.

Checkpoint

Oitenta por cento de acerto libera o módulo seguinte.

1. Narre o caminho de um token da string ao embedding.
O tokenizador quebra o texto e devolve um índice; o índice busca uma linha na matriz de embeddings; a codificação posicional é somada; o resultado é o vetor de entrada do primeiro bloco.
2. O que Q, K e V representam?
Consulta, o que a posição procura; chave, o rótulo que cada posição oferece; valor, a informação que cada posição entrega quando selecionada.
3. Por que existe a divisão pela raiz de dk?
Para manter a escala das pontuações em uma faixa onde o softmax não satura e os gradientes continuam úteis.
4. Qual o papel da conexão residual?
Oferecer um caminho direto para o gradiente atravessar toda a rede, viabilizando o treino de modelos muito profundos.
5. Como se obtêm os logits e o que se faz com eles?
Multiplicando o estado final pela matriz de saída, frequentemente a transposta da matriz de embeddings. Depois vem softmax com temperatura, corte por top-k ou top-p, e sorteio do token.

Bibliografia

Attention Is All You NeedAshish Vaswani e outros, NeurIPS, 2017Seções 3.1 a 3.3O paper original do Transformer. Depois deste módulo você consegue ler essas três seções inteiras entendendo cada fórmula. É o teste de leitura de paper previsto no PRD.
Deep Learning: Foundations and ConceptsChristopher M. Bishop e Hugh Bishop, Springer, 2024Capítulo sobre TransformersO tratamento mais didático e atual da atenção em livro-texto, com a álgebra explicitada passo a passo. Versão de leitura livre disponível no site do livro.
Dive into Deep LearningZhang, Lipton, Li e Smola, Cambridge University Press, edição abertaCapítulo de mecanismos de atenção e TransformersTraz o código junto da matemática, útil para conferir shapes rodando os exemplos.

Vídeos curados

Attention in transformers, visually explained3Blue1Brown, cap. 6

Assista duas vezes: uma antes de ler a seção de atenção, outra depois de fazer os exercícios.

How might LLMs store facts3Blue1Brown, cap. 7

Cobre o MLP e prepara o terreno para o M7.

The Transformer Attention MechanismMachineLearningMastery

Texto de referência com a álgebra passo a passo, útil para conferir os shapes.