Phase 12 - Lesson 11
Chameleon e Modelos Multimodais Apenas de Tokens com Fusão Precoce
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
Cada VLM que vimos até agora mantém imagens e texto separados. Os tokens visuais vêm de um codificador de visão, passam por um projetor e encontram o texto dentro do LLM. Os vocabulários de visão e texto nunca se sobrepõem. O Chameleon (Meta, maio de 2024) questionou: e se eles se sobrepusessem? Treine um VQ-VAE que transforma uma imagem em uma sequência de tokens discretos de um vocabulário compartilhado. Cada documento multimodal agora é uma única sequência — tokens de texto e tokens de imagem intercalados, com uma única perda autorregressiva. Efeito colateral: o modelo pode gerar saídas de modalidade mista — alternando tokens de texto e imagem em uma única chamada de inferência. Esta lição aborda a tese da fusão precoce e reconstrói uma versão simplificada de ponta a ponta.
Tipo: Construção Idiomas: Python (stdlib, tokenizador VQ-VAE + decodificador intercalado) Pré-requisitos: Fase 12 · 05, Fase 8 (IA Generativa) Tempo: ~180 minutos
Objetivos de Aprendizado
- Explicar por que um vocabulário compartilhado + perda única altera o que o modelo pode fazer.
- Descrever como um VQ-VAE tokeniza uma imagem em uma sequência discreta compatível com o objetivo de próximo token de um transformer.
- Nomear os truques de estabilidade de treinamento do Chameleon: QK-Norm, posicionamento de dropout e ordenação de LayerNorm.
- Comparar o Chameleon com a abordagem Q-Former do BLIP-2 e descrever quando cada um é a escolha certa.
O Problema
VLMs baseados em adaptadores (LLaVA, BLIP-2, Qwen-VL) tratam texto e imagem como duas coisas diferentes. Um token de texto passa por embed(text_token); uma imagem passa por visual_encoder(image) → projector → ... pseudo_tokens. O modelo possui dois caminhos de entrada que se fundem no meio do caminho.
Três consequências:
- O LLM só pode consumir imagens, não emiti-las. A saída é apenas texto.
- Documentos de modalidade mista (parágrafos e imagens se alternando, como em um artigo) são complicados — você precisa analisar a entrada multimodal fora do modelo ou encadear gerações.
- Incompatibilidade distribucional. Tokens visuais e tokens de texto vivem em diferentes regiões do espaço oculto, criando problemas sutis de alinhamento.
O Chameleon rejeita essa premissa: imagens são apenas sequências de tokens discretos de um vocabulário compartilhado. Treine o modelo em documentos intercalados, com uma única perda, um único decodificador autorregressivo, e você desbloqueará a geração de modalidade mista gratuitamente.
O Conceito
VQ-VAE como tokenizador de imagem
O tokenizador é um autocodificador variacional quantizado por vetores (vector-quantized variational autoencoder). A arquitetura:
- Codificador (Encoder): CNN + ViT que mapeia a imagem para um mapa de características espaciais, por exemplo, 32x32 características de dimensão 256.
- Livro de Códigos (Codebook): um vocabulário aprendido de K vetores (o Chameleon usa 8192), também de dimensão 256.
- Quantização: para cada característica espacial, busca-se a entrada mais próxima no livro de códigos por distância L2. Substitui-se a característica contínua pelo índice inteiro correspondente.
- Decodificador (Decoder): CNN que transforma as características quantizadas de volta em pixels.
Treinamento: perda de reconstrução do VAE + perda de comprometimento (commitment loss) + perda do livro de códigos. Os índices do livro de códigos formam um alfabeto discreto para imagens.
Para o Chameleon: uma imagem se torna 32*32 = 1024 tokens extraídos de um vocabulário de 8192. Concatenados com tokens de texto (do vocabulário BPE do LLM, digamos 32000), o vocabulário final é 40192. O transformer vê uma única sequência e uma única perda.
O vocabulário compartilhado
O vocabulário do Chameleon combina tokens de texto, tokens de imagem e separadores de modalidade. Cada token possui um ID único. A camada de embedding de entrada mapeia cada ID para um vetor oculto de dimensão D. A projeção de saída mapeia o estado oculto de volta para os logits do vocabulário. O Softmax escolhe o próximo token, independentemente da modalidade.
Os separadores são importantes: as tags <image> e </image> delimitam a sequência de tokens de imagem. No momento da geração, se o modelo emitir <image>, o software downstream saberá que os próximos 1024 tokens são índices VQ que devem ser enviados ao decodificador para renderização de pixels.
Geração de modalidade mista
A inferência consiste na previsão do próximo token no vocabulário compartilhado. Exemplo de prompt: "Draw a cat and describe it." O Chameleon emite:
<image> 4821 1029 2891 ... (1024 image tokens) </image>
The cat is orange, sitting on a windowsill...
O modelo escolhe a ordem de forma autônoma — ele pode produzir imagem e depois texto, texto e depois imagem, ou intercalar ambos. Mesmo decodificador, mesma perda.
Compare isso com os VLMs baseados em adaptadores, nos quais a geração é apenas de texto. O Chameleon reabre a questão das modalidades de saída do modelo.
Estabilidade no treinamento — QK-Norm, dropout e ordenação de LayerNorm
O treinamento de fusão precoce é instável em grande escala. O artigo do Chameleon documenta três truques:
- QK-Norm. Aplica LayerNorm às projeções de query e key dentro do mecanismo de atenção, antes do produto escalar. Isso evita a explosão da magnitude dos logits em camadas profundas. Usado por múltiplos modelos grandes pós-2024.
- Posicionamento de dropout. Dropout após cada adição residual, e não apenas após a atenção e o MLP. É necessária mais regularização quando os gradientes dos tokens de imagem podem dominar.
- Ordenação de LayerNorm. Pre-LN no ramo residual (padrão), além de um LN extra na conexão de skip do último bloco. Isso estabiliza o fluxo de gradiente da camada final.
Sem esses truques, o treinamento do Chameleon com 34 bilhões de parâmetros divergiu em múltiplos checkpoints. Com eles, o treinamento converge. A receita de treinamento é uma contribuição tão importante quanto a própria arquitetura.
O limite de reconstrução do tokenizador
O VQ-VAE perde informações (lossy). Com 8192 entradas no livro de códigos e 1024 tokens por imagem de 512x512, o PSNR de reconstrução é limitado a cerca de 26-28 dB. Isso é suficiente para uma geração de imagem reconhecível, mas visivelmente pior do que a difusão em espaço contínuo (o Stable Diffusion 3 alcança mais de 32 dB).
O tokenizador é o gargalo. Tokenizadores melhores (MAGVIT-v2, IBQ, SBER-MoVQGAN) elevam esse limite. O Emu3 (Lição 12.12) alcança uma geração com qualidade do SDXL utilizando apenas um tokenizador melhor.
Chameleon vs BLIP-2 / LLaVA
Chameleon (fusão precoce, vocabulário compartilhado):
- Uma perda, um decodificador.
- Gera saídas de modalidade mista.
- O tokenizador determina o teto de qualidade.
- Caro: decodificador VQ-VAE por imagem gerada no caminho de inferência.
BLIP-2 / LLaVA (fusão tardia, torres separadas):
- Entrada de visão, saída apenas de texto.
- Reutiliza LLM pré-treinado.
- Sem gargalo de tokenizador para compreensão.
- Barato: passagem direta única (single forward pass).
Escolha por tarefa. Se precisar de geração de imagens, utilize a família Chameleon. Se precisar apenas de compreensão, um adaptador-VLM é mais simples e reutiliza mais computação pré-treinada.
Fuyu e AnyGPT
O Fuyu (Adept, 2023) é uma abordagem relacionada: descarta completamente o codificador de visão separado e passa patches de imagem brutos pela projeção de entrada do LLM como se fossem tokens, sem tokenizador. É mais simples que o Chameleon, mas perde a geração de saída com vocabulário compartilhado.
O AnyGPT (Zhan et al., 2024) estende o Chameleon para quatro modalidades: texto, imagem, fala e música. Usa o mesmo truque do VQ-VAE para cada uma delas, com um transformer compartilhado. Geração de qualquer modalidade para qualquer modalidade (any-to-any). Mais detalhado na Lição 12.16.
Use
code/main.py constrói um modelo simplificado de fusão precoce de ponta a ponta:
- Um quantizador minúsculo no estilo VQ-VAE que mapeia patches de 8x8 para índices do livro de códigos (K=16).
- Um vocabulário compartilhado de (IDs de texto 0..31) + (IDs de imagem 32..47) + (separadores 48, 49).
- Um decodificador autorregressivo simplificado (tabela de bigramas) treinado em legendas sintéticas + sequências de tokens de imagem.
- Loop de amostragem que emite tokens alternados de texto + imagem a partir de um prompt.
O código mantém o transformer intencionalmente minúsculo (bigramas) para que você possa rastrear o fluxo do sinal de ponta a ponta.
Envie
Esta lição produz outputs/skill-tokenizer-vs-adapter-picker.md. Dada uma especificação de produto (apenas compreensão vs compreensão + geração, qualidade de imagem exigida, orçamento de custo), ela seleciona entre a família Chameleon (fusão precoce) e a família LLaVA (fusão tardia) e justifica a escolha com regras práticas quantitativas.
Exercícios
O Chameleon usa K=8192 entradas de livro de códigos e 1024 tokens por imagem de 512x512. Estime a taxa de compressão em relação a uma imagem RGB de 24 bits. Há perdas? Quão grande é a perda?
Uma imagem 4K (3840x2160) na mesma densidade de VQ-VAE produz quantos tokens de imagem? Um modelo no estilo Chameleon pode gerar uma imagem 4K em uma única chamada de inferência? O que falha primeiro — contexto, qualidade do tokenizador ou cache KV?
Implemente o QK-Norm em Python puro. Dados uma query e key de dimensão 64, mostre o produto escalar antes e depois do LayerNorm. Por que o controle de magnitude é importante em camadas profundas?
Leia a Seção 2.3 do artigo do Chameleon sobre estabilidade no treinamento. Descreva o modo de falha exato que o artigo observou no modelo de 34B sem QK-Norm. Qual era a assinatura da "explosão de norma"?
Estenda o decodificador simplificado para emitir uma resposta de modalidade mista a partir de um prompt apenas de texto. Meça com que frequência o modelo escolhe imagem primeiro versus texto primeiro, considerando uma distribuição dos dados de treinamento de 60% texto primeiro / 40% imagem primeiro.
Termos-Chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Fusão precoce | "Tokens unificados" | Imagens convertidas em tokens discretos que compartilham o vocabulário do transformer desde a primeira etapa |
| VQ-VAE | "Tokenizador de imagem" | CNN + ViT + livro de códigos que mapeia imagens para índices inteiros que o transformer pode prever |
| Vocabulário compartilhado | "Um dicionário" | Um espaço único de IDs de tokens cobrindo texto + imagem + separadores de modalidade |
| QK-Norm | "Estabilizador de atenção" | LayerNorm aplicado a queries e keys antes de seu produto escalar, evitando a explosão da norma |
| Geração de modalidade mista | "Saída de texto + imagem" | Inferência que produz de forma autônoma tokens intercalados de texto e imagem em uma única passagem |
| Tamanho do livro de códigos | "Entradas K" | Número de vetores discretos aos quais o VQ-VAE pode quantizar; equilibra compressão e fidelidade |
| Limite do tokenizador | "Limite de reconstrução" | Melhor PSNR alcançável ao decodificar tokens VQ; limita a qualidade de imagem do modelo |