Essencial
Causal masking e por que a ordem importa
Um causal mask impede que o treinamento de próximo token vaze a resposta, ao mesmo tempo que permite treinar toda posição de prefixo em paralelo — e é por isso que o cache em decode funciona.
Atualizada em
01 · Conceito
Conceito
Eis a armadilha que todo treinamento de próximo token precisa evitar. Os dados de treino chegam como sequências completas: o modelo vê “O cache armazena keys” de uma vez só, mas está sendo avaliado por prever cada token apenas a partir dos anteriores. Self-attention, como construída nas lições 4.2 e 4.3, deixa cada posição ler todas as outras. Sem restrição, a posição que prevê “armazena” simplesmente daria attention a “armazena”, ali mesmo no tensor, copiaria o token adiante e alcançaria uma loss de treino espetacular que não significa nada. O modelo aprenderia a colar, e a geração — onde o futuro genuinamente ainda não existe — desmoronaria.
Formalmente, um modelo de linguagem causal aprende a fatoração
de modo que o cálculo para a posição só pode depender de tokens anteriores. Causal masking faz attention obedecer a essa fatoração mantendo o treinamento paralelo.
| O | cache | armazena | keys | |
|---|---|---|---|---|
| O | 0,25 | 0,3 | 0,2 | 0,25 |
| cache | 0,3 | 0,35 | 0,2 | 0,15 |
| armazena | 0,15 | 0,35 | 0,3 | 0,2 |
| keys | 0,1 | 0,3 | 0,2 | 0,4 |
Sem máscara, cada posição atende a todas as outras — inclusive às que vêm depois dela. Cada linha soma 1 entre as quatro.
| O | cache | armazena | keys | |
|---|---|---|---|---|
| O | 1 | bloqueado | bloqueado | bloqueado |
| cache | 0,46 | 0,54 | bloqueado | bloqueado |
| armazena | 0,19 | 0,44 | 0,37 | bloqueado |
| keys | 0,1 | 0,3 | 0,2 | 0,4 |
As células hachuradas viraram menos infinito antes do softmax, então contribuem exatamente zero — e os pesos restantes se renormalizam apenas sobre o passado. A posição 1 agora atende só a si mesma; a posição 4 não muda, porque não tinha futuro a perder.
Vamos trabalhar isso num prompt real. Pegue a entrada de quatro palavras “O cache armazena keys” e, para este exemplo, trate cada palavra como um token (um tokenizador real, como a lição 1.2 mostrou, pode dividir as palavras ainda mais — o tokenizador do Qwen3.8-27B usa um vocabulário de 248.320 entradas, e a máscara se aplica às posições de token que ele produzir, quaisquer que sejam). Numere as posições de 1 a 4. O padrão de attention permitida é triangular inferior:
A linha é a posição de query que lê; a coluna é a key que está sendo lida. A posição 1, “O”, vê apenas a si mesma. A posição 2, “cache”, vê “O” e a si mesma. A posição 3, “armazena”, vê “O cache armazena” — e, crucialmente, não vê “keys”, justamente o token que seu hidden state está prestes a prever. A posição 4 vê tudo. As implementações realizam isso com uma máscara aditiva: 0 nas entradas permitidas, nas proibidas, somada a antes do softmax. Como , as posições proibidas recebem peso exatamente zero — a mesma mecânica de exponenciação da lição 4.3, usada aqui como interruptor. (Em precisão finita, as bibliotecas usam o valor representável mais negativo ou uma flag de kernel; uma constante “bem negativa” escolhida no chute pode ser insuficiente em dtypes de baixa precisão.)
Agora a correção clássica e errada, porque ela é genuinamente tentadora. “Por que mascarar attention? Basta calcular a loss apenas a partir da predição de cada posição — tokens futuros têm seus próprios termos de loss, então nada é roubado.” Isso mascara a avaliação, não a informação. Mesmo com uma loss perfeitamente por posição, attention sem máscara deixa o hidden state da posição 3 absorver features de “keys” a partir da representação da posição 4 numa camada anterior, ou ler a posição 4 diretamente. O vazamento está nas ativações, não na loss. A correção: restringir o próprio grafo de computação, que é exatamente o que a máscara triangular faz.
O ganho da máscara é um raro almoço grátis: fluxo de informação sequencial com computação de treinamento paralela. Todas as linhas da matriz de scores são calculadas numa única operação em batch, e ainda assim a linha 3 depende apenas das colunas 1 a 3. Uma RNN impõe causalidade executando em ordem; um Transformer a impõe por conectividade e, com isso, treina simultaneamente todas as posições de todas as sequências.
O mesmo triângulo explica o decode. Durante a geração, o modelo mantém um prefixo, produz um token, o anexa e repete. Como a máscara garante que a key e o value da posição só são lidos por posições — nunca revisados por posições posteriores —, os K e V por posição calculados ao processar o prefixo são definitivos. Eles podem ser armazenados e reutilizados em vez de recalculados a cada passo. Esse armazenamento é o KV cache; toda a sua aritmética para o Qwen3.8-27B aparece na lição 7.2. No Qwen, a história da máscara tem uma reviravolta que vale antecipar: apenas as suas 16 camadas de attention completa implementam causalidade com essa máscara triangular, enquanto as outras 48 camadas Gated DeltaNet são causais por construção, processando tokens como uma recorrência ordenada (lição 4.15).
Mantenha o causal mask distinto dos vizinhos. Uma padding mask esconde posições de preenchimento quando sequências de comprimentos diferentes compartilham um batch — inválidas por comprimento, não por ordem —, e treinamento com documentos empacotados pode acrescentar uma máscara de fronteira para que um documento não dê attention ao anterior; um batch pode precisar de todas ao mesmo tempo. E causalidade não é a mesma coisa que conhecer posições: o triângulo diz quais tokens vêm antes, mas distinguir “cachorro morde homem” de “homem morde cachorro” entre os tokens visíveis exige a informação posicional das lições 4.6 a 4.8. Encoders bidirecionais como o BERT descartam o triângulo por completo e pagam por isso com a incapacidade de gerar da esquerda para a direita.
A regra durável cabe numa frase: o tensor de treinamento pode conter o futuro, mas a computação de nenhuma predição pode. Uma matriz triangular transforma essa regra em estrutura — preservando treinamento paralelo, protegendo o objetivo e, discretamente, tornando possível um decode rápido.
02 · Analogia
Analogia
Imagine uma prova impressa numa tira de papel. Para a questão cinco, uma capa deslizante revela apenas as questões um a cinco e esconde todas as respostas posteriores. O professor pode preparar uma posição de capa para cada questão de uma vez, então todas as questões são corrigidas em paralelo, mas nenhuma questão vê o próprio futuro. Um causal mask de attention é esse conjunto triangular de capas aplicado a uma matriz de scores.
03 · Explique de volta
Explique de volta
Explique como um causal mask permite treinamento paralelo sem vazamento de tokens futuros, e por que mascarar apenas a loss não bastaria.
Comparar com uma resposta-modelo
O treinamento fornece a sequência de tokens inteira, mas um causal mask triangular coloca os logits de attention da posição i para posições maiores que i em menos infinito antes do softmax, de modo que seus pesos ficam exatamente zero. Cada linha da matriz de attention é calculada na mesma operação em batch e ainda assim recebe informação apenas do seu prefixo. Mascarar somente a loss falha porque mesmo uma posição sem termo de loss pode escrever informação de tokens futuros em hidden states que predições anteriores leem via attention; a máscara precisa restringir o fluxo de informação, não apenas quais posições são avaliadas. Em decode, essa mesma propriedade significa que keys e values passados são definitivos e podem ficar em cache.
04 · Teste seu entendimento
Teste seu entendimento
Conclua o teach-back e acerte o quiz para finalizar a aula.
◎ · Marcador de evidência
Fontes
- Ashish Vaswani et al. (2017). Attention Is All You Need.
- Alec Radford et al. (2019). Language Models are Unsupervised Multitask Learners.
- Qwen Team (2026). Qwen3.8-27B Model Card.