O que é a arquitetura transformer?
Um transformer é uma pilha de blocos idênticos, e cada bloco faz duas coisas: uma subcamada de atenção deixa cada posição do texto olhar todas as outras, e uma rede feed-forward processa cada posição isolada. Em volta das duas há normalização e uma soma que devolve a entrada. Foi proposto em 2017 para tradução automática e virou a base de praticamente todo LLM.
O nome do paper resume a aposta: atenção basta. Até ali, a atenção era um acessório em cima de uma rede recorrente, e a contribuição de 2017 foi remover a recorrência inteira e ficar só com o acessório. O resultado principal era de tradução, e a arquitetura tinha um lado que lia e outro que escrevia — a distinção entre encoder e decoder que os LLMs depois abandonaram, ficando só com o segundo.
O que se descreve aqui é a estrutura. O que acontece nela quando você manda um prompt, do token à resposta, é o assunto de como um LLM funciona, e a leitura crítica do paper de 2017 fica em outro lugar ainda.
O bloco, aberto
O paper original descreve o bloco em uma frase: cada camada tem duas subcamadas, uma de atenção multi-cabeça e uma rede feed-forward posição a posição, com uma conexão residual em volta de cada uma seguida de normalização1. Vale abrir cada peça.
A atenção é a única parte que mistura posições. Cada posição calcula o quanto cada outra importa para ela e monta sua representação a partir dessa mistura. Multi-cabeça significa fazer isso várias vezes em paralelo com projeções diferentes: o modelo original usava 8 cabeças sobre uma dimensão de 512, com 64 dimensões por cabeça1.
O feed-forward é a única parte que não mistura nada. É uma rede pequena aplicada a cada posição separadamente, com os mesmos pesos para todas. Ela também é onde mora a maior parte dos parâmetros do bloco: com dimensão interna de 2.048 contra 512 do modelo, a aritmética do paper original dá cerca de dois terços dos pesos do bloco na feed-forward e um terço na atenção. Um trabalho de 2020 argumentou que essas camadas funcionam como memórias de chave e valor, em que cada chave se correlaciona com um padrão textual e o valor correspondente induz uma distribuição sobre o vocabulário de saída2.
A soma residual é o que permite empilhar. A saída de cada subcamada é somada à entrada dela, em vez de substituí-la. A técnica vem da visão computacional, de 2015, e foi o que resolveu o problema de redes muito profundas ficarem mais difíceis de treinar em vez de melhores3. Sem ela, uma pilha de 32 blocos não converge.
A normalização mantém os números em faixa. O detalhe que ninguém desenha é onde ela fica. O paper de 2017 normalizava depois da soma residual, e essa escolha obriga um aquecimento cuidadoso da taxa de aprendizado. Um trabalho de 2020 mostrou por quê: com a normalização fora do bloco residual, os gradientes perto da saída são grandes na inicialização, o que torna o treino instável com taxa alta. Movendo a normalização para dentro do bloco, os gradientes se comportam e o aquecimento pode ser removido4. Praticamente todo modelo atual faz assim.
Por que a atenção substituiu a recorrência
Uma rede recorrente lê a frase palavra por palavra e carrega um estado de uma posição para a seguinte. Isso cria duas dificuldades. A primeira é distância: a informação da primeira palavra chega à décima depois de nove passos, degradada em cada um. A segunda é que os passos não podem ser calculados fora de ordem, então nenhuma GPU ajuda a processar uma sequência mais rápido do que sequencialmente.
A atenção já existia antes do transformer, e existia justamente para resolver a primeira dificuldade. Um trabalho de 2014 acrescentou a uma rede recorrente de tradução um mecanismo que procurava, para cada palavra gerada, as partes relevantes da frase de origem, sem espremer tudo em um vetor de tamanho fixo5. Funcionou, e a recorrência continuou ali embaixo.
O movimento de 2017 foi tirar a recorrência e deixar só a busca. Sem estado que passa adiante, todas as posições podem ser calculadas na mesma passada, e a distância entre duas posições quaisquer deixa de importar: uma olha a outra diretamente.
Vale ser preciso sobre onde esse ganho aparece, porque o mal-entendido é comum. O paralelismo vale no treino e na leitura do prompt, quando o texto inteiro já existe. Na geração ele não vale: cada token novo depende do anterior, e o modelo roda uma vez por token. É por isso que a resposta aparece palavra a palavra na tela mesmo em uma arquitetura vendida como paralela.
A pilha, e o que muda ao longo dela
O modelo de 2017 empilhava 6 blocos de cada lado1. O Llama 3 usa 32 blocos na versão de 8 bilhões de parâmetros, 80 na de 70 bilhões e 126 na de 405 bilhões6. A estrutura de cada bloco é idêntica em todos eles; o que muda é quantos e quão largos.
Os blocos serem idênticos não significa que façam a mesma coisa. Um trabalho de 2019 sondou camada por camada de um modelo encoder e encontrou os passos do pipeline clássico de processamento de linguagem representados em ordem: primeiro classe gramatical, depois análise sintática, depois entidades nomeadas, depois papéis semânticos e por fim correferência. Os autores também observaram que o modelo revisa decisões de baixo nível quando informação de nível mais alto desambigua7.
Perto da saída, outro trabalho, de 2022, mostrou que dá para ler a atualização de cada camada feed-forward diretamente no espaço do vocabulário: cada uma empurra a distribuição na direção de conceitos frequentemente interpretáveis. Os autores usaram isso para duas coisas concretas: reduzir toxicidade do GPT-2 em quase metade e, com uma regra simples de saída antecipada, economizar 20% da computação em média8.
A honestidade aqui importa. Essas medições são de modelos específicos e de tamanhos modestos para os padrões de 2026. A ordem geral se repete entre modelos; os cortes exatos, não. Ninguém deveria olhar um modelo novo e afirmar que a camada 17 faz correferência.
O que mudou desde 2017
O esqueleto é o mesmo e quase todas as peças foram trocadas. Quatro substituições cobrem a maior parte da distância.
Posição. A atenção não sabe ordem: para ela a entrada é um conjunto, não uma sequência. O paper original resolvia somando senoides de frequências diferentes ao vetor de entrada1. Desde 2021 o padrão é girar os vetores de consulta e chave por um ângulo proporcional à posição, o que faz a posição relativa aparecer naturalmente dentro do produto interno da atenção9. Boa parte das técnicas de extensão de janela de contexto mexe justamente nesse ângulo.
Onde a normalização fica. Depois da soma residual em 2017, dentro do bloco residual desde 20204.
Qual normalização. A LayerNorm calcula duas estatísticas por posição, média e variância, e então centraliza e reescala. A variante que ficou comum descarta a centralização e mantém só o reescalonamento, o que corta as estatísticas pela metade e se mostrou equivalente na prática. Nada disso muda o que o modelo consegue fazer; muda a velocidade de um passo, o que nessa escala é o mesmo que mudar quanto modelo você consegue pagar.
A ativação do feed-forward. ReLU no original, variantes de unidade linear com porta nos modelos atuais. A porta é uma multiplicação a mais que deixa a camada suprimir a própria saída dimensão a dimensão, e custa uma terceira matriz na subcamada.
Há ainda uma mudança que nasceu de restrição de memória e não de qualidade: o compartilhamento de cabeças. No desenho original cada cabeça tinha suas próprias chaves e valores. No Llama 3 de 8 bilhões há 32 cabeças de consulta e apenas 8 de chave e valor6, então grupos de quatro cabeças leem as mesmas chaves e valores guardados. Isso não melhora o modelo e custa um pouco de qualidade. O que compra é um cache quatro vezes menor na geração, e a próxima seção mostra o tamanho do problema que isso resolve.
Profundidade fixa, esforço fixo
Há uma propriedade do bloco que passa despercebida e explica bastante do comportamento observável: um transformer gasta exatamente a mesma computação por token, independentemente da dificuldade. São 32 blocos para “sim” e 32 blocos para o passo decisivo de uma demonstração. Não existe laço interno, não existe “pensar mais um pouco” dentro de uma passada.
Isso tem duas consequências que se veem todo dia. A primeira é que a única forma de o modelo gastar mais computação em um problema difícil é gerar mais tokens: é literalmente o que chain-of-thought compra, tempo de cálculo comprado em unidades de token. A segunda é que boa parte da profundidade é desperdiçada nos casos fáceis, e isso é mensurável — o trabalho de 2022 sobre as camadas feed-forward economizou 20% da computação em média só interrompendo a pilha quando a predição já estava decidida8.
Vale a ressalva de que isso descreve a arquitetura, não os produtos. Um sistema que roteia perguntas fáceis para um modelo menor está resolvendo o mesmo problema por fora, com dois modelos de profundidade fixa em vez de um de profundidade variável.
Onde falha
O termo quadrático. A atenção compara cada posição com todas as outras, então o trabalho por camada cresce com o quadrado do comprimento. Dobrar o contexto quadruplica essa parte da conta. Para sequência curta ela nem domina o custo, que fica na feed-forward; a atenção assume conforme o número de tokens se aproxima da dimensão do modelo, que no Llama 3 de 8 bilhões é 4.0966.
O cache de chaves e valores. Na geração, o modelo guarda as chaves e valores de todos os tokens anteriores para não recalculá-los. Esse cache cresce linearmente com o contexto e costuma acabar antes do tempo de cálculo. Com os números do Llama 3 de 8 bilhões, são 32 blocos, 8 cabeças de chave e valor e 128 dimensões por cabeça: em 16 bits, cerca de 128 KB por token, ou 4 GB para 32 mil tokens. Sem o compartilhamento de cabeças seriam 16 GB, o que não sobra em uma placa de 24 GB junto com os pesos.
Ordem precisa ser injetada. Remova a codificação de posição e “o cão mordeu o homem” e “o homem mordeu o cão” produzem exatamente a mesma saída. Isso não é detalhe de implementação: é uma propriedade da operação de atenção, e todo esquema de posição é uma correção externa a ela. A consequência prática aparece na extensão de janela: um modelo treinado com 8 mil tokens nunca viu os ângulos de posição correspondentes a 100 mil, e servi-lo com um contexto muito maior que o do treino degrada de forma que não aparece em teste curto. É por isso que janela anunciada e janela útil são números diferentes.
Os pesos de atenção não são explicação. É tentador olhar o mapa de atenção e concluir de onde veio a resposta. Um trabalho de 2019 mostrou que os pesos de atenção correlacionam mal com medidas de importância baseadas em gradiente, e que existem distribuições de atenção bem diferentes que produzem a mesma predição10. Servem para inspecionar, não para justificar.
As tentativas de matar o termo quadrático ainda não venceram. Vale registrar porque é o eixo de pesquisa mais movimentado em volta do bloco. Uma linha ataca o custo sem mexer na matemática: um trabalho de 2022 reorganizou a atenção para respeitar a hierarquia de memória da GPU e obteve 3 vezes mais velocidade no GPT-2 com sequência de mil tokens, calculando exatamente a mesma coisa11. Isso melhorou a constante, não o expoente. A outra linha troca a operação: modelos de espaço de estados escalam linearmente com o comprimento e, em 2023, um deles igualou transformers do dobro do tamanho em modelagem de linguagem com 5 vezes mais vazão na inferência12. Em julho de 2026 as arquiteturas de fronteira continuam predominantemente de atenção plena, às vezes intercaladas com camadas mais baratas. O termo quadrático segue no lugar, mais rápido.
O que fazer com isso
- Trate o comprimento do contexto como custo, não como capacidade. Cada token a mais paga duas vezes: no termo quadrático da atenção e no cache linear da inferência.
- Ao dimensionar hardware, calcule o cache antes dos pesos. Um modelo de 8 bilhões cabe em 16 GB, mas 32 mil tokens de conversa acrescentam vários gigabytes que ninguém contou.
- Desconfie de comparação de modelos por número de camadas. Profundidade e largura se compensam, e a contagem sozinha não diz nada sobre capacidade.
- Não use o mapa de atenção como justificativa em relatório. Para inspecionar o próprio código, serve; para explicar uma decisão a alguém, não.
- Ao ler um paper de arquitetura nova, procure qual das quatro peças ele troca. Quase todo trabalho recente mexe em posição, normalização, ativação ou compartilhamento de cabeça, dentro do mesmo bloco de 2017.
Footnotes
-
Vaswani et al. (2017) descrevem cada camada como duas subcamadas — atenção multi-cabeça e feed-forward posição a posição — com conexão residual e normalização em volta de cada uma. O modelo base usava 6 camadas de cada lado, dimensão 512, 8 cabeças de 64 dimensões e feed-forward de dimensão interna 2.048. ↩ ↩2 ↩3 ↩4
-
Geva et al. (2020) analisaram as camadas feed-forward como memórias de chave e valor: cada chave se correlaciona com padrões textuais e o valor correspondente induz uma distribuição sobre o vocabulário de saída. ↩
-
He et al. (2015) introduziram o aprendizado residual para tornar redes muito profundas treináveis, reformulando as camadas como aprendizado de um resíduo em relação à entrada. ↩
-
Xiong et al. (2020) mostraram, por teoria de campo médio, que com a normalização depois do bloco residual os gradientes perto da saída são grandes na inicialização, o que exige aquecimento da taxa de aprendizado. Com a normalização dentro do bloco, o aquecimento pode ser removido. ↩ ↩2
-
Bahdanau et al. (2014) acrescentaram a um tradutor recorrente um mecanismo que busca as partes relevantes da frase de origem para cada palavra gerada, removendo a necessidade de comprimir a frase inteira em um vetor fixo. ↩
-
O relatório do Llama 3 (2024) registra 32, 80 e 126 camadas para as versões de 8, 70 e 405 bilhões de parâmetros, com dimensão de modelo 4.096 na menor delas e 8 cabeças de chave e valor contra 32 de consulta. ↩ ↩2 ↩3
-
Tenney et al. (2019) encontraram os passos do pipeline clássico de processamento de linguagem representados em ordem ao longo das camadas do BERT, com o modelo revisando decisões de baixo nível a partir de informação de nível mais alto. ↩
-
Geva et al. (2022) leram a atualização de cada camada feed-forward no espaço do vocabulário e usaram isso para reduzir a toxicidade do GPT-2 em quase metade e economizar 20% da computação com uma regra de saída antecipada. ↩ ↩2
-
Su et al. (2021) propuseram codificar posição girando os vetores de consulta e chave por um ângulo proporcional à posição absoluta, o que faz a dependência relativa aparecer dentro do produto interno da atenção. ↩
-
Jain e Wallace (2019) encontraram correlação fraca entre pesos de atenção e medidas de importância baseadas em gradiente, e construíram distribuições de atenção bem diferentes que levam à mesma predição. ↩
-
Dao et al. (2022) tornaram a atenção consciente de leitura e escrita entre níveis de memória da GPU, mantendo o cálculo exato: 3 vezes mais rápido no GPT-2 com sequência de mil tokens e 15% ponta a ponta no BERT-large. ↩
-
Gu e Dao (2023) integraram espaços de estados seletivos em uma arquitetura sem atenção, com escala linear no comprimento e 5 vezes mais vazão na inferência. O modelo de 3 bilhões deles igualou transformers do dobro do tamanho em modelagem de linguagem. ↩
Perguntas frequentes
- O que é um transformer, em uma frase?
- Uma pilha de blocos idênticos em que cada bloco tem duas subcamadas: atenção, que deixa cada posição do texto olhar todas as outras, e uma rede feed-forward, que processa cada posição isolada. Em volta das duas há normalização e uma soma que devolve a entrada do bloco.
- Qual a diferença entre transformer e RNN?
- A RNN processa um token por vez e cada passo depende do anterior, o que impede paralelizar o treino ao longo da sequência. O transformer processa todas as posições na mesma passada, e qualquer posição alcança qualquer outra em um passo. O preço é que as comparações crescem com o quadrado do comprimento.
- O que tem dentro de um bloco de transformer?
- Duas subcamadas. A de atenção calcula quanto cada posição importa para cada outra e mistura as representações. A feed-forward aplica a mesma rede pequena a cada posição separadamente e concentra a maior parte dos parâmetros do bloco. Cada subcamada é normalizada e tem a entrada somada de volta na saída.
- Por que o transformer precisa de codificação de posição?
- Porque a atenção não tem noção de ordem: para ela, a entrada é um conjunto de vetores, não uma sequência. Sem injetar posição, 'o cão mordeu o homem' e 'o homem mordeu o cão' produzem exatamente a mesma saída. O paper de 2017 somava senoides; os modelos atuais costumam usar rotação.
- Os LLMs de hoje ainda usam a arquitetura de 2017?
- O esqueleto sim, as peças não. Trocaram a codificação de posição, o lugar e a fórmula da normalização, a ativação do feed-forward e o compartilhamento de cabeças de atenção. Um bloco atual e um de 2017 são reconhecíveis um no outro, e nenhum trecho de código é intercambiável.
- Por que contexto longo é caro no transformer?
- Por dois motivos somados. A atenção compara cada posição com todas as outras, então dobrar o contexto quadruplica esse trabalho por camada. E o cache de chaves e valores cresce linearmente com o número de tokens, ocupando memória que costuma acabar antes do tempo de cálculo.
Referências
- Vaswani, A. et al.. Attention Is All You Need (2017)arXiv:1706.03762
- Bahdanau, D., Cho, K., Bengio, Y.. Neural Machine Translation by Jointly Learning to Align and Translate (2014)arXiv:1409.0473
- He, K. et al.. Deep Residual Learning for Image Recognition (2015)arXiv:1512.03385
- Xiong, R. et al.. On Layer Normalization in the Transformer Architecture (2020)arXiv:2002.04745
- Geva, M. et al.. Transformer Feed-Forward Layers Are Key-Value Memories (2020)arXiv:2012.14913
- Tenney, I., Das, D., Pavlick, E.. BERT Rediscovers the Classical NLP Pipeline (2019)arXiv:1905.05950
- Geva, M. et al.. Transformer Feed-Forward Layers Build Predictions by Promoting Concepts in the Vocabulary Space (2022)arXiv:2203.14680
- Su, J. et al.. RoFormer: Enhanced Transformer with Rotary Position Embedding (2021)arXiv:2104.09864
- Grattafiori, A. et al.. The Llama 3 Herd of Models (2024)arXiv:2407.21783
- Jain, S., Wallace, B.. Attention is not Explanation (2019)arXiv:1902.10186
- Dao, T. et al.. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness (2022)arXiv:2205.14135
- Gu, A., Dao, T.. Mamba: Linear-Time Sequence Modeling with Selective State Spaces (2023)arXiv:2312.00752