12. Attention Mechanisms
Mecanismos de Atenção
O mecanismo de atenção é uma das inovações mais impactantes na história do aprendizado profundo. Introduzido por Bahdanau et al. (2015)1 para tradução automática, ele permitiu que redes neurais aprendessem onde olhar em uma sequência de entrada — em vez de comprimir tudo em um único vetor de contexto.
Intuitivamente, atenção é o que você faz ao ler esta frase: seus olhos e cérebro não processam todas as palavras com igual peso. Ao interpretar "O gato sentou no tapete porque ele estava confortável", o pronome ele direciona a atenção para tapete — não gato ou sentou. Redes com atenção aprendem esse comportamento automaticamente.
Intuição: Query, Key e Value
O mecanismo de atenção é formalizado por três conceitos: Query (Q), Key (K) e Value (V).
Pense na analogia de uma busca em banco de dados:
- Query — o que você está buscando (ex: vetor da palavra "it")
- Key — o índice de cada item disponível (ex: vetor de cada palavra na frase)
- Value — o conteúdo real retornado na correspondência (ex: representação semântica de cada palavra)
A atenção calcula um produto escalar entre a Query e cada Key, normaliza com softmax e usa os pesos resultantes para combinar os Values:
O fator \(\sqrt{d_k}\) estabiliza gradientes quando a dimensão \(d_k\) é grande.
Interativo: Atenção sobre uma Frase
Clique em qualquer palavra para ver como ela "presta atenção" às outras palavras. Os pesos são ilustrativos e pré-computados para demonstrar o conceito.
Atenção por Produto Escalar Escalado — Passo a Passo
Dado um conjunto de vetores de entrada \(X \in \mathbb{R}^{n \times d}\) (n tokens, dimensão d), matrizes de projeção \(W_Q, W_K, W_V\) produzem:
Passo 1 — Pontuações de similaridade:
Passo 2 — Normalização Softmax:
Passo 3 — Saída ponderada:
A matriz \(A\) é a matriz de atenção: cada linha soma 1 e representa quanto o token \(i\) presta atenção a todos os outros tokens.
Playground de Pesos de Atenção
O playground abaixo calcula atenção com vetores bidimensionais. Ajuste os valores e observe os pesos mudarem.
Atenção Multi-Cabeça
Uma única cabeça de atenção captura um tipo de relacionamento entre tokens. A Atenção Multi-Cabeça executa \(h\) cabeças em paralelo, cada uma com projeções independentes \(W_Q^i, W_K^i, W_V^i\):
Cada cabeça pode especializar-se: uma captura dependências sintáticas, outra correferências, outra padrões posicionais.
Self-Attention vs. Cross-Attention
| Tipo | Q de | K, V de | Uso típico |
|---|---|---|---|
| Self-Attention | mesma sequência | mesma sequência | Encoder Transformer, BERT |
| Cross-Attention | sequência alvo | sequência fonte | Decoder Transformer, CLIP |
| Causal Self-Attention | mesma seq (mascarada) | mesma seq | GPT, decoders autorregressivos |
Na causal self-attention, uma máscara triangular inferior é aplicada antes do softmax, impedindo que o token \(i\) veja tokens futuros \(j > i\):
Codificação Posicional
A atenção é invariante a permutações — embaralhar tokens não afeta as pontuações. Para injetar informação de posição, o Transformer original usa codificações senoidais:
Modelos modernos (LLaMA, GPT-4) usam RoPE (Rotary Position Embedding), que aplica rotações aos vetores Q e K, capturando posição relativa de forma mais eficaz.
Complexidade e Eficiência
A atenção padrão é \(O(n^2 d)\) em tempo e memória — cara para sequências longas. Variantes eficientes:
| Método | Complexidade | Ideia |
|---|---|---|
| Softmax Attention (padrão) | \(O(n^2)\) | Matriz de atenção completa |
| Sparse Attention | \(O(n\sqrt{n})\) | Atenção local + global |
| Linear Attention | \(O(n)\) | Decomposição por kernel |
| FlashAttention | \(O(n^2)\) tempo, \(O(n)\) memória | Tiling eficiente em SRAM |
FlashAttention3 é o padrão moderno: matematicamente idêntico, mas reordena cálculos para minimizar transferências HBM↔SRAM na GPU.
-
Bahdanau, D., Cho, K., & Bengio, Y. (2015). Neural Machine Translation by Jointly Learning to Align and Translate. ↩
-
Vaswani, A. et al. (2017). Attention Is All You Need. ↩
-
Dao, T. et al. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. ↩