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:

  1. 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.
  2. Perda InfoNCE em Python puro (estabilidade numérica via log-sum-exp).
  3. Perda sigmoide pareada para comparação.
  4. 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

  1. 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.
  2. O SigLIP usa um parâmetro de viés b além da temperatura: S'[i,j] = S[i,j]/tau + b. Qual papel b desempenha 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).
  3. Construa um classificador zero-shot para cães vs gatos. Tente dois templates de prompt: a photo of a {class} e a picture of a {class}. Meça a precisão em 100 imagens de teste. O conjunto (ensemble) de templates supera o template único?
  4. 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.
  5. 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

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