O que é o residual stream de um transformer?
O residual stream é o vetor que atravessa o transformer inteiro, um por posição do texto. Nenhum bloco o substitui: atenção e feed-forward leem o que está nele, calculam uma correção e somam essa correção de volta. O que a primeira camada escreveu continua lá na última, porque ninguém apagou nada.
É o conceito que faz o resto do modelo fazer sentido junto. O percurso completo, do prompt à resposta, está em como um LLM funciona por dentro; o que abre e fecha o stream nas duas pontas está em embedding e unembedding; e os dois componentes que escrevem nele em cada camada têm artigo próprio, o bloco de atenção e a rede feed-forward.
O nome vem da visão computacional, e uma parte da confusão vem daí. “Conexão residual” é a operação local: somar a entrada de um bloco à saída dele. “Residual stream” é o objeto que aparece quando você repete essa operação setenta vezes e para de olhar bloco a bloco.
O canal por onde todo mundo fala
A formulação mais útil que existe do que isso significa é de 2021, num trabalho de interpretabilidade da Anthropic: todos os componentes do transformer — o embedding de token, as cabeças de atenção, as camadas MLP e o unembedding — se comunicam uns com os outros lendo e escrevendo em subespaços diferentes do residual stream1.
A palavra que carrega o peso é “subespaço”. O stream não é uma lista de campos nomeados nem um pipeline. É um espaço vetorial de largura fixa, e cada componente enxerga uma fatia dele. Uma cabeça de atenção projeta o vetor para baixo, faz o seu cálculo e projeta o resultado de volta para cima: ela lê de um subespaço e escreve em outro, e os dois costumam ser diferentes.
Disso segue a consequência que muda o modo de pensar sobre o modelo. Uma cabeça da camada 3 pode escrever alguma coisa que só uma cabeça da camada 30 vai ler, e nenhum dos componentes entre as duas precisa participar, nem sequer saber que existe uma conversa acontecendo. O stream funciona menos como um cano e mais como um mural em que qualquer um deixa recado para qualquer um mais adiante. É essa propriedade que torna possível falar em circuitos dentro do modelo, e é por isso que o conceito é a porta de entrada da interpretabilidade mecanicista.
O stream também não computa nada. A única operação que acontece nele é adição. Todo o processamento mora nos ramos que saem dele e voltam.
Falta uma peça para a imagem ficar certa: existe um stream por posição do texto, não um para a sequência. Um prompt de mil tokens tem mil vetores correndo em paralelo, cada um recebendo suas próprias somas. O feed-forward trabalha em cada um isolado. A atenção é o único componente que lê de um stream e escreve em outro, e é só por ela que uma palavra chega a influenciar outra.
Por que a soma, e não a substituição
A ideia é de 2015 e não nasceu em linguagem. He e colegas reformularam as camadas de uma rede convolucional para aprender funções residuais em relação à entrada da camada, em vez de aprender a transformação inteira, e com isso treinaram redes de 152 camadas — oito vezes mais profundas que a arquitetura padrão da época e ainda assim menos complexas. O conjunto de modelos chegou a 3,57% de erro no teste do ImageNet e ganhou o ILSVRC 20152.
A aritmética de por que isso ajuda cabe em uma linha. Numa pilha sem atalho, o gradiente que volta da saída até a camada 1 passa por um produto de quarenta fatores. Se cada fator vale 0,9 — número ilustrativo, não medido —, sobra 1,5% do sinal. Se vale 1,1, o sinal explode. Com o atalho existe um caminho onde essa multiplicação simplesmente não acontece.
Dois trabalhos posteriores deram precisão a essa intuição. He e colegas voltaram ao assunto em 2016 e mostraram que, com mapeamentos de identidade nas conexões de atalho, o sinal para frente e para trás se propaga diretamente de qualquer bloco para qualquer outro; treinaram uma rede de 1.001 camadas com 4,62% de erro no CIFAR-103. Veit, Wilber e Belongie decompuseram a rede residual em caminhos de comprimentos diferentes e mediram que, numa rede de 110 camadas, a maior parte do gradiente vem de caminhos de apenas 10 a 34 camadas de profundidade4. A leitura deles é que uma rede residual se comporta menos como uma pilha profunda e mais como um conjunto de redes rasas.
No transformer há um motivo adicional, e ele é específico da atenção. Dong, Cordonnier e Loukas provaram que atenção pura, sem os outros componentes, tem um viés forte para uniformidade entre tokens: a saída converge para uma matriz de posto 1 em ritmo duplamente exponencial com a profundidade. As conexões residuais e os MLPs são exatamente o que impede essa degeneração5. Em outras palavras, a conexão residual não é um truque de otimização emprestado da visão computacional que por sorte funcionou aqui. Sem ela, um transformer profundo colapsa por construção.
Vale registrar onde a normalização entra nessa história, porque ela é o outro detalhe que decide se a pilha treina. Nos modelos de hoje ela fica dentro do ramo residual, e não entre os blocos, o que significa que o caminho de identidade atravessa o modelo do começo ao fim sem nenhuma normalização no meio. O porquê dessa escolha, e a diferença entre as variantes em uso, está em LayerNorm e RMSNorm.
O que se acumula, passo a passo
O vetor que chega ao unembedding é literalmente uma soma: o embedding inicial mais a contribuição de cada cabeça e de cada MLP pelo caminho. Isso não é uma metáfora, é a definição da operação, e tem uma consequência prática grande: dá para pegar uma parcela isolada e perguntar o que ela fez.
Geva e colegas fizeram exatamente isso com as camadas feed-forward. Elas operam como memórias de chave e valor: cada chave casa com um padrão do texto, e cada valor induz uma distribuição sobre o vocabulário de saída. A conclusão que interessa aqui é a última linha do trabalho deles — a saída de uma camada feed-forward é uma composição de memórias, refinada pelas conexões residuais até virar a previsão final6. O stream é onde essa composição acontece.
Há um caso especial que costuma passar despercebido e explica bastante coisa. Como a primeira parcela da soma é o embedding do próprio token e nada a remove, o vetor que chega ao fim ainda contém a identidade do token de entrada, misturada a tudo o que veio depois. Existe um caminho direto do embedding ao unembedding que não passa por bloco nenhum, e ele sozinho já produz uma previsão ruim, mas não aleatória. Boa parte do que os blocos fazem é corrigir essa previsão de base.
Como o unembedding é um produto contra a matriz de saída, dá para aplicar esse produto ao stream em qualquer altura e ver a previsão que estaria sendo feita ali. A técnica ficou conhecida como logit lens. Ela tem um viés conhecido: uma camada intermediária não escreve exatamente na mesma base que a última. Belrose e colegas mediram esse desvio e propuseram treinar uma sonda afim por bloco, que em modelos de até 20 bilhões de parâmetros ficou mais previsível, mais confiável e menos enviesada que a projeção crua7.
A largura é um recurso escasso
Aqui está a parte que mais rende na prática, e ela sai de uma conta simples.
No Qwen3-8B o stream tem 4.096 números por posição. O modelo tem 36 camadas, cada uma com 32 cabeças de atenção e um MLP. São 1.152 cabeças e 36 MLPs, 1.188 componentes escrevendo no mesmo vetor de 4.096 dimensões. Cada cabeça trabalha num subespaço de no máximo 128 dimensões, e o resultado de todas elas tem que caber no mesmo lugar.
Não cabe, no sentido literal. Não existem 1.188 subespaços mutuamente ortogonais de 128 dimensões dentro de um espaço de 4.096. O que existe são direções quase ortogonais, muito mais numerosas que as dimensões, e componentes diferentes acabam compartilhando espaço com alguma interferência. Largura de stream, portanto, é largura de banda: é o quanto de informação distinta pode trafegar entre camadas ao mesmo tempo.
Isso explica por que aumentar a largura é caro de um jeito que aumentar a profundidade não é. A dimensão do stream aparece em todas as matrizes do modelo. Ainda no Qwen3-8B: as projeções de atenção somam 41,9 milhões de pesos por camada e o MLP soma 151 milhões, o que dá 1,51 bilhão e 5,44 bilhões no modelo inteiro — juntos, os 6,95 bilhões de parâmetros não-embedding que o card anuncia. Dobrar a largura do stream dobraria as duas dimensões da maioria dessas matrizes, e o custo sobe com o quadrado.
O stream em si não pesa nada: 4.096 números em 16 bits são 8 KB por posição. Não é memória, é geometria.
Onde isso falha
Somar não impede apagar. A imagem do mural sugere que nada se perde, e não é bem assim. Somar o oposto do que está lá cancela a informação, e um bloco aprende essa operação como aprenderia qualquer outra. “Nada é sobrescrito” descreve a aritmética; não descreve o efeito.
Algumas dimensões dominam tudo. Sun e colegas encontraram, em vários LLMs, um punhado de ativações com valores até cem mil vezes maiores que as vizinhas. Elas aparecem sempre nas mesmas posições, mudam pouco com a entrada, funcionam na prática como termos de viés e concentram a atenção nos tokens correspondentes8. A imagem de um espaço homogêneo onde toda dimensão vale o mesmo está errada.
E isso quebra a quantização. É o mesmo fenômeno visto do lado da engenharia. Dettmers e colegas mostraram que dimensões atípicas emergem sistematicamente em transformers grandes e dominam o desempenho; a saída deles foi isolar essas dimensões numa multiplicação de 16 bits enquanto mais de 99,9% dos valores rodam em 8 bits, o que permitiu servir modelos de até 175 bilhões de parâmetros sem perda de qualidade9. Quantizar o stream uniformemente não funciona, e o motivo é este.
A base não é privilegiada. Ler a dimensão 1.402 do stream e procurar um significado para ela é quase sempre perda de tempo. O que carrega informação são direções, que raramente coincidem com os eixos. É por isso que os métodos de interpretabilidade que funcionam procuram direções, e não neurônios.
Nem todo bloco escreve algo necessário. Se cada camada acrescenta uma parcela, seria de esperar que remover uma delas quebrasse o modelo. Gromov e colegas testaram e encontraram o contrário: em alguns modelos abertos dá para remover até metade das camadas mais profundas com degradação mínima em benchmarks de pergunta e resposta, com um ajuste leve depois para recuperar10. A leitura dos autores é que ou o pré-treino não aproveita bem os parâmetros das camadas profundas, ou as camadas rasas guardam a maior parte do que importa. Nenhuma das duas é confortável.
Um stream não vê os outros. Existe um vetor por posição, e cada um só carrega o que foi escrito naquela posição. A única coisa capaz de mover informação entre posições é a atenção. Tratar o stream como se ele contivesse a frase inteira leva a conclusões erradas sobre o que o modelo “sabe” em cada ponto.
O que fazer com isso
- Ao instrumentar um modelo, engate no stream. É o único ponto por onde tudo passa. Coletar saída de MLP ou de cabeça isolada dá um recorte parcial do que entrou na conta.
- Intervenha somando uma direção, não editando pesos. É a operação mais barata que existe num transformer, porque é exatamente o que os blocos já fazem. Arditi e colegas mostraram que a recusa em 13 modelos de chat abertos, de até 72 bilhões de parâmetros, é mediada por um subespaço de uma dimensão: retirar a direção do stream impede a recusa, somá-la induz recusa até em pedido inofensivo11.
- Não quantize o stream uniformemente. Deixe as dimensões atípicas em precisão maior. Qualquer biblioteca séria de quantização já faz isso, mas vale saber por quê antes de escrever a sua.
- Leia a dimensão do modelo como largura de banda. Ao comparar dois modelos com contagem de parâmetros parecida, o de stream mais largo e menos camadas e o de stream mais estreito e mais camadas são apostas diferentes sobre o mesmo orçamento.
- Ao podar profundidade, comece pelas camadas do meio para o fim. É onde a evidência de redundância é mais forte, e conte com um ajuste curto depois para fechar a lacuna.
- Ao ler logit lens de camada intermediária, calibre. A projeção crua serve para explorar; para concluir, use uma sonda treinada por camada.
Footnotes
-
Elhage et al. (2021) descrevem o transformer como um conjunto de componentes que se comunicam lendo e escrevendo em subespaços diferentes do residual stream, e propõem decompor o stream nesses canais em vez de analisar o vetor inteiro. ↩
-
He et al. (2015) reformularam as camadas para aprender funções residuais em relação à entrada da camada, treinaram redes de 152 camadas com complexidade menor que a VGG e chegaram a 3,57% de erro no conjunto de teste do ImageNet, vencendo o ILSVRC 2015. ↩
-
He et al. (2016) mostraram que, com mapeamentos de identidade nas conexões de atalho e ativação após a soma, o sinal para frente e para trás se propaga diretamente de qualquer bloco para qualquer outro; a rede de 1.001 camadas chegou a 4,62% de erro no CIFAR-10. ↩
-
Veit et al. (2016) decompuseram redes residuais em coleções de caminhos de comprimentos variados e mediram que, numa rede de 110 camadas, a maior parte do gradiente vem de caminhos de apenas 10 a 34 camadas. ↩
-
Dong et al. (2021) provaram que atenção pura converge para uma matriz de posto 1 em ritmo duplamente exponencial com a profundidade, e que as conexões residuais e os MLPs são o que impede essa degeneração. ↩
-
Geva et al. (2021) mostraram que as camadas feed-forward operam como memórias de chave e valor, e que a saída de cada uma é uma composição de memórias refinada pelas conexões residuais até virar a previsão final. ↩
-
Belrose et al. (2023) mediram o viés de projetar camadas intermediárias com a matriz de saída e propuseram uma sonda afim treinada por bloco, mais previsível e menos enviesada, em modelos de até 20 bilhões de parâmetros. ↩
-
Sun et al. (2024) encontraram, em vários LLMs, pouquíssimas ativações com valores até cem mil vezes maiores que as demais, em posições consistentes e quase independentes da entrada, funcionando como termos de viés e concentrando a atenção nos tokens correspondentes. ↩
-
Dettmers et al. (2022) isolaram as dimensões atípicas numa multiplicação de 16 bits enquanto mais de 99,9% dos valores rodam em 8 bits, o que permitiu inferência em modelos de até 175 bilhões de parâmetros sem degradação. ↩
-
Gromov et al. (2024) removeram blocos de camadas de modelos abertos e encontraram degradação mínima em perguntas e respostas até remover cerca de metade das camadas, com um ajuste leve por QLoRA depois para fechar a lacuna. ↩
-
Arditi et al. (2024) identificaram, em 13 modelos de chat abertos de até 72 bilhões de parâmetros, um subespaço de uma dimensão que media a recusa: removê-lo impede a recusa de pedidos nocivos e adicioná-lo induz recusa de pedidos inofensivos. ↩
Perguntas frequentes
- O que é o residual stream de um transformer?
- É o vetor que atravessa o modelo inteiro, um por posição do texto. Ele começa como a linha da matriz de embedding e termina no unembedding. Entre os dois, cada bloco lê o que está nele, calcula uma correção e soma essa correção de volta, sem substituir o conteúdo anterior.
- Qual a diferença entre conexão residual e residual stream?
- A conexão residual é a operação: somar a entrada de um bloco à saída dele. O residual stream é o que essa operação produz quando repetida dezenas de vezes, um vetor que acumula tudo. Uma é o mecanismo local, o outro é o objeto que aparece quando você olha o modelo inteiro.
- Como as camadas de um transformer se comunicam?
- Só pelo stream. Nenhum bloco recebe a saída de outro diretamente: cada componente lê de um subespaço do mesmo vetor e escreve em outro. É por isso que uma cabeça da camada 3 consegue passar informação para uma da camada 30 sem que nada entre as duas participe.
- O que acontece se tirar a conexão residual?
- O modelo para de treinar em profundidade. Um trabalho de 2021 mostrou que atenção pura converge para uma matriz de posto 1 em ritmo duplamente exponencial com a profundidade, e que são justamente as conexões residuais e os MLPs que impedem essa degeneração.
- Dá para ler o residual stream no meio do modelo?
- Dá, e é a base da interpretabilidade prática. Aplicar a matriz de saída a uma camada intermediária mostra para onde o modelo estava indo. A projeção crua é enviesada; uma sonda afim treinada por bloco corrige o desvio e produz leituras mais confiáveis.
- O residual stream guarda a frase inteira?
- Não. Existe um stream por posição, e cada um carrega só o que foi escrito naquela posição. Um prompt de mil tokens tem mil vetores correndo em paralelo. Informação de outras posições chega apenas pela atenção, que é o único componente do bloco capaz de mover conteúdo entre streams diferentes.
Referências
- He, K.; Zhang, X.; Ren, S.; Sun, J.. Deep Residual Learning for Image Recognition (2015)arXiv:1512.03385
- He, K.; Zhang, X.; Ren, S.; Sun, J.. Identity Mappings in Deep Residual Networks (2016)arXiv:1603.05027
- Veit, A.; Wilber, M.; Belongie, S.. Residual Networks Behave Like Ensembles of Relatively Shallow Networks (2016)arXiv:1605.06431
- Dong, Y.; Cordonnier, J.-B.; Loukas, A.. Attention is Not All You Need: Pure Attention Loses Rank Doubly Exponentially with Depth (2021)arXiv:2103.03404
- Elhage, N. et al.. A Mathematical Framework for Transformer Circuits (2021)
- Geva, M.; Schuster, R.; Berant, J.; Levy, O.. Transformer Feed-Forward Layers Are Key-Value Memories (2021)arXiv:2012.14913
- Belrose, N. et al.. Eliciting Latent Predictions from Transformers with the Tuned Lens (2023)arXiv:2303.08112
- Sun, M.; Chen, X.; Kolter, J. Z.; Liu, Z.. Massive Activations in Large Language Models (2024)arXiv:2402.17762
- Dettmers, T.; Lewis, M.; Belkada, Y.; Zettlemoyer, L.. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (2022)arXiv:2208.07339
- Gromov, A.; Tirumala, K.; Shapourian, H.; Glorioso, P.; Roberts, D. A.. The Unreasonable Ineffectiveness of the Deeper Layers (2024)arXiv:2403.17887
- Arditi, A. et al.. Refusal in Language Models Is Mediated by a Single Direction (2024)arXiv:2406.11717