Phase 12 - Lesson 15

Janus-Pro: Encoders Desacoplados para Modelos Multimodales Unificados

Los modelos multimodales unificados tienen una tensión inevitable. La comprensión requiere características semánticas: vectores de salida de SigLIP o DINOv2 ricos en información a nivel de concepto. La generación requiere códigos amigables para la reconstrucción: tokens VQ que se vuelven a componer en píxeles nítidos. Ambos objetivos no son compatibles en un solo codificador. Janus (DeepSeek, octubre de 2024) y Janus-Pro (DeepSeek, enero de 2025) sostienen que la solución es dejar de intentarlo: desacoplar los dos codificadores. Compartir el cuerpo del transformer entre tareas, pero rutear la comprensión a través de SigLIP y la generación a través de un tokenizador VQ. Con 7B de parámetros, Janus-Pro supera a DALL-E 3 en GenEval mientras se equipara con LLaVA en MMMU. Esta lección detalla por que dos codificadores funcionan donde uno solo falla.

Tipo: Construcción Idiomas: Python (stdlib, ruteo de dual-encoder + señal de cuerpo compartido) Prerrequisitos: Fase 12 · 13 (Transfusion), Fase 12 · 14 (Show-o) Tiempo: ~120 minutos

Objetivos de Aprendizaje

  • Explicar por qué un solo codificador compartido compromete la calidad de la comprensión o la de la generación.
  • Describir el ruteo de Janus-Pro: características de SigLIP en el lado de entrada para la comprensión, tokens VQ tanto en la entrada como en la salida para la generación.
  • Rastrear la escala de la mezcla de datos que hace que Janus-Pro tenga éxito donde Janus no lo logró.
  • Comparar las arquitecturas desacopladas (Janus-Pro), acopladas continuas (Transfusion) y acopladas discretas (Show-o).

El Problema

Los modelos unificados comparten el cuerpo de un transformer entre la comprensión y la generación. Los intentos anteriores (Chameleon, Show-o, Transfusion) utilizan un solo tokenizador visual para ambas direcciones. El tokenizador es un compromiso:

  • Optimizado para la reconstrucción (generación): el VQ-VAE captura detalles de píxeles de grano fino pero produce tokens con una coherencia semántica débil.
  • Optimizado para la semántica (comprensión): los embeddings de SigLIP agrupan imágenes de "gato" cerca de tokens de "gato", pero no permiten una buena reconstrucción.

Show-o y Transfusion pagan por esto con una penalización de calidad visible en una dirección. Janus-Pro plantea: ¿por qué requerir un solo tokenizador cuando las tareas tienen necesidades diferentes?

El Concepto

Codificación visual desacoplada

La arquitectura de Janus-Pro separa los dos codificadores:

  • Ruta de comprensión: Imagen de entrada → SigLIP-SO400m → MLP de 2 capas → cuerpo del transformer.
  • Ruta de generación: Imagen de entrada (si se condiciona a una imagen existente) → tokenizador VQ → IDs de tokens → cuerpo del transformer.
  • Generación de salida: Tokens de imagen predichos por el transformer → decodificador VQ → píxeles.

El cuerpo del transformer es compartido. Todo lo que está corriente arriba (upstream) y corriente abajo (downstream) del cuerpo es específico de la tarea.

Las entradas se desambiguan por el formato del prompt: una etiqueta <understand> rutea a través de SigLIP; <generate> rutea a través de VQ. O bien el ruteo es implícito a partir de la tarea.

Por qué funciona esto

La pérdida de comprensión (understanding loss) obtiene características de SigLIP, las cuales el preentrenamiento de estilo CLIP ha ajustado para la similitud semántica. Los benchmarks de percepción del modelo mejoran respecto a Show-o / Transfusion porque las características de entrada son mejores para la tarea.

La pérdida de generación (generation loss) obtiene tokens VQ, los cuales un tokenizador ha ajustado para la reconstrucción. La calidad de la imagen mejora en comparación con Show-o porque los códigos VQ se vuelven a componer en píxeles limpiamente.

El cuerpo compartido del transformer ve dos distribuciones de entrada (SigLIP y VQ) y aprende a trabajar con ambas. La premisa: con suficientes datos + suficientes parámetros, el cuerpo absorbe esta transición.

Escala de datos — Janus vs Janus-Pro

Janus (original, arXiv 2410.13848) introdujo el desacoplamiento pero a pequeña escala (1.3B de parámetros, datos limitados). Janus-Pro (arXiv 2501.17811) escaló:

  • 7B de parámetros (frente a 1.3B).
  • 90M de pares imagen-texto para la etapa 1 (alineación), frente a los 72M anteriores.
  • 72M para la etapa 2 (unificada), frente a los 26M anteriores.
  • Se agregaron 200k muestras de instrucciones de generación de imágenes para la etapa 3.

El resultado: Janus-Pro-7B se equipara con LLaVA en MMMU (60.3 frente a ~58) y supera a DALL-E 3 en GenEval (0.80 frente a 0.67). Un modelo abierto, competitivo en ambos lados del espectro unificado.

JanusFlow — la variante con rectified flow

JanusFlow (arXiv 2411.07975) reemplaza la ruta de generación VQ con una ruta de generación de rectified flow (continua). La división pasa a ser SigLIP-para-comprensión + rectified-flow-para-generación. Los límites de calidad se elevan aún más. La arquitectura se mantiene como codificadores desacoplados y cuerpo compartido.

El trabajo del cuerpo compartido

El cuerpo del transformer procesa una secuencia unificada pero con dos distribuciones de entrada. Su trabajo consiste en:

  • Para la comprensión: consumir características de SigLIP + tokens de texto → emitir texto de manera autorregresiva.
  • Para la generación: consumir tokens de texto + (tokens VQ de imagen opcionales) → emitir tokens VQ de imagen de manera autorregresiva.

El cuerpo no tiene pesos específicos para cada modalidad por bloque. Es el mismo transformer de estilo texto que esperarías encontrar dentro de Qwen o Llama, más los dos adaptadores de entrada.

Curiosamente, esto significa que el cuerpo de Janus-Pro podría inicializarse a partir de un LLM preentrenado. De hecho, Janus-Pro se inicializa a partir de DeepSeek-MoE-7B. Esa elección importa: el LLM aporta habilidades de razonamiento que los modelos unificados entrenados puramente desde cero tienen dificultades para alcanzar.

Comparado con InternVL-U

InternVL-U (Lección 12.10) es el seguimiento de 2026. Combina:

  • Preentrenamiento multimodal nativo (backbone InternVL3).
  • Roteo de codificadores desacoplados (SigLIP en la entrada, cabezales VQ + difusión en la salida).
  • Comprensión + generación + edición unificadas.

InternVL-U incorpora la elección arquitectónica de Janus-Pro en un marco de trabajo más amplio. La idea de codificadores desacoplados es ahora el estándar para modelos unificados a escala.

Limitaciones

Los codificadores desacoplados añaden complejidad arquitectónica. Son dos tokenizadores que entrenar, dos rutas de entrada que mantener y dos conjuntos de modos de falla. Para productos que no necesitan generación, Janus-Pro está sobrediseñado; elija un modelo de comprensión de la familia LLaVA.

Para productos que no necesitan comprensión, Janus-Pro está sobrecalificado; elija un modelo Stable Diffusion 3 / Flux.

Para productos que necesitan ambos, Janus-Pro es ahora la arquitectura abierta de referencia.

Uso

code/main.py simula el ruteo de Janus-Pro:

  • Dos codificadores simulados (mock): uno tipo SigLIP (produce vectores semánticos de 256 dimensiones) y otro tipo VQ (produce códigos enteros).
  • Un ruteador de prompts que elige el codificador en función de una etiqueta de tarea.
  • Un cuerpo compartido (representativo) que procesa secuencias de tokens independientemente del codificador que las haya producido.
  • Un cambio de un esquema de muestreo ponderado de la etapa 1 (alineación) a la etapa 3 (ajuste de instrucciones).

Imprima las rutas direccionadas para 3 ejemplos: preguntas y respuestas sobre imágenes, texto a imagen (T2I), edición de imágenes.

Envío

Esta lección produce outputs/skill-decoupled-encoder-picker.md. Dado un producto que requiere generación + comprensión unificadas con calidad cercana al estado del arte, selecciona Janus-Pro, JanusFlow o InternVL-U con una recomendación concreta de escala de datos.

Ejercicios

  1. Janus-Pro-7B supera a DALL-E 3 en GenEval. Explique por qué un modelo abierto de 7B puede equipararse a un modelo propietario de frontera en generación pero no en comprensión.

  2. Implemente una función de ruteo: dado el texto del prompt, clasifíquelo como understand o generate. ¿Cómo manejaría prompts ambiguos como "describe y luego dibuja"?

  3. JanusFlow reemplaza la ruta VQ con rectified flow. ¿Qué produce ahora como salida el cuerpo del transformer y qué cambia en la pérdida?

  4. Proponga una cuarta tarea que la arquitectura de Janus-Pro podría manejar con un codificador desacoplado adicional. Ejemplos: segmentación de imágenes (estilo DINO), profundidad (estilo MiDaS).

  5. Lea la Sección 4.2 de Janus-Pro sobre la escala de datos. ¿Qué etapa de datos contribui más a la ganancia de calidad de T2I en comparación con Janus?

Términos Clave

Término Lo que la gente dice Lo que realmente significa
Codificación desacoplada "Dos codificadores visuales" Codificador o tokenizador separado por dirección: semántico para la comprensión, reconstrucción para la generación
Cuerpo compartido "Un transformer" Un único transformer procesa la salida de cualquiera de los codificadores; sin pesos específicos por modalidad
SigLIP para comprensión "Características semánticas" Torre de visión de la familia CLIP que proporciona ricas características conceptuales pero una reconstrucción deficiente
VQ para generación "Códigos de reconstrucción" Tokens cuantizados vectorialmente que se decodifican limpiamente de vuelta a píxeles
JanusFlow "Variante con rectified-flow" Janus-Pro con un cabezal de generación de flow-matching continuo en lugar de VQ
Etiqueta de ruteo "Etiqueta de tarea" Marcador de prompt (<understand> / <generate>) que selecciona el codificador de entrada

Lecturas Adicionales

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