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
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.
Implemente uma função roteadora: dado o texto de um prompt, classifique-o como
understandougenerate. Como você lida com prompts ambíguos como "descreva e depois desenhe"?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?
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).
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 |