Phase 12 - Lesson 11
Chameleon y Modelos Multimodales de Solo Tokens con Fusión Temprana
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
Cada VLM que hemos visto hasta ahora mantiene las imágenes y el texto separados. Los tokens visuales provienen de un codificador de visión, fluyen hacia un proyector y luego se encuentran con el texto dentro del LLM. Los vocabularios de visión y texto nunca se superponen. Chameleon (Meta, mayo de 2024) se preguntó: ¿qué pasaría si lo hicieran? Entrena un VQ-VAE que convierta una imagen en una secuencia de tokens discretos a partir de un vocabulario compartido. Cada documento multimodal ahora es una sola secuencia: tokens de texto y tokens de imagen intercalados, con una única pérdida autorregresiva. Efecto secundario: el modelo puede generar salidas de modalidad mixta (alternando tokens de texto e imagen en una sola llamada de inferencia). Esta lección aborda la tesis de la fusión temprana y construye una versión de juguete de extremo a extremo.
Tipo: Construcción Lenguajes: Python (stdlib, tokenizador VQ-VAE + decodificador intercalado) Prerrequisitos: Fase 12 · 05, Fase 8 (IA Generativa) Tiempo: ~180 minutos
Objetivos de Aprendizaje
- Explicar por que un vocabulario compartido + una única pérdida cambia lo que el modelo puede hacer.
- Describir cómo un VQ-VAE tokeniza una imagen en una secuencia discreta compatible con el objetivo de próximo token de un transformer.
- Nombrar los trucos de estabilidad de entrenamiento de Chameleon: QK-Norm, ubicación de dropout y ordenamiento de LayerNorm.
- Comparar Chameleon frente al enfoque Q-Former de BLIP-2 y describir cuándo cada uno es la elección correcta.
El Problema
Los VLM basados en adaptadores (LLaVA, BLIP-2, Qwen-VL) tratan el texto y la imagen como dos cosas diferentes. Un token de texto pasa por embed(text_token); una imagen pasa por visual_encoder(image) → projector → ... pseudo_tokens. El modelo tiene dos rutas de entrada que se fusionan a mitad de camino.
Tres consecuencias:
- El LLM solo puede consumir imágenes, no emitirlas. La salida es únicamente texto.
- Los documentos de modalidad mixta (párrafos e imágenes alternados, como en un artículo) son incómodos: o bien se analiza la entrada multimodal fuera del modelo o se encadenan las generaciones.
- Desajuste de distribución (distributional mismatch). Los tokens visuales y los tokens de texto viven en diferentes regiones del espacio oculto, creando problemas sutiles de alineación.
Chameleon rechaza la premisa: las imágenes son solo secuencias de tokens discretos de un vocabulario compartido. Al entrenar el modelo con documentos intercalados, una pérdida y un decodificador autorregresivo, se desbloquea la generación de modalidad mixta de forma gratuita.
El Concepto
VQ-VAE como tokenizador de imágenes
El tokenizador es un autocodificador variacional cuantizado vectorialmente (vector-quantized variational autoencoder). La arquitectura:
- Codificador (Encoder): CNN + ViT que mapea la imagen a un mapa de características espaciales, por ejemplo, 32x32 características de dimensión 256.
- Libro de códigos (Codebook): un vocabulario aprendido de K vectores (Chameleon usa 8192), también de dimensión 256.
- Cuantización: para cada característica espacial, se busca la entrada más cercana en el libro de códigos por distancia L2. Se reemplaza la característica continua por el índice entero correspondiente.
- Decodificador (Decoder): CNN que lleva las características cuantizadas de vuelta a píxeles.
Entrenamiento: pérdida de reconstrucción de VAE + pérdida de compromiso (commitment loss) + pérdida del libro de códigos. Los índices del libro de códigos forman un alfabeto discreto para las imágenes.
Para Chameleon: una imagen se convierte en 32*32 = 1024 tokens extraídos de un vocabulario de 8192. Al concatenarlos con los tokens de texto (del vocabulario BPE del LLM, digamos 32000), el vocabulario final es de 40192. El transformer ve una secuencia y una pérdida.
El vocabulario compartido
El vocabulario de Chameleon combina tokens de texto, tokens de imagen y separadores de modalidad. Cada token tiene un ID único. La capa de embedding de entrada mapea cada ID a un vector oculto de dimensión D. La proyección de salida mapea el estado oculto de vuelta a los logits del vocabulario. Softmax elige el siguiente token, sin importar la modalidad.
Los separadores importan: las etiquetas <image> y </image> delimitan la secuencia de tokens de imagen. En el momento de la generación, si el modelo emite <image>, el software downstream sabe que los próximos 1024 tokens son índices VQ que se deben enviar al decodificador para el renderizado de píxeles.
Generación de modalidad mixta
La inferencia es la predicción del próximo token en el vocabulario compartido. Ejemplo de prompt: "Draw a cat and describe it." Chameleon emite:
<image> 4821 1029 2891 ... (1024 image tokens) </image>
The cat is orange, sitting on a windowsill...
El modelo elige el orden de forma autónoma: puede producir primero la imagen y luego el texto, primero el texto y luego la imagen, o intercalarlos. Mismo decodificador, misma pérdida.
A diferencia de los VLM basados en adaptadores donde la generación es solo de texto, Chameleon vuelve a abrir la cuestión de las modalidades de salida del modelo.
Estabilidad de entrenamiento: QK-Norm, dropout, ordenamiento de LayerNorm
El entrenamiento de fusión temprana es inestable a gran escala. El artículo de Chameleon documenta tres trucos:
- QK-Norm. Aplica LayerNorm a las proyecciones de query y key dentro de la atención, antes del producto punto. Esto evita la explosión de la magnitud de los logits en profundidad. Utilizado por múltiples modelos grandes posteriores a 2024.
- Ubicación de dropout. Dropout después de cada suma residual (residual-add), no solo después de la atención y el MLP. Se requiere más regularización cuando los gradientes de los tokens de imagen pueden dominar.
- Ordenamiento de LayerNorm. Pre-LN en la rama residual (estándar), más un LN adicional en la conexión de salto (skip connection) del último bloque. Esto estabiliza el flujo de gradiente en la última capa.
Sin estos trucos, el entrenamiento de Chameleon de 34B de parámetros divergió en múltiples checkpoints. Con ellos, converge. La receta de entrenamiento es una contribución tan importante como la arquitectura.
El límite de reconstrucción del tokenizador
El VQ-VAE tiene pérdidas (lossy). Con 8192 entradas en el libro de códigos y 1024 tokens por imagen de 512x512, el PSNR de reconstrucción se limita a unos 26-28 dB. Esto es suficiente para una generación de imágenes reconocible, pero visiblemente peor que la difusión en espacio continuo (Stable Diffusion 3 alcanza más de 32 dB).
El tokenizador es el cuello de botella. Los mejores tokenizadores (MAGVIT-v2, IBQ, SBER-MoVQGAN) elevan el límite. Emu3 (Lección 12.12) logra una generación con calidad de SDXL únicamente a través de un mejor tokenizador.
Chameleon frente a BLIP-2 / LLaVA
Chameleon (fusión temprana, vocabulario compartido):
- Una pérdida, un decodificador.
- Genera salidas de modalidad mixta.
- El tokenizador es el límite de calidad.
- Costoso: decodificador VQ-VAE por cada imagen gerada en la ruta de inferencia.
BLIP-2 / LLaVA (fusión tardía, torres separadas):
- Entrada de visión, salida de texto únicamente.
- Reutiliza el LLM preentrenado.
- Sin cuello de botella del tokenizador para la comprensión.
- Económico: una sola pasada hacia adelante (single forward pass).
Elige según la tarea. Si necesitas generación de imágenes, utiliza la familia Chameleon. Si solo necesitas comprensión, un adaptador-VLM es más sencillo y reutiliza más computación preentrenada.
Fuyu y AnyGPT
Fuyu (Adept, 2023) es un enfoque relacionado: descarta por completo el codificador de visión independiente, pasa los parches de imagen sin procesar a través de la proyección de entrada del LLM como si fueran tokens, sin tokenizador. Es más simple que Chameleon, pero pierde la generación de salida con vocabulario compartido.
AnyGPT (Zhan et al., 2024) extiende Chameleon a cuatro modalidades: texto, imagen, voz y música. Utiliza el mismo truco VQ-VAE para cada una, con un transformer compartido. Generación de cualquier modalidad a cualquier modalidad (any-to-any). Se aborda más detalladamente en la Lección 12.16.
Úsalo
code/main.py construye un modelo de juguete de fusión temprana de extremo a extremo:
- Un cuantizador minúsculo al estilo de VQ-VAE que mapeia parches de 8x8 a índices del libro de códigos (K=16).
- Un vocabulario compartido de (IDs de texto 0..31) + (IDs de imagen 32..47) + (separadores 48, 49).
- Un decodificador autorregresivo de juguete (tabla de bigramas) entrenado con subtítulos sintéticos + secuencias de tokens de imagen.
- Bucle de muestreo que emite tokens alternados de texto + imagen a partir de un prompt.
El código mantiene intencionalmente el transformer muy pequeño (bigramas) para que puedas rastrear el flujo de la señal de extremo a extremo.
Entrégalo
Esta lección produce outputs/skill-tokenizer-vs-adapter-picker.md. Dada la especificación de un producto (solo comprensión frente a comprensión + generación, calidad de imagen requerida, presupuesto de costos), elige entre la familia Chameleon (fusión temprana) y la familia LLaVA (fusión tardía) y lo justifica con reglas prácticas cuantitativas.
Ejercicios
Chameleon utiliza K=8192 entradas de libro de códigos y 1024 tokens por imagen de 512x512. Estima la relación de compresión frente a una imagen RGB de 24 bits. ¿Tiene pérdidas (lossy)? ¿Qué tan grande es la pérdida?
Una imagen 4K (3840x2160) con la misma densidad de VQ-VAE, ¿cuántos tokens de imagen produce? ¿Puede un modelo estilo Chameleon generar una imagen 4K en una sola llamada de inferencia? ¿Qué se rompe primero: el contexto, la calidad del tokenizador o la caché KV?
Implementa QK-Norm en Python puro. Dadas una query y una key de dimensión 64, muestra el producto punto antes y después de LayerNorm. ¿Por qué es importante el control de la magnitud a gran profundidad?
Lee la Sección 2.3 de Chameleon sobre estabilidad de entrenamiento. Describe el modo de fallo exacto que observó el artículo con 34B de parámetros sin QK-Norm. ¿Cuál fue la firma de la "explosión de norma"?
Extiende el decodificador de juguete para emitir una respuesta de modalidad mixta a partir de un prompt de solo texto. Mide con qué frecuencia el modelo elige primero la imagen frente a primero el texto, dada una distribución de datos de entrenamiento de 60% primero el texto / 40% primero la imagen.
Términos Clave
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Fusión temprana | "Tokens unificados" | Imágenes convertidas en tokens discretos que comparten el vocabulario del transformer desde el primer paso |
| VQ-VAE | "Tokenizador de imágenes" | CNN + ViT + libro de códigos que mapea imágenes a índices enteros que el transformer puede predecir |
| Vocabulario compartido | "Un diccionario" | Un único espacio de IDs de tokens que cubre texto + imagen + separadores de modalidad |
| QK-Norm | "Estabilizador de atención" | LayerNorm aplicado a la query y la key antes de su producto punto, evita que la norma explote |
| Generación de modalidad mixta | "Salida de texto + imagen" | Inferencia que produce de forma autónoma tokens intercalados de texto e imagen en una sola pasada |
| Tamaño del libro de códigos | "Entradas K" | Número de vectores discretos a los que el VQ-VAE puede cuantizar; equilibra la compresión y la fidelidad |
| Límite del tokenizador | "Límite de reconstrucción" | El mejor PSNR alcanzable decodificando tokens VQ; limita la calidad de imagen del modelo |