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):

  1. Projetar (X) em (h) conjuntos de Q/K/V (um por cabeça)
  2. Computar atenção por cabeça
  3. 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 . 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 scores antes 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.