Carregando
0x10Lição 2 de 16

Explore Transformers e atenção

Calcule a autoatenção manualmente, veja por que os LLMs mascaram o futuro e siga um bloco Transformer.

25 min Questionário com 7 perguntas 2 exercícios de código
Ao final desta lição, você saberá
  • Atenção ao produto escalar em escala computacional
  • Explique a máscara causal usada por LLMs somente decodificadores
  • Descreva o que um bloco Transformer contém

O Transformer (Vaswani et al., 2017) é a arquitetura por trás de essencialmente todo LLM moderno. Sua ideia principal é a autoatenção: cada token constrói sua nova representação olhando para os outros tokens e decidindo quais deles são importantes.

Cada token é projetado em três vetores: uma consulta (o que estou procurando?), uma chave (o que eu contenho?) e um valor (o que eu passo?). Os pesos de atenção do token ii para cada token jj são

αij=softmaxj(qi⋅kjd)\alpha_{ij} = \mathrm{softmax}_j\left(\frac{q_i \cdot k_j}{\sqrt{d}}\right)

onde dd é o tamanho dos vetores e a saída do token ii é a soma ponderada dos valores: ∑jαijvj\sum_j \alpha_{ij} v_j.

Experimente

Até 15 XP

A que palavra “ela” dá atenção?

Pesos fictícios de uma cabeça de atenção. Clique em ela e depois em leve para ver quais palavras anteriores recebem mais atenção. Em um modelo real, cada cabeça pode aprender relações diferentes.

Clique em uma palavra para ver para onde ela olha

“O” dá mais atenção a “O” (23%). Os pesos somam 100%.

  • O23,2%
  • robô8,5%
  • pegou8,5%
  • a8,5%
  • pequena8,5%
  • bola8,5%
  • porque8,5%
  • ela8,5%
  • era8,5%
  • leve8,5%

Sem espiar: a máscara causal

Um LLM é treinado para prever cada token seguinte, portanto, um token não deve ver os tokens posteriores - isso seria trapaça. Modelos somente decodificadores (GPT, Claude, Llama e a maioria dos modelos de chat) aplicam uma máscara causal: as pontuações para posições futuras são definidas como −∞ antes do softmax, então seus pesos se tornam exatamente 0.

Um bloco transformador é então: atenção (muitas cabeças em paralelo) → adicionar e normalizar → uma rede feed-forward aplicada a cada token → adicionar e normalizar. Os modelos empilham dezenas de blocos. Como a própria atenção ignora a ordem, informações posicionais (como incorporações de posição rotativa) são misturadas, de modo que “cachorro morde homem” difere de “homem morde cachorro”.

softmax_mask.py
1import numpy as np
2scores = np.array([2.0, 1.0, -np.inf])
3weights = np.exp(scores - scores.max())
4weights /= weights.sum()
5print(np.round(weights, 2))
Saída
[0.73 0.27 0.  ]

Principais conclusões

  • Os pesos de atenção são softmax(q⋅k/d)\mathrm{softmax}(q \cdot k / \sqrt{d}); os resultados são somas ponderadas de valores.

  • LLMs somente decodificadores mascaram tokens futuros para que cada posição veja apenas o passado.

  • Um Transformer empilha blocos de atenção de múltiplas cabeças e camadas de feed-forward, com informações posicionais.

Quiz da aula

7 perguntas · aprovação com 5 acertos · até 50 XP

Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.

Pratique: escreva código em Python

Escreva código Python no editor e execute os testes com exemplos. O Python roda localmente no navegador usando WebAssembly.

Exercício 1

Atenção dimensionada ao produto escalar com numpy

+25 XP

Leia três matrizes JSON, uma por linha: Q, K e V. Calcule W=softmax(QK⊤/d)W = \mathrm{softmax}\left(QK^\top / \sqrt{d}\right) linha por linha (dd = número de colunas de Q) e a saída WVWV. Imprima weights: e output: seguidos por cada um como uma lista aninhada arredondada para 2 casas decimais (np.round(...).tolist()).

  • Duas consultas, três chaves
main.py
Carregando editor…

O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.

Exercício 2

Aplique uma máscara causal

+25 XP

Leia uma matriz JSON quadrada de pontuações de atenção. Defina cada pontuação acima da diagonal (posições futuras) como −∞, aplique softmax a cada linha e imprima os pesos de cada linha com 2 casas decimais separadas por espaços.

  • Três tokens
main.py
Carregando editor…

O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.

Dúvidas sobre esta lição

Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.

Carregando publicações…