Redes Neurais Artificiais e Deep Learning · Insper

CLIP

Um espaço para imagens e texto

Contrastive Language–Image Pre-training (pré-treino contrastivo entre linguagem e imagem)

Comece por um pedido

O seu classificador do ImageNet conhece 1.000 classes. Alguém pede todas as fotos de
"um ônibus vermelho à noite". O que você faz?

  • Junta fotos rotuladas de ônibus vermelhos à noite, cria uma classe, retreina. A cada pedido novo.
  • Ou: codifica a frase, codifica as imagens e devolve as mais próximas. Sem treino.
  • A segunda opção exige uma coisa só: imagens e frases no mesmo espaço vetorial.

A ideia

Pegue 400 milhões de pares (imagem, legenda) da internet.

Treine dois encoders — sem pesos compartilhados — sob uma única instrução:

Coloque uma imagem e a legenda dela perto uma da outra e todo o resto longe.

  • O que sai é uma interface: "o quão perto esta figura está de uma foto de um cachorro?" vira
    um produto escalar.
  • O CLIP não gera nada. Ele fica no módulo de geração porque todo modelo texto-para-imagem depois
    dele precisa de um encoder de texto que saiba como as figuras são.

Treino: uma matriz de similaridade

Como o CLIP é treinado. Um lote de quatro pares de imagem e legenda. As imagens descem pela torre de imagem (encoder de imagem, projeção, norma L2) e viram as linhas de uma matriz de similaridade 4 por 4; as legendas descem pela torre de texto e viram as colunas. A diagonal guarda os pares que casam. À direita, uma entropia cruzada ao longo de cada linha, outra ao longo de cada coluna e a perda, a média das duas. torre de imagem torre de texto um par que casa UM LOTE DE N = 4 PARES imagem 1 · “um cachorro na grama” imagem 2 · “um ônibus vermelho à noite” imagem 3 · “dois gatos num sofá” imagem 4 · “um navio no mar” imagem 3 × 224 × 224 pixels Encoder de imagem ViT-B/32 · [CLS] de largura 768 Projeção + norma L2 768 → 512 · linha unitária Ii legenda até 77 tokens Encoder de texto Transformer · largura 512 Projeção + norma L2 512 → 512 · linha unitária Tj T1 T2 T3 T4 I1 I2 I3 I4 linhas: imagem → texto softmax(S / τ), certa: coluna i colunas: texto → imagem softmax(S / τ), certa: linha j ℒ = ½ (ℒI→T + ℒT→I) duas entropias cruzadas

As duas torres, ViT-B/32

passo lado da imagem lado do texto
entrada ids de token (no máximo)
encoder ViT: patches + [CLS], largura 768 Transformer, largura 512
agregado [CLS]: fim de texto:
projeção , sem viés , sem viés
norma L2 : :
similaridade : cossenos

87,5 M parâmetros para imagens, 63,2 M para texto (contados no laboratório). As torres não compartilham nenhum peso: só se encontram na perda.

: pares no lote · B/32: o ViT Base (12 camadas, largura 768) com patches de 32 × 32 · [CLS]: um token extra cuja saída resume a imagem · fim de texto: o último token da legenda, que faz o mesmo papel · 77: o contexto máximo da torre de texto.

O que a perda não pede

Ela nunca reconstrói, gera ou rotula: só distingue pares que casam de pares que não casam. O artigo mediu as alternativas, até a mesma acurácia zero-shot no ImageNet:

objetivo velocidade relativa
Transformer que prevê a legenda palavra por palavra 1×
prever quais palavras aparecem (saco de palavras) 3×
contrastivo: qual legenda vai com qual imagem 12× (4× o saco de palavras)

Discriminar é um objetivo muito mais barato que gerar — e quase tão informativo.

zero-shot: classificar sem nenhum exemplo de treino da tarefa, só a partir dos nomes das classes escritos como frases (slide 17).

A perda

, : os embeddings normalizados, ; a linha de cada um vem do par .

  • A linha de é uma classificação entre classes: qual legenda pertence à imagem ? A resposta é .
  • As colunas fazem a pergunta inversa: qual imagem pertence à legenda ?
  • InfoNCE simétrica: uma entropia cruzada de softmax cujos rótulos são arange(N).

: a dimensão do espaço comum (512 no ViT-B/32) · : a temperatura · CE(logits, diag): entropia cruzada em que a resposta certa da linha é a coluna · arange(N) .

À mão: normalizar, depois comparar

. Normas das linhas de : ; ; — não 1.

  • Divida cada linha pela sua norma. Como a matriz de imagens aqui é igual à identidade, : a coluna é a legenda normalizada, p.ex. .

  • A diagonal vence toda linha e toda coluna: as seis buscas estão certas.

À mão: as duas direções

Divida por (p.ex. ) para obter os logits (os valores que entram no softmax) e aplique o softmax nas duas direções:

direção da resposta certa, por par perda
linhas (imagem → texto) · ·
colunas (texto → imagem) · ·
  • Linha 2: .
  • Coluna 3: a legenda 3 tem cosseno com a imagem 2, então .
  • Não é o mesmo número — por isso a perda tira a média: .

Os mesmos embeddings,

Nada se move: mesmos vetores, mesmos cossenos. Só o vai de para .
O que acontece com a perda? E com a acurácia?

  • Os logits agora são o próprio e o softmax fica quase plano: a linha 2, , vira ; ; .
  • (as duas direções dão e ), mais da metade do (log natural) que um chute cego paga, dando a cada legenda.
  • O ranking — e portanto a acurácia — é idêntico: 3 de 3.

A temperatura decide o quanto a perda insiste, não o que o modelo sabe.

Simulador · o código da perda, linha a linha

I_cru · imagens
T_cru · legendas

Simulador · a matriz de similaridade do lote

A temperatura é aprendida

  • Guardada como , começa em e é limitada para que .
  • Os modelos publicados terminam no limite: , . O treino continuou pedindo um softmax mais afiado.

No laboratório, uma imagem do CIFAR-10 por classe com a photo of a {class}.:

1 0,07 0,01 0,003
perda 2,2468 1,5728 0,2698 0,4019

Em todo : 100 % imagem → texto (10 de 10), 90 % texto → imagem (9 de 10). Abaixo de 0,01 a perda volta a subir — a legenda cuja melhor imagem é a errada custa mais quanto mais afiado o softmax.

Um chute cego entre 10 legendas paga log 10 = 2,30.

O tamanho do lote faz parte do objetivo

Mesmo modelo, mesma temperatura. O lote cresce de 2 para 100 pares. O que acontece com a perda e com a acurácia?

2 10 20 50 100
0,69 2,30 3,00 3,91 4,61
perda ? ? ? ? ?
acurácia ? ? ? ? ?

Imagens de teste do CIFAR-100, uma por classe, com a photo of a {class}. · : o que paga um chute cego, que dá a cada legenda · acurácia: fração das imagens cuja legenda mais próxima, entre as do lote, é a certa.

O tamanho do lote · resposta

2 10 20 50 100
0,69 2,30 3,00 3,91 4,61
perda 0,071 0,469 0,733 1,183 1,592
acurácia 0,978 0,868 0,807 0,710 0,636
acaso, 0,50 0,10 0,05 0,02 0,01
  • Nada no modelo mudou: os mesmos embeddings enfrentam mais concorrentes. A perda sobe e a acurácia cai.
  • Cada uma das outras legendas é um negativo: um lote maior é uma prova mais difícil. O CLIP treinou com : 32.767 negativos por imagem.

SigLIP: uma sigmoide por par

  • Cada uma das células é um "casa ou não?" independente — sem softmax sobre o lote.
  • O viés começa em : de cada células são negativos. Com , o modelo começa dizendo "não casa" para tudo.
  • Sem normalização sobre o lote: lotes pequenos funcionam e não é preciso all-gather. Claramente melhor em lotes pequenos, tão bom quanto nos grandes.

na diagonal (), fora dela · : escala aprendida (faz o papel de ; é um escalar, não a matriz ) · : a sigmoide, · : viés aprendido · : o cosseno da célula · all-gather: juntar os embeddings de todos os aceleradores, que o softmax sobre o lote exige.

A maioria dos VLMs abertos recentes (modelos de visão-linguagem: modelos de linguagem que também leem imagens), como o PaliGemma, o Idefics2 e 3 e o Gemma 3, usa um encoder de imagem da família SigLIP. Escolhendo uma torre de imagem hoje? Comece por ela.

Classificação zero-shot

Classificação zero-shot com o CLIP. Em cima, cada nome de classe vira um prompt, passa pela torre de texto e vira uma linha de uma matriz W, C por d. Embaixo, a imagem passa pela torre de imagem e vira um vetor unitário x. Os logits são W x dividido por tau; a classe com o maior é a previsão. O conjunto é uma camada linear sem viés cujos pesos foram digitados. C NOMES DE CLASSE catdogship · … UM PROMPT POR CLASSE “a photo of a cat.”“a photo of a dog.”“a photo of a ship.” … Torre de texto encoder · proj. · L2 W · C × d wcat wdog wship imagem a que vamos classificar Torre de imagem encoder · projeção · L2 x · d = 512 logits = W x / τ cosseno × 100 cat0,26 → 26 dog0,22 → 22 ship0,19 → 19 ŷ = cat argmax dos logits A MESMA COISA, COMO CAMADA nn.Linear(512, C, bias=False) peso = W: digitado, não treinado

É uma camada linear cujos pesos você digitou

Empilhe os embeddings normalizados dos prompts (um por classe) em ; é o embedding normalizado da imagem:

  • Isso é uma nn.Linear(512, C, bias=False) (entram , saem classes) com como peso. Zero parâmetros treinados.
  • Uma décima primeira classe? Escreva uma décima primeira frase.
  • Laboratório, 1.000 imagens de teste do CIFAR-10 (100 por classe, 32 × 32 ampliadas para 224 × 224): 0,895 de acurácia. Erro mais frequente: deer → horse (17 dos 100 cervos).

"Zero-shot" promete mais do que parece

O CLIP viu 400 milhões de imagens legendadas. Objetos comuns foram descritos ali muitas vezes.
Isto está mais perto de uma busca num conjunto de treino enorme com índice em linguagem natural
que de aprender do nada.

  • O que é novo: o conjunto de classes é definido na inferência, em linguagem, por quem estiver digitando.
  • Quanto vale uma frase? Uma sonda linear (linear probe: regressão logística treinada sobre os embeddings do CLIP de imagens rotuladas de treino por classe) precisa de 8 a 16 por classe para alcançar os 0,895 (laboratório: 0,602 com 1, 0,832 com 4, 0,911 com 16).

A redação do prompt

Mesmo modelo, mesmas 1.000 imagens, nenhum treino: só a frase de cada classe muda. Ordene do pior para o melhor.

prompt acurácia no CIFAR-10
{} (nome da classe sozinho) ?
a photo of a {}. ?
a blurry photo of a {}. ?
a photo of a {}, a type of flower. ?
média de 18 templates ?

{} recebe o nome da classe (cat, ship…) · as imagens do CIFAR são borradas a 224 px · média: o embedding médio das 18 frases que os autores do CLIP escreveram para o CIFAR-10.

A redação do prompt · resposta

prompt acurácia no CIFAR-10 contra o nome sozinho
{} (nome da classe sozinho) 0,874 —
a photo of a {}. 0,895 +0,021
a blurry photo of a {}. 0,894 +0,020
a photo of a {}, a type of flower. 0,893 +0,019
média de 18 templates 0,916 +0,042
  • O CLIP viu legendas, não rótulos: uma palavra solta é uma legenda incomum.
  • O contexto errado quase não custa: as mesmas palavras em toda classe se cancelam no argmax.

ImageNet, no artigo: +1,3 ponto para "a photo of a {}." e mais +3,5 para 80 templates. Um remendo, não uma propriedade.

Busca: o mesmo produto escalar, lido ao contrário

Texto → imagem

  • Ordene 1.000 imagens do CIFAR-10 para a photo of a {class}.
  • Precisão@10 (fração das 10 primeiras que são da classe), média das 10 classes: 0,96
  • Texto livre também funciona: a red car, a ship on the open sea.

Imagem → texto

  • Ordene as 100 legendas do CIFAR-100 (uma por classe) para cada uma de 500 imagens.
  • Recall@1 (a certa vem em primeiro): 0,634
  • Recall@5 (a certa está entre as 5 primeiras): 0,866

Um produto escalar por candidato: é assim que funcionam a busca com CLIP, o CLIPScore e a filtragem de conjuntos de dados.

A geometria: um gap entre modalidades

No laboratório, um gato e a photo of a cat. têm cosseno 0,21 — e é um par correto. Qual é o cosseno entre duas imagens ao acaso?

  • Duas imagens ao acaso: 0,755. Duas legendas ao acaso: 0,671 (médias sobre todos os pares, quase todos sem relação).
  • Uma imagem e o seu prompt: 0,258; os prompts errados: 0,201 (média sobre as 1.000 imagens do CIFAR-10).
  • "Imagem ou texto?" — uma regressão logística acerta 100 %.

As imagens ficam num cone da esfera e os textos em outro (Liang et al., 2022).

O gap entre modalidades, desenhado

O gap entre modalidades, esboçado em duas dimensões. Oito imagens, em roxo, ficam num cone estreito da esfera unitária e as oito legendas, em verde, em outro; uma imagem fica mais perto das outras imagens que da sua própria legenda. Com o botão, a média de cada modalidade é subtraída e os vetores são normalizados de novo: os dois grupos se espalham pela esfera e cada imagem cai ao lado da sua legenda. imagens legendas

Por que o gap não quebra o zero-shot

  • O argmax compara uma imagem com vários textos: um deslocamento comum a todos os textos se cancela.
  • Laboratório: subtraindo de cada modalidade a sua média (e normalizando de novo), o zero-shot só vai de 0,895 para 0,913.
  • O que muda é a escala: par certo 0,258 → 0,241, pares errados 0,201 → −0,016.

Ele importa quando imagens e textos dividem um mesmo índice: uma imagem costuma ficar mais perto
de outras imagens que de qualquer legenda. E é por isso que similaridades "boas" do CLIP são números
pequenos (0,2–0,35).

Um saco de palavras

legenda A legenda B cosseno
a dog chasing a cat a cat chasing a dog 0,992
a cup on top of a book a book on top of a cup 0,976
a red cube and a blue sphere a blue cube and a red sphere 0,974
one cat three cats 0,884
a dog chasing a cat dog a cat a chasing 0,893
a dog chasing a cat a photo of an airplane 0,692

O embedding sabe quais palavras estão lá muito melhor do que como elas estão arranjadas. Um modelo de frase embaralhado, photo a {} of a., ainda classifica com 0,896 (contra 0,895 do original).

As limitações honestas

  • Contagem e relações espaciais: "três gatos" ≈ "um gato"; o artigo lista a contagem entre as suas tarefas fracas.
  • Composição: qual objeto tem qual atributo, quem fez o quê a quem (Yuksekgonul et al., 2023).
  • Sensibilidade ao prompt: a redação move a acurácia em pontos.
  • As associações da internet: falhas documentadas em raça, gênero e ocupação — herdadas por todo modelo condicionado ao CLIP.

Onde o CLIP fica neste curso

uso o que o CLIP fornece
condicionar a difusão o SD faz atenção cruzada com embeddings de texto do CLIP; SD3 e FLUX acrescentam o T5 para prompts longos e composicionais
a torre de imagem de um VLM hoje, em geral, da família SigLIP
busca um produto escalar por candidato
avaliação CLIPScore — cego à ordem das palavras, como o CLIP
curadoria de dados o LAION foi filtrado por similaridade do CLIP

O CLIP é a ponte: da próxima aula em diante, todo gerador é condicionado a uma frase.

SD: Stable Diffusion (próxima aula) · SD3, FLUX: modelos texto-para-imagem posteriores · T5: o encoder do Transformer texto-para-texto do Google · VLM: modelo de linguagem que também lê imagens · CLIPScore: o cosseno do CLIP entre uma imagem gerada e o seu prompt, reescalado · LAION: conjunto aberto de bilhões de pares imagem–texto da web.

A lição que sobreviveu à arquitetura

  • O DataComp, um benchmark construído sobre o código do OpenCLIP, manteve arquitetura e custo computacional fixos e variou só os dados.
  • Uma fração filtrada de um conjunto bateu o conjunto inteiro.
  • O melhor conjunto filtrado do DataComp treinou um ViT-L/14 (o ViT Large, com patches de 14 × 14) que superou o da própria OpenAI, com o mesmo custo.

Nesta escala, construir o conjunto de dados é a arquitetura do modelo.

Laboratório · um espaço, medido

Notebook no Colab, atividade de ~2 h (poucos minutos de computação numa GPU T4 gratuita, 10 a 20 min em CPU), openai/clip-vit-base-patch32 no CIFAR-10 e no CIFAR-100. Cada seção termina num checkpoint.

  1. as duas torres: formatos e larguras
  2. a perda contrastiva à mão, contra a do modelo
  3. a temperatura
  4. o tamanho do lote como parte do objetivo
  5. zero-shot como camada linear
  1. templates de prompt
  2. busca nas duas direções
  3. a geometria: gap entre modalidades, saco de palavras
  4. zero-shot contra poucos exemplos — e os seus prompts, avaliados em imagens novas

abrir no Colab →

Para levar

  1. Dois encoders, um espaço: uma interface entre visão e linguagem, não um gerador.
  2. A perda é contrastiva e simétrica, : a diagonal está certa, nas duas direções.
  3. A temperatura muda a perda, não o ranking. O tamanho do lote decide o quão difícil é a prova.
  4. SigLIP: uma sigmoide por par, sem softmax sobre o lote. A torre de imagem a escolher hoje.
  5. Zero-shot = uma camada linear cujos pesos são frases; a redação importa.
  6. Um gap entre modalidades e um saco de palavras: o que a perda nunca pediu.
  7. A curadoria de dados importou mais que a arquitetura.

Roteiro: (1) a ideia e as duas torres; (2) a perda contrastiva, à mão; (3) as suas duas decisões de projeto (temperatura e tamanho do lote) e o SigLIP; (4) classificação zero-shot e prompts; (5) a geometria do espaço e as limitações; (6) onde o CLIP fica no curso. Fecha com o laboratório no Colab.

Deixe a turma responder primeiro. O ponto: um conjunto fixo de rótulos é decidido no treino; com o CLIP o conjunto de classes é decidido por quem estiver digitando.

Avance passo a passo: o lote, as duas torres, as projeções para um espaço só, a matriz e os dois sentidos da perda. Passe o mouse numa caixa para ver as suas setas. Roxo é o lado da imagem, verde o do texto; as células laranja são os pares que casam.

As projeções são a única razão de o produto escalar estar definido: as torres nem têm a mesma largura. Depois da normalização, produto escalar = cosseno.

Comece no caso "o exemplo da página": os números são os dos três slides anteriores. Avance linha a linha. Depois: τ = 1 (perda 0,626, mesma acurácia), "um negativo difícil" (a acurácia texto → imagem cai para 2/3; imagem → texto continua 3/3) e "chute cego" (perda = log 3).

Comece com N = 16, tau = 0,07. Arraste o tau até 1: a perda salta, a acurácia não se move. Depois lote de 4 → 64 com tau fixo: o mesmo tipo de embedding, uma prova mais difícil. Por fim troque o objetivo para SigLIP.

Por que tão pequena: os cossenos das legendas certas e erradas diferem por alguns centésimos; só um 1/tau grande transforma isso num softmax confiante.

Laboratório, seção 4: imagens de teste do CIFAR-100, uma por classe, 200 lotes sorteados por N, mesmo modelo e mesmo tau. Com N = 32.768 a matriz de similaridade teve de ser espalhada por centenas de aceleradores.

Avance passo a passo: os prompts viram os pesos W, a imagem vira x e a previsão é o argmax de W x / τ. Os cossenos têm o tamanho que o laboratório mede.

Aperte o botão: subtrair a média de cada modalidade abre os dois cones e cada imagem cai ao lado da sua legenda. Os números são os do laboratório.