Phase 12 - Lesson 15

Janus-Pro: Encoders Desacoplados para Modelos Multimodais Unificados

Modelos multimodais unificados possuem uma tensão inevitável. A compreensão exige recursos semânticos — vetores de saída do SigLIP ou DINOv2 ricos em informações no nível de conceito. A geração exige códigos amigáveis à reconstrução — tokens VQ que se recompõem em pixels nítidos. Os dois objetivos não são compatíveis em um único codificador. O Janus (DeepSeek, outubro de 2024) e o Janus-Pro (DeepSeek, janeiro de 2025) argumentam que a solução é parar de tentar: desacoplar os dois codificadores. Compartilhar o corpo do transformer entre as tarefas, mas rotear a compreensão através do SigLIP e a geração através de um tokenizador VQ. Com 7B de parâmetros, o Janus-Pro supera o DALL-E 3 no GenEval, ao mesmo tempo em que se equipara ao LLaVA no MMMU. Esta lição detalha por que dois codificadores funcionam onde um único falha.

Tipo: Construção Linguagens: Python (stdlib, roteamento de dual-encoder + sinal de corpo compartilhado) Pré-requisitos: Fase 12 · 13 (Transfusion), Fase 12 · 14 (Show-o) Tempo: ~120 minutos

Objetivos de Aprendizado

  • Explicar por que um único codificador compartilhado compromete a qualidade de compreensão ou a de geração.
  • Descrever o roteamento do Janus-Pro: recursos do SigLIP no lado de entrada para compreensão, tokens VQ tanto na entrada quanto na saída para geração.
  • Rastrear a escala do mix de dados que faz o Janus-Pro ter sucesso onde o Janus falhou.
  • Comparar as arquiteturas desacopladas (Janus-Pro), acopladas contínuas (Transfusion) e acopladas discretas (Show-o).

O Problema

Modelos unificados compartilham o corpo de um transformer entre compreensão e geração. Tentativas anteriores (Chameleon, Show-o, Transfusion) usam todas um único tokenizador visual para ambas as direções. O tokenizador é um compromisso:

  • Otimizado para reconstrução (geração): o VQ-VAE captura detalhes refinados de pixels, mas produz tokens com fraca coerência semântica.
  • Otimizado para semântica (compreensão): os embeddings do SigLIP agrupam imagens de "gato" perto de tokens de "gato", mas não permitem uma boa reconstrução.

Show-o e Transfusion pagam por isso com uma penalidade visível de qualidade em uma das direções. O Janus-Pro questiona: por que exigir um único tokenizador quando as tarefas têm necessidades diferentes?

O Conceito

Codificação visual desacoplada

A arquitetura do Janus-Pro separa os dois codificadores:

  • Caminho de compreensão: Imagem de entrada → SigLIP-SO400m → MLP de 2 camadas → corpo do transformer.
  • Caminho de geração: Imagem de entrada (se houver condicionamento em uma imagem existente) → tokenizador VQ → IDs de tokens → corpo do transformer.
  • Geração de saída: Tokens de imagem previstos pelo transformer → decodificador VQ → pixels.

O corpo do transformer é compartilhado. Tudo o que está a montante (upstream) e a jusante (downstream) do corpo é específico da tarefa.

As entradas são desambiguadas pelo formato do prompt: uma tag <understand> roteia pelo SigLIP; <generate> roteia pelo VQ. Ou o roteamento é implícito a partir da tarefa.

Por que isso funciona

A perda de compreensão (understanding loss) recebe recursos do SigLIP, que o pré-treinamento de estilo CLIP sintonizou para similaridade semântica. Os benchmarks de percepção do modelo melhoram em relação ao Show-o / Transfusion porque os recursos de entrada são melhores para a tarefa.

A perda de geração (generation loss) recebe tokens VQ, que um tokenizador sintonizou para reconstrução. A qualidade da imagem melhora em relação ao Show-o porque os códigos VQ se recompõem em pixels de forma limpa.

O corpo compartilhado do transformer vê duas distribuições de entrada (SigLIP e VQ) e aprende a trabalhar com ambas. A premissa: com dados suficientes + parâmetros suficientes, o corpo absorve essa alternância.

Escala de dados — Janus vs Janus-Pro

O Janus (original, arXiv 2410.13848) introduziu o desacoplamento, mas em pequena escala (1,3B de parâmetros, dados limitados). O Janus-Pro (arXiv 2501.17811) escalou isso:

  • 7B de parâmetros (contra 1,3B).
  • 90M de pares imagem-texto para a etapa 1 (alinhamento), acima dos 72M anteriores.
  • 72M para a etapa 2 (unificada), acima dos 26M anteriores.
  • Adicionados 200k exemplos de instruções de geração de imagem para a etapa 3.

O resultado: o Janus-Pro-7B se equipara ao LLaVA no MMMU (60,3 contra ~58) e supera o DALL-E 3 no GenEval (0,80 contra 0,67). Um modelo aberto, competitivo em ambos os lados do espectro unificado.

JanusFlow — a variante com rectified flow

O JanusFlow (arXiv 2411.07975) substitui o caminho de geração VQ por um caminho de geração com rectified flow (contínuo). A divisão passa a ser SigLIP-para-compreensão + rectified-flow-para-geração. Os limites máximos de qualidade sobem ainda mais. A arquitetura continua sendo de codificadores desacoplados e corpo compartilhado.

O papel do corpo compartilhado

O corpo do transformer corpo processa uma sequência unificada, mas com duas distribuições de entrada. Sua função é:

  • Para compreensão: consumir recursos do SigLIP + tokens de texto → emitir texto de forma autorregressiva.
  • Para geração: consumir tokens de texto + (tokens VQ de imagem opcionais) → emitir tokens VQ de imagem de forma autorregressiva.

O corpo não possui pesos específicos para cada modalidade por bloco. É o mesmo transformer de estilo texto que você esperaria encontrar dentro do Qwen ou Llama, acrescido de dois adaptadores de entrada.

Curiosamente, isso significa que o corpo do Janus-Pro poderia ser inicializado a partir de um LLM pré-treinado. O Janus-Pro de fato é inicializado a partir do DeepSeek-MoE-7B. Essa escolha faz diferença: o LLM contribui com habilidades de raciocínio que modelos unificados criados puramente do zero enfrentam dificuldades para alcançar.

Comparado ao InternVL-U

O InternVL-U (Lição 12.10) é o acompanhamento de 2026. Ele combina:

  • Pré-treinamento multimodal nativo (backbone InternVL3).
  • Roteamento com codificadores desacoplados (SigLIP na entrada, cabeças VQ + difusão na saída).
  • Compreensão + geração + edição unificadas.

O InternVL-U incorpora a escolha arquitetônica do Janus-Pro em um framework mais amplo. A ideia de codificadores desacoplados é agora o padrão para modelos unificados em escala.

Limitações

Codificadores desacoplados adicionam complexidade arquitetônica. São dois tokenizadores para treinar, dois caminhos de entrada para manter e dois conjuntos de modos de falha. Para produtos que não precisam de geração, o Janus-Pro é superdimensionado — escolha um modelo de compreensão da família LLaVA.

Para produtos que não precisam de compreensão, o Janus-Pro é superqualificado — escolha um modelo Stable Diffusion 3 / Flux.

Para produtos que precisam de ambos, o Janus-Pro é agora a arquitetura aberta de referência.

Use

code/main.py simula o roteamento do Janus-Pro:

  • Dois codificadores fictícios (mock): semelhante ao SigLIP (produz vetores semânticos de 256 dimensões) e semelhante ao VQ (produz códigos inteiros).
  • Um roteador de prompts que escolhe o codificador com base em uma tag de tarefa.
  • Um corpo compartilhado (representativo) que processa sequências de tokens independentemente de qual codificador as produziu.
  • Uma alternância de um cronograma de amostragem ponderada da etapa 1 (alinhamento) para a etapa 3 (ajuste de instrução).

Imprima os caminhos roteados para 3 exemplos: perguntas e respostas sobre imagens, texto-para-imagem (T2I), edição de imagens.

Envie

Esta lição produz outputs/skill-decoupled-encoder-picker.md. Dado um produto que deseja geração + compreensão unificadas com qualidade de fronteira, ele escolhe Janus-Pro, JanusFlow ou InternVL-U com uma recomendação concreta de escala de dados.

Exercícios

  1. O Janus-Pro-7B supera o DALL-E 3 no GenEval. Explique por que um modelo aberto de 7B pode se equiparar a um modelo proprietário de fronteira em geração, mas não em compreensão.

  2. Implemente uma função roteadora: dado o texto de um prompt, classifique-o como understand ou generate. Como você lida com prompts ambíguos como "descreva e depois desenhe"?

  3. O JanusFlow substitui o caminho VQ por rectified flow. O que o corpo do transformer passa a produzir como saída e o que muda na perda?

  4. Proponha uma quarta tarefa que a arquitetura do Janus-Pro poderia gerenciar com mais um codificador desacoplado. Exemplos: segmentação de imagens (estilo DINO), profundidade (estilo MiDaS).

  5. Leia a Seção 4.2 do artigo do Janus-Pro sobre escala de dados. Qual etapa de dados contribui mais para o ganho de qualidade em T2I em comparação com o Janus?

Termos-Chave

Termo O que dizem O que realmente significa
Codificação desacoplada "Dois codificadores visuais" Codificador ou tokenizador separado por direção: semântico para compreensão, reconstrução para geração
Corpo compartilhado "Um transformer" Um único transformer processa a saída de qualquer um dos codificadores; sem pesos específicos por modalidade
SigLIP para compreensão "Recursos semânticos" Torre de visão da família CLIP que fornece recursos conceituais ricos, mas reconstrução ruim
VQ para geração "Códigos de reconstrução" Tokens quantizados em vetores que se decodificam de volta em pixels de forma limpa
JanusFlow "Variante com rectified-flow" Janus-Pro com uma cabeça de geração de flow-matching contínuo em vez de VQ
Tag de roteamento "Tag de tarefa" Marcador de prompt (<understand> / <generate>) que seleciona o codificador de entrada

Leituras Adicionais

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