Phase 12 - Lesson 05

LLaVA y Ajuste de Instrucciones Visuales

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

LLaVA (abril de 2023) es la arquitectura multimodal más copiada del planeta. Reemplazó el Q-Former de BLIP-2 con un MLP de 2 capas, reemplazó la atención cruzada controlada (gated cross-attention) de Flamingo con una concatenación simple de tokens, y fue entrenado en 158k turnos de instrucciones visuales generados por GPT-4 a partir de subtítulos de solo texto. Cualquier profesional que haya construido un VLM entre 2023 y 2026 construyó alguna variante de LLaVA. LLaVA-1.5 agregó AnyRes. LLaVA-NeXT aumentó la resolución. LLaVA-OneVision unificó imagen, multi-imagen y video en una sola receta. Esta lección lee la receta, implementa el proyector y explica por que ganó "lo más simple".

Tipo: Build Idiomas: Python (stdlib, projector + instruction-template builder) Prerrequisitos: Phase 12 · 02 (CLIP), Phase 11 (LLM Engineering — instruction tuning) Tiempo: ~180 minutos

Objetivos de Aprendizaje

  • Construir un proyector MLP de 2 capas que mapee embeddings de parches de ViT (dim 1024) a la dimensión de embedding de un LLM (dim 4096).
  • Recorrer la receta de dos etapas de LLaVA: (1) alineación del proyector en 558k pares de subtítulos, (2) ajuste de instrucciones visuales en 158k turnos generados por GPT-4.
  • Construir un prompt en formato LLaVA con el marcador de posición del token de imagen, el prompt del sistema y los turnos de usuario/asistente.
  • Explicar por qué la comunidad pasó de Q-Former a MLP a pesar de la ventaja de Q-Former en el presupuesto de tokens.

El Problema

El Q-Former de BLIP-2 (Lección 12.03) comprime una imagen a 32 tokens. Limpio, eficiente, bueno para benchmarks. Pero tiene dos problemas.

Primero, el Q-Former es entrenable pero su pérdida (loss) no es la tarea final. La Etapa 1 entrena ITC+ITM+ITG. La Etapa 2 entrena la pérdida de LM. Las consultas (queries) aprendem alguna representación intermedia que el LLM luego tiene que decodificar. Se pierde información en el cuello de botella.

Segundo, el Q-Former requiere 188M de parámetros, y a la escala de LLaVA en 2023 tenías que co-diseñarlo con tu LLM objetivo. Si cambiabas el LLM, debías reentrenar el Q-Former. Si cambiabas el codificador de visión, debías reentrenar. Cada combinación era un proyecto de R&D independiente.

La respuesta de LLaVA fue vergonzosamente simple: tomar los 576 tokens de parches de ViT, pasar cada uno por un MLP de 2 capas (1024 → 4096 → 4096) y volcar los 576 en la secuencia de entrada del LLM. Sin cuello de botella. Sin preentrenamiento de etapa 1 en objetivos extraños. Simplemente entrenar el MLP con una pérdida directa de LM.

¿De dónde provienen los datos? La segunda idea clave de LLaVA: usar GPT-4 (solo texto) para generar datos de instrucciones. Alimentar a GPT-4 con el subtítulo de COCO y los datos de cajas delimitadoras (bounding-boxes) de una imagen, y pedirle que produzca conversaciones, descripciones y preguntas de razonamiento complejo. 158k turnos de instrucción-respuesta gratis. Sin anotación humana.

El resultado: un VLM que se entrenó en 8 A100s durante un día, superó a Flamingo en MMMU y publicó un checkpoint abierto que la comunidad pudo extender. A finales de 2023, ya había inspirado más de 50 forks.

El Concepto

La arquitectura

LLaVA-1.5 de 13B:

  • Codificador de visión: CLIP ViT-L/14 @ 336 (congelado durante la etapa 1, opcionalmente descongelado en la etapa 2).
  • Proyector: MLP de 2 capas con activación GELU, 1024 → 4096 → 4096.
  • LLM: Vicuna-13B (más tarde Llama-3.1-8B).

Paso hacia adelante (forward pass) en una imagen + 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

La imagen ocupa 576 tokens del contexto del LLM. Con un contexto de 2048, eso deja 1472 tokens para texto. Con un contexto de 32k, es solo un error de redondeo.

Etapa 1: alineación del proyector

Congelar ViT. Congelar LLM. Entrenar solo el MLP de 2 capas. Dataset: 558k pares de imagen-subtítulo (LAION-CC-SBU). Pérdida (loss): modelado de lenguaje en el subtítulo, condicionado a los tokens proyectados de la imagen.

En una sola época con un tamaño de lote (batch size) de 128, esto se completa en unas pocas horas. El proyector aprende a mapear el espacio de ViT al espacio del LLM. Sin supervisión específica de la tarea.

Etapa 2: ajuste de instrucciones visuales

Descongelar el proyector (sigue siendo entrenable). Descongelar el LLM (usualmente por completo, a veces con LoRA). Entrenar con 158k turnos de instrucciones visuales.

Los datos de instrucciones son el truco. Liu et al. los generaron de la siguiente manera:

  1. Tomar una imagen de COCO.
  2. Extraer la descripción de texto (5 subtítulos humanos + lista de cajas delimitadoras).
  3. Enviar a GPT-4 con tres plantillas de prompts:
    • Conversación: "Generate a back-and-forth dialogue between a user and assistant about this image."
    • Descripción detallada: "Give a rich, detailed description of the image."
    • Razonamiento complejo: "Ask a question that requires reasoning about the image, then answer it."
  4. Procesar la salida de GPT-4 en pares de (instrucción, respuesta).

Nada de esto toca la imagen directamente, solo la descripción de texto. GPT-4 alucina contenido de imagen plausible. Hay algo de ruido, pero funcionó: 158k turnos fueron suficientes para desbloquear el diálogo.

Por qué la comunidad copió esto

  • Sin pérdidas específicas de la etapa 1 que ajustar. Pérdida de LM en todo momento.
  • El proyector se entrena en horas, no días.
  • El LLM se puede reemplazar (LLaVA-Llama2, LLaVA-Mistral, LLaVA-Llama3) reentrenando solo el proyector.
  • El pipeline de datos de instrucciones visuales utiliza GPT-4 y es económico de regenerar para un nuevo dominio.

LLaVA-1.5 y LLaVA-NeXT

LLaVA-1.5 (octubre de 2023) agregó:

  • Datos de tareas académicas (VQA, OKVQA, RefCOCO) mezclados en el ajuste de instrucciones.
  • Mejor prompt del sistema.
  • Contexto de 2048 → 32k.

LLaVA-NeXT (enero de 2024) agregó:

  • AnyRes: divide las imágenes de alta resolución en una cuadrícula de 2x2 o 1x3 de recortes de 336x336, más una miniatura global de baja resolución. Cada recorte se convierte en 576 tokens; totalizando alrededor de 2880 tokens visuales por imagen. Las tareas de OCR y gráficos experimentaron un gran salto.
  • Mejor mezcla de datos de instrucciones con ShareGPT4V (subtítulos de alta calidad de GPT-4V).
  • LLMs base más fuertes (Mistral-7B, Yi-34B).

LLaVA-OneVision

La Lección 12.08 cubre OneVision en profundidad. Versión corta: el mismo proyector, pero entrenado con un plan de estudios que abarca imagen única, multi-imagen y video en un solo modelo con un presupuesto compartido de tokens visuales.

La comparación con Q-Former

Q-Former (BLIP-2) MLP (LLaVA)
Tokens visuales por imagen 32 576 (base) o 2880 (AnyRes)
Parâmetros entrenables 188M + LM 40M + LM
Pérdida de etapa 1 ITC+ITM+ITG Solo LM
Reemplazo de LLM Requiere reentrenamiento Reemplazo con reentrenamiento mínimo
Multi-imagen Dificultoso Natural (concatenación)
Video Dificultoso Natural (concatenación por fotograma)
Presupuesto de tokens Pequeño Grande

MLP gana en simplicidad y flexibilidad de tokens. Q-Former gana en presupuesto de tokens. A finales de 2023, el presupuesto de tokens ya no era la restricción limitante (los contextos de los LLMs crecieron a 32k-128k+) y la simplicidad dominó.

El formato del 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> es un token de marcador de posición. Antes de la tokenización, se reemplaza con los 576 tokens visuales (o 2880 con AnyRes). El tokenizador ve una secuencia ligeramente más larga de la que fue entrenado para procesar, pero el LLM maneja la nueva entrada porque la etapa 1 le enseñó a hacerlo.

Economía de parámetros

Desglose de LLaVA-1.5-7B:

  • CLIP ViT-L/14 @ 336: 303M (congelado en la etapa 1, a menudo descongelado en la etapa 2).
  • Proyector (2x linear): ~22M entrenables.
  • Llama-7B: 7B.
  • Total: 7.3B parámetros. Entrenables durante la etapa 2: 7B completos + 22M del proyector.

Costo de entrenamiento para la etapa 2: ~20 horas en 8xA100. Este es el número clave: un día, un nodo, reproducible. Por eso se difundió LLaVA.

Use It

code/main.py implementa:

  1. El proyector MLP de 2 capas (dim 16 → 32 → 32 para escala de juguete) en Python puro.
  2. El pipeline de construcción de prompts: prompt del sistema + <image> reemplazado con N tokens proyectados + turno de usuario + marcador de posición de generación del asistente.
  3. Un visualizador de cómo se ve el bloque visual de 576 tokens en el contexto del LLM (porcentaje de contexto de 2k / 32k / 128k consumido).

Ship It

Esta lección produce outputs/skill-llava-vibes-eval.md. Dado un checkpoint de la familia LLaVA, ejecuta una suite de vibes-eval de 10 prompts (3 de subtitulado, 3 de VQA, 2 de razonamiento, 2 de rechazo) y genera una tarjeta de puntuación legible por humanos. No es un benchmark; es una prueba de humo (smoke test) para confirmar que el proyector y el LLM se están conectando correctamente.

Ejercicios

  1. Calcula la cantidad de parámetros entrenables para el proyector MLP de 2 capas en 1024 → 4096 → 4096. Con GELU y sesgo (bias), ¿qué fracción de LLaVA-13B representa?

  2. Construye un prompt de LLaVA para un caso de "rechazo": la imagen contiene a una persona privada. Escribe la respuesta esperada del asistente. ¿Por qué debería LLaVA rechazar esto de forma zero-shot y qué datos de entrenamiento se necesitarían para reforzar el rechazo?

  3. Lee la sección AnyRes del blog de LLaVA-NeXT. Calcula la cantidad de tokens visuales para una imagen de 1344x672 en AnyRes. Compara con los 576 tokens base en 336x336.

  4. El proyector de etapa 1 de LLaVA se entrena con pérdida de LM en subtítulos. ¿Qué sucede si omites la etapa 1 y pasas directamente a la etapa 2 (ajuste de instrucciones visuales)? Cita la ablación de Prismatic VLMs (arXiv:2402.07865) para responder.

  5. LLaVA-Instruct-150k utiliza GPT-4 con subtítulos de COCO para generar instrucciones. Para un nuevo dominio (radiografías médicas, imágenes satelitales), describe el pipeline de datos de cuatro pasos para generar instrucciones de dominio. ¿Qué podría salir mal en cada paso?

Términos-clave

Término Lo que la gente dice Lo que realmente significa
Proyector "Puente MLP" MLP de 2 capas con GELU que mapea la dimensión de ViT a la dimensión del LLM
Token de imagen "marcador " Marcador en el prompt reemplazado por N tokens visuales proyectados antes de la inferencia
Ajuste de instrucciones visuales "LLaVA etapa 2" Entrenamiento en tripletes de (imagen, instrucción, respuesta) generados por GPT-4
Alineación de etapa 1 "Preentrenamiento del proyector" Congelar ViT y LLM, entrenar el proyector con pérdida de LM en subtítulos
AnyRes "Mosaico de múltiples recortes" Dividir una imagen de alta resolución en una cuadrícula de mosaicos (tiles) y concatenar los tokens visuales de cada mosaico
LLaVA-Instruct "Generado por GPT-4" 158k pares de instrucción-respuesta sintetizados a partir de subtítulos de COCO + GPT-4
Vision encoder freeze "Backbone bloqueado" Los pesos de CLIP no se actualizan en la etapa 1, a veces tampoco en la etapa 2
ShareGPT4V "Mejores subtítulos" 1M de subtítulos densos generados por GPT-4V, utilizados para una alineación de mayor calidad
VQA "Preguntas y respuestas visuales" Tarea de responder a una pregunta abierta sobre una imagen
Prismatic VLMs "Artículo de espacio de diseño" Ablación de Karamcheti 2024 que evalúa sistemáticamente las opciones de proyector y datos

Lectura Adicional

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).