Mecânicas de Attention
Visão geral: o que a “atenção” faz
Em Transformers, atenção é o mecanismo que permite que cada token (ou posição) em uma sequência agregue seletivamente informações de outros tokens. Em vez de processar tokens estritamente da esquerda para a direita como uma RNN, a atenção computa médias ponderadas dependentes dos dados sobre um conjunto de vetores, permitindo mistura flexível de contexto, dependências de longo alcance e computação paralela.
A maioria das implementações modernas usa atenção por produto escalar com escala (scaled dot-product attention), parametrizada por consultas (Q) (queries), chaves (K) (keys) e valores (V) (values). Entender como Q/K/V são formados, como padrões de atenção emergem e como são os custos computacionais é central para entender a Arquitetura Transformer.
Consultas, chaves e valores (Q/K/V)
A ideia central
A atenção é frequentemente explicada por uma analogia com recuperação de informação:
- Uma consulta pergunta “o que estou procurando?”
- Uma chave descreve “o que eu contenho / com o que eu combino?”
- Um valor contém “a informação a retornar se você prestar atenção em mim.”
Cada token produz um vetor de consulta, chave e valor via projeções lineares aprendidas do seu estado oculto.
Dada uma sequência de entrada representada como uma matriz:
- (X \in \mathbb{R}^{n \times d_{\text{model}}}) onde:
- (n) = comprimento da sequência (número de tokens)
- (d_{\text{model}}) = tamanho do estado oculto
Calculamos:
- (Q = XW_Q), (K = XW_K), (V = XW_V)
com (W_Q, W_K, W_V \in \mathbb{R}^{d_{\text{model}} \times d_k}) (frequentemente (d_k = d_{\text{model}} / h) para (h) cabeças).
Atenção por produto escalar com escala
Para uma única cabeça, a atenção produz:
[ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}} + M\right)V ]
Onde:
- (QK^\top \in \mathbb{R}^{n \times n}) contém todos os produtos escalares par-a-par entre consultas e chaves.
- A escala por (\sqrt{d_k}) impede que produtos escalares cresçam demais conforme a dimensionalidade aumenta (o que saturaria o softmax e prejudicaria os gradientes).
- (M) é uma máscara (mask) opcional (por exemplo, a máscara causal usa (-\infty) para posições não permitidas).
- O softmax produz uma matriz de atenção (A \in \mathbb{R}^{n \times n}) com linhas somando 1.
- A saída é uma soma ponderada dos vetores de valor para cada posição de consulta.
Um mini-exemplo concreto
Suponha que temos 3 tokens: ["I", "love", "pizza"]. Após as projeções, obtemos:
- A consulta para “love” pode alinhar fortemente com chaves de palavras com carga de sentimento ou objetos.
- Se “love” prestar mais atenção em “pizza”, então a saída na posição “love” torna-se uma mistura dominada pelo vetor de valor de “pizza”, permitindo que a representação de “love” incorpore seu objeto.
Essa “mistura” não é uma seleção rígida — a atenção é suave, diferenciável e aprendida ponta a ponta via Retropropagação.
Autoatenção vs atenção cruzada
Autoatenção
Autoatenção (self-attention) significa que Q, K e V vêm todos da mesma sequência (X). Esse é o padrão em codificadores Transformer e em blocos de decodificador.
- Captura dependências dentro de uma sequência (por exemplo, concordância sujeito–verbo, correferência).
- Pode ser bidirecional (estilo codificador) ou causal (estilo decodificador).
Atenção cruzada (atenção codificador–decodificador)
Atenção cruzada (cross-attention) usa consultas de uma sequência e chaves/valores de outra:
- (Q = X_{\text{decoder}}W_Q)
- (K = X_{\text{encoder}}W_K)
- (V = X_{\text{encoder}}W_V)
Isso é central em tarefas de Sequência-para-Sequência como tradução e sumarização: o decodificador consulta a sentença-fonte codificada enquanto gera o alvo.
Atenção multi-cabeças: por que várias cabeças?
Em vez de computar uma única distribuição de atenção, Transformers usam atenção multi-cabeças (MHA) (multi-head attention):
- Projetar (X) em (h) conjuntos de Q/K/V (um por cabeça)
- Computar atenção por cabeça
- Concatenar as saídas das cabeças e projetar de volta para (d_{\text{model}})
Intuição: diferentes cabeças podem se especializar em diferentes “relações”:
- Dependências sintáticas locais
- Correferência de longo alcance
- Detecção de delimitadores / fronteiras
- Padrões de cópia semelhantes a indução
Na prática, não há garantia de que as cabeças sejam interpretáveis, mas a atenção multi-cabeças aumenta a capacidade de representação e ajuda na otimização.
Máscaras e restrições (legalidade da atenção)
Máscara causal (decodificação autorregressiva)
Em modelagem de linguagem, o token (t) não deve usar tokens futuros (> t). Uma máscara causal impõe:
- A posição (i) pode prestar atenção apenas a posições (\le i)
Isso produz a conhecida matriz de atenção triangular.
Máscaras de padding
Ao agrupar sequências de comprimentos diferentes, tokens de padding não devem contribuir. Uma máscara de padding define pontuações de atenção em direção a posições de pad como (-\infty) antes do softmax.
Combinando máscaras
Sistemas reais frequentemente combinam ambas:
- máscara causal (sem futuro)
- máscara de padding (ignorar pad)
Mascaramento é um detalhe “mecânico” crucial: mascaramento incorreto pode corromper o treinamento silenciosamente.
Padrões de atenção: como os pesos tendem a se parecer
“Padrões de atenção” referem-se à estrutura da matriz de atenção (A). Embora os pesos de atenção não sejam explicações perfeitas do raciocínio do modelo, padrões recorrentes aparecem em diferentes modelos e camadas.
Atenção local vs global
- Atenção local: pesos fortes perto da diagonal (tokens próximos). Comum em camadas iniciais, onde modelos constroem características em nível de frase.
- Atenção global: pesos distribuídos ao longo da sequência, frequentemente em camadas mais profundas, capturando relações em nível de discurso ou documento.
Padrões de cópia e alinhamento
- Em modelos de tradução (codificador–decodificador), a atenção cruzada frequentemente forma alinhamentos quase monotônicos entre posições de origem e alvo.
- Em sumarização, a atenção cruzada pode se concentrar em trechos salientes da origem.
Tokens especializados e “roteamento”
Em modelos com tokens especiais (por exemplo, [CLS] em alguns codificadores), a atenção pode rotear informações para dentro ou para fora desses tokens. Em LLMs somente decodificador, delimitadores e marcadores de sistema/usuário podem atrair atenção como âncoras globais.
Comportamento semelhante a indução e semelhante a recuperação
Em modelos de linguagem grandes, algumas cabeças se comportam como:
- “cabeças de indução” (induction heads): prestam atenção a ocorrências anteriores de padrões de tokens para continuar sequências (útil para estruturas repetitivas).
- cabeças “name mover” / “copy”: movem informações de entidades adiante.
Esses são comportamentos emergentes, e não recursos explicitamente programados.
Como a informação posicional influencia padrões
A atenção em si é invariante a permutações; sem informação de posição, ela não consegue distinguir “dog bites man” de “man bites dog.” A informação posicional é injetada via Codificações Posicionais (absolutas, relativas, rotatórias, etc.), moldando quais padrões são aprendíveis e frequentemente melhorando a generalização de longo alcance.
Custos computacionais: por que a atenção pode ser cara
O principal fator de custo é a matriz de atenção (n \times n).
Complexidade de tempo (por camada)
Para autoatenção densa por produto escalar com escala:
- Computar escores: (QK^\top) custa (O(n^2 d_k))
- Aplicar softmax: (O(n^2))
- Multiplicar por valores: (AV) custa (O(n^2 d_v))
No geral: (O(n^2 d)) (com (d) na ordem da dimensão por cabeça vezes o número de cabeças, frequentemente comparável a (d_{\text{model}})).
Essa dependência quadrática do comprimento da sequência é a limitação central para modelos de contexto longo.
Complexidade de memória
Armazenar ingenuamente a matriz de atenção (A \in \mathbb{R}^{n \times n}) para retropropagação consome:
- (O(n^2)) de memória por cabeça (ou por camada, dependendo da implementação)
O treinamento pode ser dominado pela memória de atenção quando (n) é grande.
Efeito de multi-cabeças
Com (h) cabeças, o custo é aproximadamente multiplicado por (h), embora implementações frequentemente fundam operações. Ainda assim, o fator (n^2) permanece.
Intuição de escala prática
Se você dobrar o comprimento de contexto (n), o custo de computação e a memória da atenção densa crescem aproximadamente 4×. Por isso o treinamento com contexto longo é caro, e por isso otimizações de inferência importam.
Mecânica prática em código (formas e operações)
Abaixo está um esboço mínimo no estilo PyTorch mostrando a “mecânica” (não otimizado para produção):
import torch
import math
def scaled_dot_product_attention(x, Wq, Wk, Wv, mask=None):
"""
x: (B, N, Dmodel)
Wq: (Dmodel, Dk)
Wk: (Dmodel, Dk)
Wv: (Dmodel, Dv)
mask: (B, 1, N, N) or broadcastable to attention scores
with 0 for allowed, -inf for disallowed.
"""
Q = x @ Wq # (B, N, Dk)
K = x @ Wk # (B, N, Dk)
V = x @ Wv # (B, N, Dv)
scores = (Q @ K.transpose(-1, -2)) / math.sqrt(Q.shape[-1]) # (B, N, N)
if mask is not None:
scores = scores + mask
A = torch.softmax(scores, dim=-1) # (B, N, N)
out = A @ V # (B, N, Dv)
return out, A
Notas práticas importantes:
- Estabilidade numérica: implementações reais frequentemente subtraem o máximo por linha de
scoresantes do softmax. - Mascaramento: use (-\infty) (ou um número grande e negativo) para que o softmax atribua probabilidade ~0.
- Precisão: treinamento de precisão mista pode tornar o softmax sensível; kernels fundidos ajudam.
Custos em tempo de inferência e cache de KV
Na decodificação autorregressiva, você gera um token por vez. Uma implementação ingênua recomputaria a atenção sobre todo o prefixo repetidamente, o que é desperdício.
Cache de KV
No passo (t), você computa a nova chave e o novo valor do token e os anexa a um cache:
- (K_{\le t}), (V_{\le t}) em cache
- Nova consulta (Q_t) presta atenção sobre as chaves em cache
Isso altera o trabalho por token:
- Em vez de recomputar todos (K,V) para tokens anteriores, você os reutiliza.
- A atenção ainda exige produtos escalares contra todos os tokens anteriores, então o custo de atenção por token é (O(t d)), e gerar (n) tokens ainda é (O(n^2 d)) no total — mas com um fator constante muito menor.
Trade-off de memória
O cache de KV armazena chaves/valores para cada camada:
- A memória cresce como (O(n \cdot d_{\text{model}} \cdot \text{#layers})) (vezes um pequeno fator para K e V)
- Isso pode se tornar o gargalo ao servir contextos longos, mesmo que a computação seja administrável.
Variantes comuns de atenção para reduzir custo
Atenção densa é poderosa, mas cara para sequências longas. Muitos sistemas práticos usam melhorias ou alternativas.
FlashAttention e kernels fundidos (mesma matemática, mais rápido)
Kernels no estilo FlashAttention computam atenção com melhor localidade de memória e evitam materializar a matriz completa (n \times n) na HBM (memória global da GPU), reduzindo uso de memória e frequentemente acelerando treinamento/inferência — especialmente para sequências longas.
- Mesma saída que a atenção padrão (dentro da precisão numérica)
- Grande impacto prático sem mudar a função do modelo
Atenção esparsa / local (muda o padrão)
Em vez de prestar atenção a todos os pares, restrinja a atenção a um subconjunto:
- Janela deslizante: cada token presta atenção a uma janela local de tamanho (w) → (O(n w d))
- Esparsidade em blocos: atenção apenas dentro de blocos e alguns tokens globais
- Global + local: um pequeno conjunto de tokens “globais” presta atenção em todo lugar
Esses métodos são comuns em modelos de documentos longos. Eles trocam expressividade por eficiência; o desenho do padrão importa.
Atenção de baixa-rank e “linear” (evitar \(n^2\))
Alguns métodos aproximam a atenção softmax com truques de kernel de modo que:
[ \text{softmax}(QK^\top)V \approx \phi(Q)\left(\phi(K)^\top V\right) ]
Isso pode ser computado em (O(n d^2)) ou (O(n d)) dependendo das suposições, evitando (n^2). Na prática, aproximações podem degradar a qualidade, especialmente para tarefas que exigem atenção nítida e seletiva.
Atenção Multi-Query (MQA) e Atenção Grouped-Query (GQA)
Na MHA padrão, cada cabeça tem seu próprio K e V. Atenção Multi-Query (MQA) (Multi-Query Attention) compartilha um único conjunto de K/V entre cabeças (Q distinto por cabeça). Atenção Grouped-Query (GQA) (Grouped-Query Attention) é uma abordagem intermediária: várias cabeças de consulta compartilham um grupo de K/V.
- Objetivo: reduzir memória e largura de banda do cache de KV na inferência
- Amplamente usada em LLMs grandes somente decodificador para eficiência de serviço
Atenção em aplicações reais
Modelagem de linguagem e seguimento de instruções
Transformers somente decodificador dependem de autoatenção causal para incorporar contexto. Padrões de atenção frequentemente aprendem a:
- acompanhar tópico e entidades ao longo de trechos extensos
- seguir pistas de formatação (listas, blocos de código)
- condicionar em segmentos de instrução de sistema/usuário (quando presentes)
Técnicas de eficiência como cache de KV e GQA são especialmente importantes para sistemas no estilo chat.
Geração aumentada por recuperação e contexto longo
Quando prompts incluem documentos recuperados, a atenção precisa escalar para sequências longas. Estratégias comuns:
- Usar modelos de contexto longo com kernels de atenção otimizados
- Usar padrões de atenção esparsos
- Dividir documentos em blocos e usar recuperação para manter apenas texto relevante
Transformers de visão e multimodais
A atenção generaliza além do texto:
- Em transformers de visão (ViT), tokens correspondem a patches de imagem; a atenção pode aprender agrupamento espacial.
- Em modelos multimodais, a atenção cruzada pode conectar consultas de texto a chaves/valores de imagem, alinhando palavras a regiões.
Orientação prática: escolhendo e diagnosticando a mecânica de atenção
Quando a atenção densa vale a pena
Use atenção densa quando:
- as sequências têm comprimento moderado (por exemplo, até alguns milhares de tokens) e você precisa de interações completas
- as tarefas dependem de dependências arbitrárias de longo alcance
Quando considerar variantes eficientes
Considere atenção esparsa/linear/aproximada quando:
- você precisa lidar com contextos muito longos (dezenas/centenas de milhares de tokens)
- a memória (cache de KV) domina o custo de serviço
- restrições de latência são rígidas
Dicas de depuração e interpretabilidade (com ressalvas)
- Visualizar mapas de atenção pode revelar bugs de mascaramento e comportamentos grosseiros (por exemplo, atenção “vazando” para tokens futuros).
- Trate pesos de atenção como uma ferramenta diagnóstica, não como uma explicação completa das decisões do modelo.
Principais conclusões
- Q/K/V são projeções aprendidas que transformam “casar” (Q·K) em “misturar” (soma ponderada de V).
- Atenção por produto escalar com escala computa uma matriz de similaridade (n \times n), aplica mascaramento, softmax e agrega valores.
- Padrões de atenção (local, global, alinhamento, cópia) emergem do treinamento e são moldados por métodos posicionais como Codificações Posicionais.
- A principal limitação da atenção densa é o custo quadrático no comprimento da sequência; isso afeta tanto o treinamento (memória de ativações) quanto a inferência (cache de KV + computação).
- Sistemas modernos mitigam custos com kernels fundidos (FlashAttention), cache de KV, MQA/GQA e, às vezes, atenção esparsa ou aproximada dependendo de trade-offs entre qualidade e eficiência.
Se você quiser, posso adicionar uma seção curta com estimativas de custo “regra de bolso” (em FLOPs e bytes) para tamanhos típicos de LLMs e comprimentos de contexto, ou um aprofundamento sobre como a máscara causal interage com o cache de KV em arquiteturas somente decodificador.