23. Autoregressive Generation
Geração Autorregressiva de Imagens
Modelos de difusão dominam a geração de imagens desde 2020 — mas existe uma abordagem radicalmente diferente que ganhou força: tratar imagens como sequências de tokens discretos e gerá-las da mesma forma que modelos de linguagem geram texto.
Essa é a abordagem por trás da geração de imagens nativa do Gemini, do GPT-4o e de modelos como Chameleon (Meta) e LlamaGen.
O Problema: Como Tokenizar uma Imagem?
Texto é naturalmente discreto (palavras, subpalavras). Imagens são contínuas — pixels em \([0,255]^3\). Para usar geração autorregressiva, precisamos de um vocabulário visual.
A solução: VQ-GAN (Vector Quantization GAN)1 aprende um codebook de \(K\) vetores. O encoder mapeia qualquer patch de imagem para o vetor mais próximo do codebook — convertendo a imagem em uma grade de índices inteiros.
Geração Autorregressiva de Tokens
Com um codebook treinado, podemos representar qualquer imagem como uma sequência de \(N\) índices inteiros. Geramos então essa sequência exatamente como um LLM gera texto:
Cada token é gerado um de cada vez, condicionado em todos os anteriores e no prompt de texto.
MaskGIT: Geração Paralela por Mascaramento
A geração puramente autorregressiva é lenta: 1024 tokens = 1024 passes de modelo. O MaskGIT2 acelera isso com geração paralela iterativa:
- Começa com todos os tokens mascarados
[MASK] - A cada iteração, prediz todos os tokens simultaneamente (bidirecional!)
- "Revela" apenas os tokens com maior confiança
- Repete com menos tokens mascarados
Em apenas 8–12 iterações, gera 1024 tokens — contra 1024 iterações do AR puro.
Any-to-Any: Gemini, GPT-4o e Chameleon
O passo final é remover a distinção entre tokens de texto e tokens de imagem. Modelos any-to-any tratam tudo como uma sequência de tokens:
O modelo Transformer padrão processa essa sequência misturada naturalmente.
Como Cada Modelo Implementa Isso
| Modelo | Tokenizador visual | Geração | Treinamento |
|---|---|---|---|
| Chameleon (Meta) | VQ-VAE (8192 códigos) | Autorregressivo puro | Texto + imagem juntos desde o início |
| Gemini 2.0 (Google) | Tokenizador proprietário | AR + decoder de difusão | Multimodal nativo |
| GPT-4o (OpenAI) | Tokens visuais discretos | AR + decoder de difusão | Multimodal nativo |
| LlamaGen | VQGAN (16384 códigos) | AR com LLaMA | Inicializa de LLaMA pré-treinado |
AR vs. Difusão: Quando Usar Cada Um?
- Unifica texto e imagem na mesma arquitetura
- Melhor para multimodal any-to-any
- Aproveita toda a infraestrutura de LLMs
- Escala bem com mais dados
- Lento: 1 token por vez
- Melhor qualidade de imagem isolada
- Geração global coerente
- Mais controle (guidance, cfg scale)
- Mais rápido por imagem que AR
- Não unifica com texto nativamente
A tendência atual: híbridos — um backbone LLM autorregressivo para entendimento e raciocínio, com um decoder de difusão para renderizar a imagem final com alta qualidade. É exatamente o que o GPT-4o faz.
Implementação: VQ-GAN + Transformer AR
import torch
import torch.nn as nn
# 1. Quantizador vetorial
class VectorQuantizer(nn.Module):
def __init__(self, n_codes, d_code):
super().__init__()
self.codebook = nn.Embedding(n_codes, d_code)
def forward(self, z):
# z: (B, H, W, d_code) — latentes do encoder
flat = z.view(-1, z.shape[-1])
# Distâncias ao codebook
dists = torch.cdist(flat, self.codebook.weight)
indices = dists.argmin(dim=-1) # índice do código mais próximo
quantized = self.codebook(indices).view_as(z)
# Straight-through estimator para backprop
quantized_st = z + (quantized - z).detach()
return quantized_st, indices.view(z.shape[:3])
# 2. Geração autorregressiva com modelo estilo GPT
class ImageGPT(nn.Module):
def __init__(self, n_codes, seq_len, d_model, n_heads, n_layers):
super().__init__()
self.tok_emb = nn.Embedding(n_codes + 1, d_model) # +1 para token BOS
self.pos_emb = nn.Embedding(seq_len + 1, d_model)
encoder_layer = nn.TransformerEncoderLayer(d_model, n_heads, d_model*4, batch_first=True)
self.transformer = nn.TransformerEncoder(encoder_layer, n_layers)
self.head = nn.Linear(d_model, n_codes)
def forward(self, tokens):
B, T = tokens.shape
pos = torch.arange(T, device=tokens.device).unsqueeze(0)
x = self.tok_emb(tokens) + self.pos_emb(pos)
# Máscara causal
mask = torch.triu(torch.ones(T, T, device=tokens.device), diagonal=1).bool()
x = self.transformer(x, mask=mask)
return self.head(x) # logits sobre n_codes
@torch.no_grad()
def generate(self, prompt_tokens, n_new, temperature=1.0, top_k=2048):
tokens = prompt_tokens.clone()
for _ in range(n_new):
logits = self(tokens)[:, -1, :] / temperature
if top_k: logits[logits < logits.topk(top_k)[0][:,-1:]] = -float('inf')
probs = logits.softmax(-1)
next_tok = torch.multinomial(probs, 1)
tokens = torch.cat([tokens, next_tok], dim=1)
return tokens
O quadro em 2026
A geração autorregressiva de imagens parecia beco sem saída em 2022 — o VQ-GAN era bom e a difusão era melhor e mais rápida. Ela voltou por uma razão que nada tem a ver com qualidade de imagem: é a única formulação em que uma figura e uma frase são o mesmo tipo de objeto.
Três linhas de trabalho importam agora e elas discordam entre si de um jeito instrutivo.
-
VAR — prever a próxima escala
Ordem raster é uma escolha arbitrária e ruim: o pixel 500 não vem "depois" do 499 em nenhum sentido significativo. O VAR6 a substitui por grosso-para-fino — prever um mapa de tokens \(1{\times}1\), depois \(2{\times}2\), depois \(4{\times}4\), até a resolução plena.
Essa é uma ordem causal que os dados de fato têm, precisa de \(O(\log N)\) passos em vez de \(O(N)\) e foi o primeiro modelo autorregressivo a bater um modelo de difusão comparável no ImageNet.
-
MAR — jogar fora o quantizador
O codebook é onde modelos autorregressivos de imagem perdem fidelidade: tudo que fica entre as entradas é irrepresentável. O MAR5 o remove e prevê tokens contínuos, usando uma pequena cabeça de difusão por token para modelar \(p(x_i \mid x_{<i})\).
Autorregressivo na estrutura, difusão na distribuição por token. É uma boa demonstração de que "autorregressivo versus difusão" nunca foi o eixo certo.
-
Any-to-any — uma sequência, toda modalidade
O Chameleon4 e seus sucessores intercalam tokens de texto e de imagem numa única sequência, com um Transformer e uma perda de próximo token. Sem adaptadores, sem cabeça de imagem separada, sem atenção cruzada.
É para isto que a abordagem inteira serve: raciocínio e geração intercalados na mesma passagem — descrever uma imagem, editá-la e explicar a edição, sem sair do modelo.
O eixo não é o que as pessoas pensam
"Autorregressivo versus difusão" soa como escolha de família de modelo. Na verdade são duas escolhas independentes: em que ordem você gera (raster, grosso-para-fino, mascarado aleatório, tudo de uma vez) e que distribuição você põe sobre cada elemento (categórica sobre um codebook, ou contínua via cabeça de difusão). O MAR é autorregressivo com cabeça de difusão; o MaskGIT é paralelo com cabeça categórica; um modelo de difusão é tudo-de-uma-vez e contínuo. Assim que você enxerga os dois eixos, a taxonomia deixa de ser tribal.
A mesma ideia está rodando na direção oposta: modelos de linguagem por difusão geram texto por remoção iterativa de ruído sobre a sequência inteira em vez de da esquerda para a direita, trocando o cache de KV por decodificação paralela.
Onde cada um é usado
| Tarefa | O que usar | Por quê |
|---|---|---|
| Texto-para-imagem, qualidade em primeiro lugar | Difusão / fluxo (capítulo 21) | Melhor fidelidade por unidade de compute e latentes contínuos não perdem nada para um codebook |
| Texto e imagens intercalados num só modelo | Autorregressivo | Uma sequência, uma perda, um modelo — nada mais faz isso de forma limpa |
| Edição de imagem guiada por conversa | Autorregressivo ou híbrido | A edição e o raciocínio sobre ela vivem no mesmo contexto |
| Amostragem rápida sobre tokens discretos | Decodificação paralela estilo MaskGIT | \(O(\log N)\) rodadas em vez de \(O(N)\) |
| Verossimilhanças exatas, compressão | Autorregressivo | É a única família aqui com verossimilhança exata tratável |
Pontos principais
- Geração autorregressiva de imagens precisa de um tokenizador: um VQ-VAE/VQ-GAN transforma uma imagem numa grade de inteiros e o codebook é ao mesmo tempo o truque habilitador e o teto de fidelidade.
- O custo é uma passagem direta por token, então ela roda sobre ~1024 tokens latentes, nunca sobre pixels. É a mesma contabilidade do capítulo 16.
- Ordem raster é arbitrária. O MaskGIT gera em rodadas paralelas; o VAR gera grosso-para-fino e precisa de \(O(\log N)\) passos.
- O MAR mostra que o quantizador é opcional: tokens contínuos com uma pequena cabeça de difusão por token.
- Os eixos reais são ordem de geração e distribuição por elemento, não "autorregressivo versus difusão".
- A razão pela qual a abordagem voltou é unificação: texto e imagens como uma sequência, uma perda, um modelo — que é do que sistemas any-to-any precisam.
-
Esser, P. et al. (2021). Taming Transformers for High-Resolution Image Synthesis (VQ-GAN). ↩
-
Chang, H. et al. (2022). MaskGIT: Masked Generative Image Transformer. ↩
-
Sun, P., et al. (2024). Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation. LlamaGen — uma arquitetura Llama comum sobre tokens VQ, sem nenhum viés indutivo específico de visão. ↩
-
Team, C. et al. (2024). Chameleon: Mixed-Modal Early-Fusion Foundation Models. ↩
-
Li, J. et al. (2024). MAR: Autoregressive Image Generation without Vector Quantization. ↩
-
Tian, K., Jiang, Y., Yuan, Z., Peng, B., & Wang, L. (2024). Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction — NeurIPS (melhor artigo). Grosso-para-fino em vez de ordem raster. ↩