Self-Attention
A autoatenção permite que cada token de uma sequência atribua pesos a todos os outros tokens, usando consultas, chaves e valores derivados da mesma entrada. É o núcleo dos transformers.
A autoatenção é uma forma de atenção em que as consultas, chaves e valores vêm todos da mesma sequência, de modo que cada token constrói sua nova representação a partir de todos os outros tokens dessa sequência. Uma camada de autoatenção pode conectar, em uma única etapa, a primeira e a última palavra de um parágrafo ou cantos opostos de uma imagem, enquanto uma rede neural recorrente (RNN) precisa de uma etapa por posição e uma rede neural convolucional (CNN) precisa de muitas camadas empilhadas para ampliar seu campo de visão. Empilhada com camadas feed-forward, ela forma o Transformer apresentado no artigo de 2017 Attention Is All You Need, que sustenta os modelos de linguagem grandes (LLMs), os Transformers de visão (ViT) e os detectores baseados em Transformer.
Como funciona a autoatenção#
Cada token de entrada, representado como um embedding, é multiplicado por três matrizes aprendidas para gerar uma consulta, uma chave e um valor. A saída do token i é uma média ponderada do vetor de valor de cada token, com pesos definidos por um softmax aplicado aos produtos escalares escalonados entre a consulta do token i e todas as chaves — a atenção por produto escalar escalonado descrita na página sobre o mecanismo de atenção. Como as consultas, chaves e valores são projeções dos mesmos tokens, uma sequência de n tokens produz uma matriz de pesos n × n. Em “O animal não atravessou a rua porque estava muito cansado”, a linha de “estava” pode atribuir a maior parte do peso a “animal” e incorporar o significado dessa palavra à própria representação.
A autoatenção multi-head executa várias dessas operações em paralelo sobre projeções menores e concatena os resultados, permitindo que cabeças diferentes acompanhem relações diferentes, como sintaxe em uma cabeça e correferência em outra. O Transformer original usava 8 cabeças com 64 dimensões cada em um modelo de 512 dimensões.
Cegueira à ordem e mascaramento causal#
A autoatenção trata sua entrada como um conjunto. Embaralhar os tokens embaralha as saídas da mesma maneira e não altera mais nada, por isso os modelos adicionam informações de posição, como embeddings senoidais no Transformer original ou embedding posicional rotativo (RoPE) na maioria dos LLMs atuais. Codificadores como BERT permitem que cada token preste atenção nas duas direções. Os LLMs somente decodificadores aplicam uma máscara causal para que cada token preste atenção apenas a si mesmo e aos tokens anteriores, permitindo que o modelo gere texto da esquerda para a direita e reutilize as chaves e os valores dos tokens anteriores de um cache KV. A MultiheadAttention do PyTorch demonstra ambas as propriedades quando o mesmo tensor é passado como consulta, chave e valor:
import torch
torch.manual_seed(0)
tokens = torch.randn(1, 5, 16) # uma sequência de 5 tokens com 16 características cada
attn = torch.nn.MultiheadAttention(embed_dim=16, num_heads=2, batch_first=True)
# Autoatenção: consultas, chaves e valores são todos projeções dos mesmos tokens
out, weights = attn(tokens, tokens, tokens)
print("Attention weights shape:", tuple(weights.shape))
# Embaralhar os tokens apenas embaralha as saídas; sem informações de posição, a ordem das palavras é invisível
perm = torch.tensor([3, 0, 4, 1, 2])
out_shuffled, _ = attn(tokens[:, perm], tokens[:, perm], tokens[:, perm])
print("Same outputs after shuffling:", torch.allclose(out_shuffled, out[:, perm], atol=1e-6))
# Uma máscara causal bloqueia a atenção aos tokens posteriores, como em um LLM somente decodificador
mask = torch.triu(torch.ones(5, 5, dtype=torch.bool), diagonal=1)
_, causal_weights = attn(tokens, tokens, tokens, attn_mask=mask)
print(causal_weights[0].detach().round(decimals=2))Imprime o formato dos pesos (1, 5, 5), True para o teste de embaralhamento e uma matriz triangular inferior: o primeiro token atribui peso 1.00 a si mesmo, o segundo divide o peso em 0.31 e 0.69 entre os dois primeiros tokens, e cada entrada acima da diagonal é 0.00.
Autoatenção versus termos relacionados#
- Mecanismo de atenção: A operação geral que pondera os valores pela semelhança entre consultas e chaves. A autoatenção é o caso em que os três vêm de uma única sequência.
- 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 codificada, as consultas de objeto de um decodificador DETR prestam atenção às características da imagem, e um modelo de difusão de texto para imagem presta atenção ao prompt.
- Convolução: Aplica o mesmo filtro pequeno em cada posição, de modo que cada saída observa uma janela local fixa com pesos que não dependem do conteúdo. A autoatenção calcula seus pesos a partir do conteúdo e abrange toda a entrada.
O Transformer original codificador-decodificador combina autoatenção bidirecional, autoatenção causal e atenção cruzada:
Custo e variantes eficientes#
Calcular a pontuação de cada par de tokens faz o tempo e a memória crescerem com o quadrado do comprimento da sequência: 1.000 tokens geram um milhão de pontuações por cabeça e 100.000 tokens geram dez bilhões. O FlashAttention calcula a autoatenção exata em blocos, sem armazenar a matriz completa; a atenção de consulta agrupada (GQA) compartilha chaves e valores entre cabeças para reduzir o cache KV; e a atenção de janela deslizante, a atenção esparsa e a atenção linear reduzem o número de pares. Em visão computacional, a quantidade de tokens depende da resolução da imagem, por isso muitos detectores aplicam autoatenção apenas onde os mapas de características são menores. O YOLO26 executa autoatenção multi-head apenas no bloco C2PSA no final do backbone e em um bloco C3k2 com atenção no neck, ambos no mapa de características 20×20 com stride 32 de uma imagem de 640 pixels, ou seja, 400 tokens. Seu módulo de atenção calcula consultas, chaves e valores com uma única convolução 1×1 sobre esse mapa e adiciona informações de posição com uma convolução depthwise 3×3 aplicada aos valores.










