Attention Mechanism
Um mecanismo de atenção pondera as características de entrada segundo a sua relevância, através de consultas, chaves e valores. Aborda a matemática, os tipos de atenção e a atenção vs. convolução.
Um mecanismo de atenção é uma operação de rede neural que constrói cada saída como uma média ponderada das características de entrada, com pesos calculados conforme a relevância de cada entrada para o elemento em processamento. A relevância é avaliada comparando um vetor de consulta com vetores-chave, e as pontuações resultantes ponderam os vetores de valor correspondentes. A atenção foi introduzida em 2014 para a tradução automática, permitindo que um decodificador de rede neural recorrente (RNN) consultasse cada palavra da frase de origem, em vez de comprimir a frase inteira em um único vetor de tamanho fixo. O Transformer de 2017 construiu uma arquitetura inteira a partir da atenção, que hoje é a operação central dos grandes modelos de linguagem, dos Transformers de visão e de muitos modelos de detecção de objetos.
Como funciona a atenção#
A atenção usa três projeções lineares aprendidas de sua entrada. A consulta (Q) descreve o que o token atual procura, cada chave (K) descreve o que um token oferece, e cada valor (V) contém o conteúdo que será transmitido. O modelo compara a consulta com cada chave, transforma as pontuações de comparação em pesos e retorna a soma ponderada dos valores. Quando um modelo de tradução produz «noir» para «The black cat», a consulta dessa etapa obtém a pontuação mais alta em relação à chave de «black», embora em francês o adjetivo venha depois do substantivo.
A atenção multi-head executa vários desses cálculos em paralelo, cada um usando suas próprias projeções de dimensão menor, e concatena os resultados. Diferentes cabeças podem então se especializar em relações distintas dentro da mesma camada.
Atenção de produto escalar escalado#
A atenção do Transformer é escrita como Attention(Q, K, V) = softmax(QKᵀ / √d_k) V. Cada consulta é comparada com cada chave por meio de um produto escalar, e as pontuações são divididas pela raiz quadrada da dimensão da chave d_k para que não aumentem com o tamanho do vetor e saturem o softmax. O softmax transforma as pontuações de cada consulta em pesos cuja soma é 1, e a saída é a soma ponderada dos vetores de valor.
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Consultas, chaves e valores para uma sequência de 4 tokens, cada um com 8 dimensões
q, k, v = torch.randn(3, 4, 8).unbind(0)
# Calcula a pontuação de cada consulta em relação a cada chave, escala por sqrt(d_k) e normaliza cada linha com softmax
weights = (q @ k.T / k.shape[-1] ** 0.5).softmax(dim=-1)
# Cada token de saída é uma média ponderada dos vetores de valor
output = weights @ v
print("Attention weights of token 0:", [round(w, 3) for w in weights[0].tolist()])
print("Matches PyTorch SDPA:", torch.allclose(output, F.scaled_dot_product_attention(q, k, v), atol=1e-6))Isso imprime [0.121, 0.741, 0.106, 0.032] e True: o token 0 obtém 74% da sua saída do vetor de valores do token 1, os seus quatro pesos somam 1, e o resultado manual corresponde à implementação fundida do PyTorch com scaled_dot_product_attention, que encaminha a execução para kernels com uso eficiente de memória, como FlashAttention, em GPUs compatíveis.
Tipos de atenção#
- Autoatenção: Consultas, chaves e valores vêm todos da mesma sequência, então cada token reúne contexto de todos os outros. É a atenção usada nos codificadores Transformer e nos ViTs.
- Atenção cruzada: As consultas vêm de uma sequência, e as chaves e os valores, de outra. Um decodificador de tradução presta atenção à frase de origem, um modelo de difusão de texto para imagem presta atenção ao prompt, e as consultas de objeto de um decodificador DETR prestam atenção às características da imagem.
- Atenção causal: Uma máscara impede cada token de prestar atenção aos tokens posteriores, permitindo que um modelo de linguagem gere texto da esquerda para a direita e que as chaves e os valores dos tokens anteriores sejam armazenados em um cache KV.
- Atenção eficiente: A atenção esparsa, a atenção de janela deslizante e a atenção linear reduzem o custo quadrático de comparar cada token com todos os outros, e a atenção deformável amostra apenas alguns pontos aprendidos ao redor de cada posição de referência.
- Atenção de canal em CNNs: As redes Squeeze-and-Excitation reponderam os canais de um mapa de características usando sua média global, uma forma barata de atenção que serviu de base para a solução vencedora de classificação do ILSVRC 2017.
Atenção vs. convolução#
Uma convolução aplica o mesmo filtro pequeno em cada posição, de modo que cada saída vê uma janela local fixa e seus pesos não dependem da imagem. A atenção calcula seus pesos a partir do conteúdo e pode conectar quaisquer duas posições em uma única camada. O custo é crescer com o quadrado do número de tokens. Uma imagem de 640×640 com stride 32 produz uma grade de 20×20, com 400 tokens e 160.000 pares consulta-chave, e a grade com stride 8 da mesma imagem tem 6.400 tokens e quase 41 milhões de pares. O YOLO26 posiciona seus blocos de atenção de acordo com isso: o bloco C2PSA que termina o backbone e um bloco C3k2 com atenção no neck executam ambos autoatenção multi-head no mapa de características de 20×20 com stride 32, enquanto todas as camadas de resolução mais alta permanecem convolucionais.










