Phase 12 - Lesson 05
LLaVA e Ajuste de Instruções Visuais
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
O LLaVA (abril de 2023) é a arquitetura multimodal mais copiada do planeta. Ele substituiu o Q-Former do BLIP-2 por um MLP de 2 camadas, substituiu a atenção cruzada controlada (gated cross-attention) do Flamingo por uma concatenação simples de tokens, e foi treinado em 158 mil turnos de instruções visuais gerados pelo GPT-4 a partir de legendas contendo apenas texto. Qualquer profissional que construiu um VLM entre 2023 e 2026 construiu alguma variante do LLaVA. O LLaVA-1.5 adicionou AnyRes. O LLaVA-NeXT aumentou a resolução. O LLaVA-OneVision unificou imagem, multi-imagem e vídeo em uma única receita. Esta lição lê a receita, implementa o projetor e explica por que o "mais simples venceu".
Tipo: Build Idiomas: Python (stdlib, projector + instruction-template builder) Pré-requisitos: Phase 12 · 02 (CLIP), Phase 11 (LLM Engineering — instruction tuning) Tempo: ~180 minutos
Objetivos de Aprendizagem
- Construir um projetor MLP de 2 camadas que mapeia embeddings de patch do ViT (dim 1024) para a dimensão de embedding de um LLM (dim 4096).
- Passar pela receita de duas etapas do LLaVA: (1) alinhamento do projetor em 558 mil pares de legendas, (2) ajuste de instruções visuais em 158 mil turnos gerados pelo GPT-4.
- Construir um prompt no formato do LLaVA com o marcador de token de imagem, prompt do sistema e turnos do usuário/assistente.
- Explicar por que a comunidade mudou do Q-Former para o MLP, apesar da vantagem do Q-Former no orçamento de tokens.
O Problema
O Q-Former do BLIP-2 (Lição 12.03) comprime uma imagem em 32 tokens. Limpo, eficiente, bom para benchmarks. Mas ele tem dois problemas.
Primeiro, o Q-Former é treinável, mas sua perda (loss) não é a tarefa final. A Etapa 1 treina ITC+ITM+ITG. A Etapa 2 treina a perda de LM (modelagem de linguagem). As consultas (queries) aprendem alguma representação intermediária que o LLM então precisa decodificar. Informação é perdida no gargalo.
Segundo, o Q-Former consome 188M de parâmetros e, na escala do LLaVA em 2023, você tinha que projetá-lo em conjunto com o seu LLM alvo. Mude o LLM, treine novamente o Q-Former. Mude o codificador visual, treine novamente. Cada combinação era um projeto de R&D separado.
A resposta do LLaVA foi embaraçosamente simples: pegar os 576 tokens de patch do ViT, passar cada um por um MLP de 2 camadas (1024 → 4096 → 4096) e jogar todos os 576 na sequência de entrada do LLM. Sem gargalo. Sem pré-treinamento de etapa 1 em objetivos estranhos. Apenas treinar o MLP em uma perda direta de LM.
De onde vêm os dados? O segundo insight do LLaVA: usar o GPT-4 (apenas texto) para gerar dados de instrução. Fornecer ao GPT-4 a legenda do COCO e os dados de caixa delimitadora (bounding-box) para uma imagem, e pedir para ele produzir conversas, descrições e perguntas de raciocínio complexo. Foram 158 mil turnos de instrução-resposta de graça. Sem anotação humana.
O resultado: um VLM que rodou em 8 A100s por um dia, superou o Flamingo no MMMU e disponibilizou um checkpoint aberto que a comunidade pôde estender. No final de 2023, ele já havia gerado mais de 50 forks.
O Conceito
A arquitetura
LLaVA-1.5 de 13B:
- Codificador de visão: CLIP ViT-L/14 @ 336 (congelado durante a etapa 1, opcionalmente descongelado na etapa 2).
- Projetor: MLP de 2 camadas com ativação GELU,
1024 → 4096 → 4096. - LLM: Vicuna-13B (posteriormente Llama-3.1-8B).
Passagem direta (forward pass) em uma imagem + prompt de texto:
img -> ViT -> 576 patches of dim 1024
patches -> MLP -> 576 tokens of dim 4096
prompt: system + "<image>" placeholder + user question
replace <image> token with the 576 projected tokens
feed the full sequence to the LLM
decode response
A imagem ocupa 576 tokens do contexto do LLM. Em um contexto de 2048, isso deixa 1472 tokens para o texto. Em um contexto de 32k, é apenas um erro de arredondamento.
Etapa 1: alinhamento do projetor
Congelar o ViT. Congelar o LLM. Treinar apenas o MLP de 2 camadas. Dataset: 558 mil pares de imagem-legenda (LAION-CC-SBU). Perda (loss): modelagem de linguagem na legenda, condicionada nos tokens projetados da imagem.
Em uma única época com batch de 128, isso é feito em poucas horas. O projetor aprende a mapear o espaço do ViT para o espaço do LLM. Sem supervisão específica da tarefa.
Etapa 2: ajuste de instruções visuais
Descongelar o projetor (continua treinável). Descongelar o LLM (geralmente por completo, às vezes via LoRA). Treinar em 158 mil turnos de instruções visuais.
Os dados de instrução são o grande truque. Liu et al. geraram isso da seguinte forma:
- Pegar uma imagem do COCO.
- Extrair a descrição em texto (5 legendas humanas + lista de caixas delimitadoras).
- Enviar ao GPT-4 com três templates de prompt:
- Conversa: "Generate a back-and-forth dialogue between a user and assistant about this image."
- Descrição detalhada: "Give a rich, detailed description of the image."
- Raciocínio complexo: "Ask a question that requires reasoning about the image, then answer it."
- Analisar a saída do GPT-4 e transformá-la em pares de (instrução, resposta).
Nada disso toca na imagem diretamente — apenas na descrição de texto. O GPT-4 alucina conteúdo de imagem plausível. Há algum ruído, mas funcionou: 158 mil turnos foram suficientes para desbloquear o diálogo.
Por que a comunidade copiou isso
- Sem perdas específicas da etapa 1 para sintonizar. Perda de LM do início ao fim.
- O projetor treina em horas, não em dias.
- O LLM pode ser trocado (LLaVA-Llama2, LLaVA-Mistral, LLaVA-Llama3) retreinando apenas o projetor.
- O pipeline de dados de instrução visual usa GPT-4 e é barato de regenerar para um novo domínio.
LLaVA-1.5 e LLaVA-NeXT
O LLaVA-1.5 (outubro de 2023) adicionou:
- Dados de tarefas acadêmicas (VQA, OKVQA, RefCOCO) misturados no ajuste de instruções.
- Melhor prompt do sistema.
- Contexto de 2048 → 32k.
O LLaVA-NeXT (janeiro de 2024) adicionou:
- AnyRes: divide imagens de alta resolução em uma grade de 2x2 ou 1x3 de recortes de 336x336, mais uma miniatura global de baixa resolução. Cada recorte vira 576 tokens; totalizando cerca de 2880 tokens visuais por imagem. As tarefas de OCR e gráficos deram um salto.
- Melhor mistura de dados de instrução com ShareGPT4V (legendas de alta qualidade do GPT-4V).
- LLMs base mais fortes (Mistral-7B, Yi-34B).
LLaVA-OneVision
A Lição 12.08 cobre o OneVision em detalhes. Versão curta: mesmo projetor, mas treinado com um currículo que cobre imagem única, multi-imagem e vídeo em um único modelo com orçamento de tokens visuais compartilhado.
A comparação com o Q-Former
| Q-Former (BLIP-2) | MLP (LLaVA) | |
|---|---|---|
| Tokens visuais por imagem | 32 | 576 (base) ou 2880 (AnyRes) |
| Parâmetros treináveis | 188M + LM | 40M + LM |
| Perda da etapa 1 | ITC+ITM+ITG | Apenas LM |
| Substituição do LLM | Exige retreinamento | Troca com retreinamento mínimo |
| Multi-imagem | Inadequado | Natural (concatenação) |
| Vídeo | Inadequado | Natural (concatenação por frame) |
| Orçamento de tokens | Pequeno | Grande |
O MLP ganha em simplicidade e flexibilidade de tokens. O Q-Former ganha no orçamento de tokens. No final de 2023, o orçamento de tokens não era mais a restrição limitante (os contextos dos LLMs cresceram para 32k-128k+) e a simplicidade dominou.
O formato do prompt
A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. USER: <image> Describe this image in detail. ASSISTANT: The image shows ...
<image> é um token de marcador de posição (placeholder). Antes da tokenização, ele é substituído pelos 576 tokens visuais (ou 2880 com AnyRes). O tokenizador vê uma sequência ligeiramente mais longa do que aquela para a qual foi treinado, mas o LLM lida com a nova entrada porque a etapa 1 o ensinou a fazer isso.
Economia de parâmetros
Detalhamento do LLaVA-1.5-7B:
- CLIP ViT-L/14 @ 336: 303M (congelado na etapa 1, frequentemente descongelado na etapa 2).
- Projetor (2x linear): ~22M treináveis.
- Llama-7B: 7B.
- Total: 7.3B parâmetros. Treináveis durante a etapa 2: 7B completos + 22M do projetor.
Custo de treinamento para a etapa 2: ~20 horas em 8xA100. Este é o número chave — um dia, um nó, reproduzível. É por isso que o LLaVA se espalhou.
Use It
O arquivo code/main.py implementa:
- O projetor MLP de 2 camadas (dim 16 → 32 → 32 para escala de brinquedo) em Python puro.
- O pipeline de construção de prompts: prompt do sistema +
<image>substituído por N tokens projetados + turno do usuário + marcador de posição para a geração do assistente. - Um visualizador de como o bloco visual de 576 tokens se parece no contexto do LLM (porcentagem de contexto de 2k / 32k / 128k contexto consumida).
Ship It
Esta lição produz outputs/skill-llava-vibes-eval.md. Dado um checkpoint da família LLaVA, ela executa uma suíte de avaliação de sensações (vibes-eval) de 10 prompts (3 de legendagem, 3 de VQA, 2 de raciocínio, 2 de recusa) e gera um boletim legível por humanos. Não é um benchmark; é um teste de fumaça (smoke test) para confirmar se o projetor e o LLM estão se conectando bem.
Exercícios
Calcule a contagem de parâmetros treináveis para o projetor MLP de 2 camadas em
1024 → 4096 → 4096. Com GELU e viés (bias), que fração do LLaVA-13B ele representa?Construa um prompt do LLaVA para um caso de "recusa" — a imagem contém um indivíduo privado. Escreva a resposta esperada do assistente. Por que o LLaVA deveria recusar isso de forma zero-shot e quais dados de treinamento seriam necessários para reforçar a recusa?
Leia a seção AnyRes do blog do LLaVA-NeXT. Calcule a contagem de tokens visuais para uma imagem de 1344x672 no AnyRes. Compare com os 576 tokens base em 336x336.
O projetor da etapa 1 do LLaVA é treinado com perda de LM em legendas. O que acontece se você pular a etapa 1 e for direto para a etapa 2 (ajuste de instruções visuais)? Cite a ablação do Prismatic VLMs (arXiv:2402.07865) para obter a resposta.
O LLaVA-Instruct-150k usa GPT-4 com legendas do COCO para gerar instruções. Para um novo domínio (raios-X médicos, imagens de satélite), descreva o pipeline de dados de quatro etapas para gerar instruções do domínio. O que poderia dar errado em cada etapa?
Termos-chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Projetor | "Ponte MLP" | MLP de 2 camadas com GELU que mapeia a dimensão do ViT para a dimensão do LLM |
| Token de imagem | "marcador |
Marcador no prompt que é substituído por N tokens visuais projetados antes da inferência |
| Ajuste de instruções visuais | "LLaVA etapa 2" | Treinamento em tripletos de (imagem, instrução, resposta) gerados pelo GPT-4 |
| Alinhamento da etapa 1 | "Pré-treinamento do projetor" | Congelar o ViT e o LLM, treinar o projetor com perda de LM nas legendas |
| AnyRes | "Tiling de múltiplos recortes" | Dividir uma imagem de alta resolução em uma grade de blocos (tiles) e concatenar os tokens visuais de cada bloco |
| LLaVA-Instruct | "Gerado pelo GPT-4" | 158 mil pares de instrução-resposta sintetizados a partir de legendas do COCO + GPT-4 |
| Vision encoder freeze | "Backbone travado" | Os pesos do CLIP não são atualizados na etapa 1, e às vezes também não na etapa 2 |
| ShareGPT4V | "Melhores legendas" | 1M de legendas densas geradas pelo GPT-4V, usadas para um alinhamento de maior qualidade |
| VQA | "Respostas a perguntas visuais" | Tarefa de responder a uma pergunta livre sobre uma imagem |
| Prismatic VLMs | "Artigo sobre espaço de design" | Ablação de Karamcheti 2024 que testa sistematicamente as escolhas de projetor e dados |
Leitura Adicional
- Liu et al. — Visual Instruction Tuning (arXiv:2304.08485) — o artigo do LLaVA.
- Liu et al. — Improved Baselines with Visual Instruction Tuning (arXiv:2310.03744) — LLaVA-1.5.
- Chen et al. — ShareGPT4V (arXiv:2311.12793) — dataset de legendas densas.
- Karamcheti et al. — Prismatic VLMs (arXiv:2402.07865) — ablações do espaço de design.
- Li et al. — LLaVA-OneVision (arXiv:2408.03326) — imagem única, multi-imagem e vídeo unificados.