Essencial

Self-attention a partir de princípios básicos: Q, K, V

Self-attention permite que cada token construa uma representação sensível ao contexto — trabalhada aqui com os shapes reais de projeção do Qwen3.8-27B, onde 24 heads de largura 256 tornam a projeção de Q não quadrada.

Atualizada em

01 · Conceito

Conceito

O embedding de um token é uma consulta sem contexto. O token “banco” recebe o mesmo vetor inicial em “banco do rio” e em “conta no banco”, mas um modelo útil precisa tratar essas duas ocorrências de forma diferente. Esse é o problema concreto: transformar uma identidade estática de token numa representação que dependa da sequência ao redor. Self-attention é a operação que faz isso — cada posição decide quanta informação vai buscar em cada outra posição permitida. As próprias posições são saídas do tokenizador da lição 1.2; no Qwen3.8-27B cada uma delas é um vetor de 5120 números, o hidden size do modelo.

Represente a sequência como uma matriz XX: uma linha por posição de token, 5120 features por linha. A camada de attention aprende três matrizes de projeção, WQW_Q, WKW_K e WVW_V, produzindo

Q=XWQ,K=XWK,V=XWV.Q = XW_Q,\qquad K = XW_K,\qquad V = XW_V.

Os nomes descrevem papéis, não entradas diferentes. Queries expressam o que cada posição receptora está procurando. Keys descrevem como cada posição disponível deve ser encontrada. Values contêm a informação que pode ser transferida. Toda posição cria as três a partir da sua representação atual.

  1. q_proj (queries + porta)5120 → 12288
  2. divide por head24 × (256 query + 256 porta)
  3. k_proj · v_proj5120 → 1024 cada
  4. sigmoid(porta) · o_proj6144 → 5120
Nenhuma das quatro matrizes é quadradaA atenção com consultas agrupadas dá 24 cabeças de query mas apenas 4 cabeças KV, todas com dimensão de cabeça 256. Estas camadas têm porta (config: attn_output_gate), então uma única matriz emite as queries e sua porta juntas — 5120 para 12288. A divisão é por head, não ao meio: o tensor é visto como 24 heads de 256 × 2, e o último eixo de cada head é cortado em 256 de query e 256 de porta. A atenção roda sobre a metade de query; sigmoid(porta) então escala a saída da atenção, e o_proj leva esse resultado de 6144 — não as queries — de volta a 5120.

Agora o exemplo trabalhado, com shapes reais. Um primeiro palpite razoável — e o clássico palpite errado — é que cada projeção mapeia o hidden size nele mesmo: 512051205120 \to 5120, uma matriz quadrada. A configuração do Qwen3.8-27B refuta isso. As camadas de Gated Attention do modelo usam 24 query heads, cada uma de dimensão 256. A projeção de query precisa produzir todas elas, então o query state é o número de heads vezes a dimensão de head:

24×256=61445120.24 \times 256 = 6144 \neq 5120.

Esses 6144 são a largura do query state, e ela é genuinamente não quadrada — 61445120=10246144 - 5120 = 1024 mais larga do que uma matriz quadrada seria. A matriz de pesos que a produz é mais larga ainda. Estas são camadas de attention com porta (attn_output_gate na config), e a porta está fundida na mesma projeção: q_proj emite número de heads vezes dimensão de head duas vezes, 24×256×2=1228824 \times 256 \times 2 = 12288. A divisão é por head, não ao meio — a saída é vista como 24 heads de 256×2256 \times 2, e o último eixo de cada head é cortado em 256 valores de query e 256 de porta. Junte as metades de query e você tem o query state de 6144; junte as metades de porta e você tem um segundo 6144 que nunca entra na matriz de scores. Em vez disso, depois que a atenção roda, sua saída é escalada elemento a elemento por σ(porta)\sigma(\text{porta}) e só então projetada. Em disco, portanto, o tensor é 5120122885120 \to 12288; só metade dele vira query. Keys e values são ainda mais estreitos: o modelo tem apenas 4 KV heads (um projeto grouped-query coberto na lição 7.6), então

4×256=1024,4 \times 256 = 1024,

e tanto a projeção de key quanto a de value são 512010245120 \to 1024. Depois que os heads calculam suas saídas e são concatenados de volta à largura 6144, uma projeção de saída mapeia 614451206144 \to 5120 para que o resultado caiba de novo no residual stream. Quatro retângulos, nenhum quadrado: q:512012288q: 5120 \to 12288 (queries e porta juntas), k:51201024k: 5120 \to 1024, v:51201024v: 5120 \to 1024, o:61445120o: 6144 \to 5120. Note que a entrada de oo tem 6144 de largura, não 12288: o que chega até ela é a saída da atenção concatenada e escalada pela porta, que por acaso tem a mesma largura do query state. A porta é aplicada elemento a elemento logo antes de oo, então escala o que oo recebe sem alargá-lo.

Com os shapes resolvidos, o mecanismo: para uma posição receptora, pegue sua query e calcule o produto escalar com cada key. Um produto escalar maior significa direções mais compatíveis. Todos os pares de uma vez formam a matriz de scores QKQK^\top. Escale pela raiz quadrada da dimensão de head (assunto da lição 4.3) e normalize cada linha com softmax:

Attention(Q,K,V)=softmax(QKdk)V.\operatorname{Attention}(Q,K,V) = \operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V.

As saídas do softmax são os pesos de attention: não negativos, cada linha somando um. Multiplicar por VV dá a cada posição de query uma soma ponderada de vetores de value. Essa é a separação crucial — keys decidem onde ler, values determinam o que é lido. Se keys e values fossem forçados a ser os mesmos vetores, endereçamento e conteúdo compartilhariam uma única representação e cada um comprometeria o outro.

Considere “O chef adicionou sal porque a sopa estava sem graça.” A query em “graça” pode casar com as keys de “sopa” e “estava” mais fortemente do que com a key de “chef”. Sua nova representação então mistura informação de value dessas posições. Em outra frase o mesmo token parte do mesmo embedding, mas termina em outro lugar. Essa é a mistura contextual que nos propusemos a construir.

A palavra self significa que queries, keys e values vêm de uma única sequência. Modelos decoder-only como o Qwen3.8-27B acrescentam um causal mask — a posição ii não pode ler posições depois de ii —, tema que a lição 4.4 desenvolve. E um único cálculo de attention não é encarregado de capturar todas as relações: as projeções são divididas nos 24 heads paralelos mencionados acima, assunto da lição 4.5. O bloco completo acrescenta conexões residuais, normalização e uma rede feed-forward; attention é a operação de roteamento dentro desse sistema maior.

Duas propriedades computacionais importam mais adiante. Primeira, todos os scores por pares são operações matriciais, então o treinamento processa as posições em paralelo. Segunda, a matriz de scores tem uma entrada para cada par de posições, gerando crescimento quadrático no comprimento da sequência — a conta que a lição 4.3 quantifica no comprimento de contexto real desse modelo e que a track 7 trabalha para reduzir.

Pesos de attention são evidência sobre roteamento, não prova de raciocínio. Um peso alto mostra que um head transferiu informação de value por uma aresta, numa camada; residual streams, outros heads e camadas posteriores podem amplificar ou cancelar isso. O modelo mental durável é o de uma consulta diferenciável: cada posição escreve uma pergunta, veste um crachá e oferece um conteúdo, e as projeções que definem os três são aprendidas de ponta a ponta.

02 · Analogia

Analogia

Imagine uma redação movimentada. Cada repórter escreve uma pergunta num cartão: essa é a query. Cada fonte usa um crachá descrevendo com que tipo de informação pode ajudar: essa é a key. O repórter compara a pergunta com cada crachá e distribui attention conforme a compatibilidade. O que a fonte escolhida de fato diz é o value. Uma fonte pode ter um crachá que casa fortemente com a pergunta e ainda assim entregar um conteúdo separado. Self-attention repete essa redação em miniatura para cada token, em paralelo.

03 · Explique de volta

Explique de volta

Usando as dimensões reais do Qwen3.8-27B, explique as funções das projeções Q, K, V e de saída, e por que nenhuma delas é uma matriz quadrada.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Aguardando sua explicação.

Comparar com uma resposta-modelo

O hidden state de 5120 dimensões de cada token é projetado de três formas. A projeção de query produz 24 query heads de dimensão 256, então o query state tem 24 vezes 256 = 6144 de largura, não 5120. Como estas são camadas de gated attention, a mesma matriz também emite uma porta de 6144, então o peso em si vai de 5120 para 12288 e é dividido por head em 256 valores de query e 256 de porta; só as metades de query entram na atenção, e o sigmoid da porta escala a saída da atenção antes da projeção de saída. As projeções de key e value mapeiam 5120 para 1024 porque existem apenas 4 KV heads de dimensão 256: 4 vezes 256 é 1024. Queries expressam o que uma posição está procurando, keys descrevem como uma posição pode ser encontrada, values carregam o conteúdo recuperável. Depois que attention mistura os values, a projeção de saída mapeia a concatenação de largura 6144 de volta para 5120, para que o resultado possa ser somado ao residual stream. As larguras são definidas pelo número de heads vezes a dimensão de head, então nada obriga que sejam iguais ao hidden size.

04 · Teste seu entendimento

Teste seu entendimento

01O que é comparado para produzir os scores brutos de attention?
Resposta e explicação

Um vetor de query com vetores de key — Produtos escalares escalados entre a query de uma posição e as keys disponíveis produzem scores de compatibilidade.

02No Qwen3.8-27B, o peso q_proj mapeia 5120 para 12288. Por que ele tem o dobro da largura de query de 24 × 256 = 6144?
Resposta e explicação

Porque estas camadas têm porta: uma única matriz emite as queries e sua porta juntas, divididas por head em 256 valores de query e 256 de porta — A config define attn_output_gate, então q_proj emite número de heads × dimensão de head × 2 = 12288, visto como 24 heads de 512 e dividido por head em 256 de query e 256 de porta. A atenção roda sobre o query state de 6144; o sigmoid da porta escala a saída da atenção, e a projeção de saída leva 6144 de volta para 5120.

03A que correspondem as posições para as quais queries, keys e values são calculados?
Resposta e explicação

Tokens produzidos pelo tokenizador, não palavras ou caracteres — Como a lição 1.2 estabeleceu, as posições de sequência do modelo são saídas do tokenizador; cada posição de token recebe sua própria query, key e value.

Conclua o teach-back e acerte o quiz para finalizar a aula.

◎ · Marcador de evidência

Fontes

  1. Ashish Vaswani et al. (2017). Attention Is All You Need.
  2. Dzmitry Bahdanau, Kyunghyun Cho e Yoshua Bengio (2015). Neural Machine Translation by Jointly Learning to Align and Translate.
  3. Qwen Team (2026). Qwen3.8-27B Model Card.