Pular para o conteúdo
mnzes

O que é o residual stream de um transformer?

PorDiógenes MenezesAprendendo IA em público

14 min de leitura

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

residual streamum vetor por posiçãoembeddingunembeddingatençãofeed-forwardescrevelê e somalê e somaNenhum bloco fala com outro direto.Todos passam por aqui.
Figura 1Nenhum bloco recebe a saída de outro diretamente. Todos leem do mesmo vetor e somam de volta nele, o que faz do stream o único canal do modelo.

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

camada 40camada 1o sinal passapor 40 camadassem conexão residualCom fator 0,9 por camada, sobram1,5% depois de 40. O sinal some.camada 40camada 1o blococaminhodiretocom conexão residualO caminho de identidade nãomultiplica nada. O sinal chega.
Figura 2Sem o caminho de identidade, o sinal atravessa quarenta multiplicações em série. Com ele, existe uma rota onde nenhuma multiplicação acontece.

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

x0x0 + a1x0 + a1 + m1x0 + a1 + m1 + a2+ atenção 1+ MLP 1+ atenção 2a linha da matriz,sem nenhum contextomais o que veiode outras posiçõesmais o que o MLPpromoveu no vocabulárioe assim atéo último bloco
Figura 3O vetor da última posição é a soma do embedding com tudo que cada bloco acrescentou. Nenhuma parcela é apagada, e todas continuam legíveis no fim.

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. 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

  1. He, K.; Zhang, X.; Ren, S.; Sun, J.. Deep Residual Learning for Image Recognition (2015)arXiv:1512.03385
  2. He, K.; Zhang, X.; Ren, S.; Sun, J.. Identity Mappings in Deep Residual Networks (2016)arXiv:1603.05027
  3. Veit, A.; Wilber, M.; Belongie, S.. Residual Networks Behave Like Ensembles of Relatively Shallow Networks (2016)arXiv:1605.06431
  4. 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
  5. Elhage, N. et al.. A Mathematical Framework for Transformer Circuits (2021)
  6. Geva, M.; Schuster, R.; Berant, J.; Levy, O.. Transformer Feed-Forward Layers Are Key-Value Memories (2021)arXiv:2012.14913
  7. Belrose, N. et al.. Eliciting Latent Predictions from Transformers with the Tuned Lens (2023)arXiv:2303.08112
  8. Sun, M.; Chen, X.; Kolter, J. Z.; Liu, Z.. Massive Activations in Large Language Models (2024)arXiv:2402.17762
  9. Dettmers, T.; Lewis, M.; Belkada, Y.; Zettlemoyer, L.. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (2022)arXiv:2208.07339
  10. Gromov, A.; Tirumala, K.; Shapourian, H.; Glorioso, P.; Roberts, D. A.. The Unreasonable Ineffectiveness of the Deeper Layers (2024)arXiv:2403.17887
  11. Arditi, A. et al.. Refusal in Language Models Is Mediated by a Single Direction (2024)arXiv:2406.11717