Phase 12 - Lesson 02
CLIP e Pré-treinamento Contrastivo Visão-Linguagem
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
O CLIP da OpenAI (2021) provou que uma única ideia era grande o suficiente para impulsionar os cinco anos seguintes: alinhar um codificador de imagem e um codificador de texto no mesmo espaço vetorial usando apenas pares ruidosos de imagem-legenda da web e uma perda contrastiva. Zero rótulos supervisionados. 400M de pares. O espaço de incorporação resultante faz classificação zero-shot, recuperação de imagem-texto e se conecta a cada VLM de 2026 como sua torre de visão. O SigLIP 2 (2025) substituiu a softmax pela sigmoide e escalou além do CLIP com menor custo. Esta lição percorre a matemática da InfoNCE até a perda sigmoide pareada e constrói a etapa de treinamento em Python stdlib.
Tipo: Build Idiomas: Python (stdlib, implementações de InfoNCE + perda sigmoide) Pré-requisitos: Fase 12 · 01 (ViT patches), Fase 7 (Transformers) Tempo: ~180 minutos
Objetivos de Aprendizado
- Derivar a perda InfoNCE a partir da informação mútua e implementar uma versão vetorizada numericamente estável.
- Explicar por que a perda sigmoide pareada (SigLIP) escala para tamanhos de lote de 32768+ sem o custo adicional de all-gather exigido pela softmax.
- Executar classificação zero-shot no ImageNet construindo templates de texto (
a photo of a {class}) e aplicando o argmax sobre a similaridade de cosseno. - Nomear as quatro alavancas que o pré-treinamento do CLIP / SigLIP oferece: tamanho do lote, temperatura, template de prompt e qualidade dos dados.
O Problema
A visão computacional antes do CLIP era supervisionada. Coletar conjuntos de dados rotulados (ImageNet: 1.2M de imagens, 1000 classes), treinar uma CNN e implantar. Rótulos são caros, enviesam o modelo para aquilo em que os rotuladores conseguem concordar, e não se transferem para novas tarefas sem ajuste fino (finetuning).
A web de imagem-legenda tem mais de um bilhão de pares fracamente rotulados de graça. A foto de um golden retriever com o texto alternativo "my dog Max in the park" carrega um sinal de supervisão — o texto descreve a imagem. A pergunta: você consegue transformar isso em um treinamento útil?
A resposta do CLIP: tratar os pares de imagem-legenda como uma tarefa de correspondência. Dado um lote de N imagens e N legendas, aprender a corresponder cada imagem à sua própria legenda contra N-1 distratores. A supervisão é "essas duas coisas pertencem uma à outra; essas N-1 não." Sem rótulos de classe. Sem anotação humana. Apenas uma perda contrastiva.
O espaço de incorporação resultante faz mais do que o CLIP foi treinado para fazer. O zero-shot no ImageNet funciona porque "a photo of a cat" é incorporada próxima a imagens de gatos que nunca foram explicitamente rotuladas como gatos. Essa é a aposta que deu origem a cada VLM de 2026.
O Conceito
O codificador duplo
O CLIP possui duas torres:
- Codificador de imagem
f: ViT ou ResNet, gera um vetor D-dimensional por imagem. - Codificador de texto
g: um pequeno transformer, gera um vetor D-dimensional por legenda.
Ambas as torres normalizam suas saídas para comprimento unitário. A similaridade é cos(f(x), g(y)) = f(x)^T g(y) já que ambos têm norma unitária.
Para um lote de N pares (imagem, legenda), construa a matriz de similaridade S de formato (N, N):
S[i, j] = cos(f(x_i), g(y_j)) / tau
onde tau é uma temperatura aprendida (o CLIP inicializa em 0.07; aprendida em espaço logarítmico).
Perda InfoNCE
O CLIP usa uma entropia cruzada simétrica sobre linhas e colunas:
loss_i2t = CE(S, labels=identity) # each image's positive is its own caption
loss_t2i = CE(S^T, labels=identity) # each caption's positive is its own image
loss = (loss_i2t + loss_t2i) / 2
Isso é InfoNCE. A softmax na CE força cada imagem a corresponder à sua legenda mais do que a qualquer outra legenda no lote. Os "negativos" são todos os outros itens do lote. Lotes maiores = mais negativos = sinal mais forte. O CLIP foi treinado com lote de 32k; escala importa.
Temperatura
tau controla a nitidez da softmax. Baixo tau → distribuição nítida, efeito de mineração de negativos difíceis. Alto tau → suave, todas as amostras contribuem. O CLIP aprende log(1/tau), cortado (clipped) para evitar colapso. O SigLIP 2 fixa o tau inicial e usa um viés (bias) aprendido em seu lugar.
Por que a sigmoide escala melhor (SigLIP)
A softmax precisa de toda a matriz de similaridade em sincronia. No treinamento distribuído, você deve realizar o all-gather de cada embedding para cada réplica e depois calcular a softmax. Isso é quadrático em relação ao tamanho do cluster (world size) para a comunicação.
O SigLIP substitui a softmax por uma sigmoide elemento a elemento: para cada par (i, j), a perda é uma classificação binária de "este é o par correspondente?". Os rótulos da classe positiva são a diagonal, todo o resto é negativo. A perda é:
L = -1/N sum over (i, j) [ y_ij log sigmoid(S[i,j]) + (1-y_ij) log sigmoid(-S[i,j]) ]
y_ij = 1 se i == j, caso contrário 0. A perda de cada par é independente. Nenhum all-gather é necessário. Cada GPU computa seu bloco local e faz a soma. O SigLIP 2 escala para tamanhos de lote de 32k-512k de forma barata, onde o CLIP precisaria de proporcionalmente mais comunicação.
Classificação zero-shot
Dados N nomes de classes, para cada classe construa um template de texto:
"a photo of a {class}"
Incorpore (embed) cada template com o codificador de texto. Incorpore sua imagem com o codificador de imagem. O argmax da similaridade de cosseno = classe prevista. Nenhum treinamento nas classes-alvo.
Templates de prompt importam. O artigo original do CLIP usou 80 templates por classe (simples, artístico, foto, pintura, etc.) e tirou a média das incorporações. +3 pontos no ImageNet. O uso moderno normalmente escolhe um ou dois templates.
Linear probes e ajuste fino (finetuning)
O zero-shot é uma linha de base (baseline). Um linear probe (treinar uma camada linear no topo dos recursos congelados do CLIP para suas classes-alvo) supera o zero-shot em tarefas dentro do domínio (in-domain). O ajuste fino completo (full finetuning) supera o linear probe dentro do domínio, mas pode prejudicar a transferência zero-shot. Três regimes com três compensações (trade-offs).
SigLIP 2: NaFlex e recursos densos (dense features)
O SigLIP 2 (2025) adiciona:
- NaFlex: um único modelo lida com proporções de tela (aspect ratios) e resoluções variáveis.
- Melhores recursos densos (dense features) para segmentação e estimativa de profundidade, visando o uso como uma espinha dorsal congelada (frozen backbone) em VLMs.
- Multilíngue: treinado em mais de 100 idiomas, enquanto o CLIP era apenas em inglês.
- Escala de 1B de parâmetros, onde o CLIP atingia o limite em 400M.
Nas VLMs abertas de 2026, o SigLIP 2 SO400m/14 é a torre de visão padrão. O CLIP continua sendo o padrão para recuperação pura de imagem-texto onde a distribuição de treinamento específica do LAION-2B corresponde ao seu padrão de consulta (query).
ALIGN, BASIC, OpenCLIP, EVA-CLIP
ALIGN (Google, 2021): mesma ideia do CLIP, escala de 1.8B de pares, 90% ruidosos. Provou que dados ruidosos escalam. OpenCLIP (LAION): reprodução aberta do CLIP no LAION-400M / 2B, múltiplas escalas, o checkpoint aberto de referência. EVA-CLIP: inicializa a partir de modelagem de imagem mascarada (masked image modeling); espinha dorsal forte para VLMs. BASIC: híbrido de CLIP+ALIGN do Google. Todos da mesma família, com dados e ajustes diferentes.
O teto do zero-shot
Modelos da classe do CLIP limitam-se a cerca de 76% de acerto zero-shot no ImageNet (CLIP-G, OpenCLIP-G). Ir além exige dados muito maiores (o SigLIP 2 obtém mais de 80%) ou mudanças na arquitetura (cabeças supervisionadas, mais parâmetros). O benchmark está saturando; o valor real é o espaço de incorporação que as VLMs a jusante (downstream) consomem.
Use
code/main.py implementa:
- Um codificador duplo de brinquedo (recursos de imagem baseados em hash, recursos de caracteres de texto) para que você possa ver o formato InfoNCE sem o numpy.
- Perda InfoNCE em Python puro (estabilidade numérica via log-sum-exp).
- Perda sigmoide pareada para comparação.
- Uma rotina de classificação zero-shot: computar similaridade de cosseno contra um conjunto de prompts de texto, aplicando argmax para a previsão.
Execute-o e observe a curva de perda. Os números absolutos são de brinquedo; o formato corresponde ao que um treinador CLIP real emite.
Envie
Esta lição produz outputs/skill-clip-zero-shot.md. Dado um conjunto de imagens (via caminho) e uma lista de classes-alvo, ela constrói prompts de texto com o template do CLIP, incorpora ambos os lados com um checkpoint declarado (por exemplo, openai/clip-vit-large-patch14) e retorna previsões top-1 / top-5 com pontuações de similaridade. A habilidade (skill) se recusa a fazer afirmações sobre classes que não estejam na lista de prompts.
Exercícios
- Implemente a InfoNCE manualmente para um lote de 4 pares. Construa a matriz de similaridade 4x4, execute a softmax, selecione a diagonal e calcule a entropia cruzada. Verifique sua implementação em Python contra esse cálculo manual.
- O SigLIP usa um parâmetro de viés
balém da temperatura:S'[i,j] = S[i,j]/tau + b. Qual papelbdesempenha quando o lote tem um grande desequilíbrio de classes (muito mais negativos do que positivos por linha)? Leia o SigLIP Seção 3 (arXiv:2303.15343). - Construa um classificador zero-shot para cães vs gatos. Tente dois templates de prompt:
a photo of a {class}ea picture of a {class}. Meça a precisão em 100 imagens de teste. O conjunto (ensemble) de templates supera o template único? - Compute o custo de comunicação da softmax InfoNCE vs sigmoide pareada para uma execução com 512 GPUs e tamanho de lote de 32k. Qual escala como O(N) e qual como O(N^2)? Cite a Seção 4 do SigLIP.
- Leia o artigo de leis de escala do OpenCLIP (arXiv:2212.07143, Cherti et al.). Reproduza a conclusão deles para a escala de dados a partir das figuras: com um tamanho de modelo fixo, qual é a relação log-linear entre a precisão zero-shot no ImageNet e o tamanho dos dados de treinamento?
Termos-Chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| InfoNCE | "Perda contrastiva" | Entropia cruzada sobre a matriz de similaridade de um lote; o positivo de cada item é o seu item emparelhado, os negativos são todo o resto |
| Perda sigmoide (Sigmoid loss) | "Perda SigLIP" | Entropia cruzada binária por par; sem softmax, sem all-gather, escala de forma barata no treinamento distribuído |
| Temperatura | "tau" | Escalar que dimensiona os logits antes da softmax/sigmoide; controla a nitidez da distribuição |
| Zero-shot | "classificação sem ajuste fino" | Usar prompts de texto para construir incorporações de classe e classificar por similaridade de cosseno; sem treinamento nas classes-alvo |
| Template de prompt (Prompt template) | "a photo of a..." | Estrutura de texto em torno do nome de uma classe; afeta a precisão zero-shot em 1 a 5 pontos |
| Codificador duplo (Dual encoder) | "Duas torres" | Um codificador de imagem + um codificador de texto, com saídas em um espaço D-dimensional compartilhado |
| Negativo difícil (Hard negative) | "Distrator difícil" | Um negativo que é similar o suficiente ao positivo para que o modelo tenha que trabalhar para separá-los |
| Linear probe | "Congelado + uma camada" | Treinar apenas um classificador linear no topo de recursos congelados; mede a qualidade dos recursos |
| NaFlex | "Resolução nativa flexível" | Capacidade do SigLIP 2 de ingerir imagens em qualquer proporção e resolução sem redimensionamento |
| Escalonamento de temperatura (Temperature scaling) | "tau parametrizado em log" | O CLIP parametriza log(1/tau) para que os gradientes se comportem bem; limita (clips) para evitar o colapso para um tau próximo a zero |
Leitura Adicional
- Radford et al. — Learning Transferable Visual Models From Natural Language Supervision (arXiv:2103.00020) — o artigo do CLIP.
- Zhai et al. — Sigmoid Loss for Language Image Pre-Training (arXiv:2303.15343) — SigLIP.
- Tschannen et al. — SigLIP 2 (arXiv:2502.14786) — multilíngue + NaFlex.
- Jia et al. — ALIGN (arXiv:2102.05918) — escala com dados ruidosos da web.
- Cherti et al. — Reproducible scaling laws for contrastive language-image learning (arXiv:2212.07143) — leis de escala do OpenCLIP.