Phase 12 - Lesson 02

CLIP y Preentrenamiento Contrastivo Visión-Lenguaje

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

CLIP de OpenAI (2021) demostró que una sola idea era lo suficientemente grande como para impulsar los siguientes cinco años: alinear un codificador de imágenes y un codificador de texto en el mismo espacio vectorial utilizando únicamente pares ruidosos de imagen-leyenda de la web y una pérdida contrastiva. Cero etiquetas supervisadas. 400M de pares. El espacio de incrustación resultante realiza clasificación zero-shot, recuperación de imagen-texto y se conecta a cada VLM de 2026 como su torre de visión. SigLIP 2 (2025) reemplazó softmax con sigmoide y escaló más allá de CLIP a un costo menor. Esta lección recorre las matemáticas desde InfoNCE hasta la pérdida sigmoide por pares y construye el paso de entrenamiento en Python stdlib.

Tipo: Build Idiomas: Python (stdlib, implementaciones de InfoNCE + pérdida sigmoide) Prerrequisitos: Fase 12 · 01 (ViT patches), Fase 7 (Transformers) Tiempo: ~180 minutos

Objetivos de Aprendizaje

  • Derivar la pérdida InfoNCE a partir de la información mutua e implementar una versión vectorizada numéricamente estable.
  • Explicar por qué la pérdida sigmoide por pares (SigLIP) escala a lotes de 32768+ sin la sobrecarga de all-gather que exige softmax.
  • Ejecutar clasificación zero-shot en ImageNet construyendo plantillas de texto (a photo of a {class}) y aplicando el argmax sobre la similitud de coseno.
  • Nombrar las cuatro palancas que ofrece el preentrenamiento de CLIP / SigLIP: tamaño de lote, temperatura, plantilla de prompt y calidad de datos.

El Problema

La visión computacional previa a CLIP era supervisada. Recopilar conjuntos de datos etiquetados (ImageNet: 1.2M de imágenes, 1000 clases), entrenar una CNN y distribuirla. Las etiquetas son costosas, sesgan el modelo hacia lo que los etiquetadores pueden acordar y no se transfieren a nuevas tareas sin un ajuste fino (finetuning).

La web de imagen-leyenda tiene más de mil millones de pares vagamente etiquetados de forma gratuita. La foto de un golden retriever con el texto alternativo "my dog Max in the park" lleva una señal de supervisión: el texto describe la imagen. La pregunta es: ¿se puede transformar esto en un entrenamiento útil?

La respuesta de CLIP: tratar los pares de imagen-leyenda como una tarea de emparejamiento. Dado un lote de N imágenes y N leyendas, aprender a emparejar cada imagen con su propia leyenda frente a N-1 distractores. La supervisión es "estas dos cosas van juntas; estas N-1 no". Sin etiquetas de clase. Sin anotación humana. Solo una pérdida contrastiva.

El espacio de incrustación (embedding) resultante hace más de aquello para lo que CLIP fue entrenado. El zero-shot en ImageNet funciona porque "a photo of a cat" se incrusta cerca de imágenes de gatos que nunca fueron etiquetados explitamente como gatos. Esta es la apuesta que dio origen a cada VLM de 2026.

El Concepto

El codificador dual

CLIP tiene dos torres:

  • Codificador de imágenes f: ViT o ResNet, genera un vector D-dimensional por imagen.
  • Codificador de texto g: un transformer pequeño, genera un vector D-dimensional por leyenda.

Ambas torres normalizan sus salidas a longitud unitaria. La similitud es cos(f(x), g(y)) = f(x)^T g(y) ya que ambos tienen norma unitaria.

Para un lote de N pares (imagen, leyenda), construya la matriz de similitud S de dimensiones (N, N):

S[i, j] = cos(f(x_i), g(y_j)) / tau

donde tau es una temperatura aprendida (CLIP inicializa en 0.07; se aprende en espacio logarítmico).

Pérdida InfoNCE

CLIP utiliza una entropía cruzada simétrica sobre filas y columnas:

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

Esto es InfoNCE. La softmax en la CE obliga a cada imagen a coincidir con su leyenda más que con cualquier otra leyenda del lote. Los "negativos" son todos los demás elementos del lote. Lotes más grandes = más negativos = señal más fuerte. CLIP se entrenó con un tamaño de lote de 32k; la escala importa.

Temperatura

tau controla la nitidez de la softmax. Un tau bajo → distribución nítida, efecto de minería de negativos difíciles. Un tau alto → suave, todas las muestras contribuyen. CLIP aprende log(1/tau), recortado (clipped) para evitar el colapso. SigLIP 2 fija el tau inicial y utiliza en su lugar un sesgo (bias) aprendido.

Por que la sigmoide escala mejor (SigLIP)

Softmax necesita toda la matriz de similitud sincronizada. En el entrenamiento distribuído, se debe realizar all-gather de cada incrustación (embedding) a cada réplica, y luego calcular la softmax. Esto es cuadrático respecto al tamaño del cluster (world size) para la comunicación.

SigLIP reemplaza softmax con una sigmoide elemento a elemento: para cada par (i, j), la pérdida es una clasificación binaria de "¿es este el par correspondiente?". Las etiquetas de clase positiva son la diagonal, todo lo demás es negativo. La pérdida es:

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 si i == j, de lo contrario 0. La pérdida de cada par es independiente. No se necesita all-gather. Cada GPU calcula su bloque local y realiza la suma. SigLIP 2 escala a lotes de 32k-512k de forma económica, mientras que CLIP requeriría proporcionalmente más comunicación.

Clasificación zero-shot

Dados N nombres de clase, para cada clase construya una plantilla de texto:

"a photo of a {class}"

Incruste (embed) cada plantilla con el codificador de texto. Incruste su imagen con el codificador de imágenes. El argmax de la similitud de coseno = clase predicha. Sin entrenamiento en las clases objetivo.

Plantillas de prompt importan. El artículo original de CLIP utilizó 80 plantillas por clase (simple, artística, foto, pintura, etc.) y promedió las incrustaciones. +3 puntos en ImageNet. El uso moderno normalmente elige una o dos plantillas.

Linear probes y ajuste fino (finetuning)

El zero-shot es una línea de base (baseline). Un linear probe (entrenar una capa lineal sobre las características congeladas de CLIP para sus clases objetivo) supera al zero-shot en tareas dentro del dominio (in-domain). El ajuste fino completo (full finetuning) supera al linear probe dentro del dominio, pero puede perjudicar la transferencia zero-shot. Tres regímenes con tres compensaciones (trade-offs).

SigLIP 2: NaFlex y características densas (dense features)

SigLIP 2 (2025) agrega:

  • NaFlex: un solo modelo maneja relaciones de aspecto (aspect ratios) y resoluciones variables.
  • Mejores características densas (dense features) para segmentación y estimación de profundidad, orientadas al uso como una espina dorsal congelada (frozen backbone) en VLMs.
  • Multilingüe: entrenado en más de 100 idiomas, mientras que CLIP era solo en inglés.
  • Escala de 1B de parámetros, donde CLIP alcanzaba su límite en 400M.

En las VLMs abiertas de 2026, SigLIP 2 SO400m/14 es la torre de visión predeterminada. CLIP sigue siendo el predeterminado para la recuperación pura de imagen-texto donde la distribución de entrenamiento específica de LAION-2B coincide con su patrón de consulta (query).

ALIGN, BASIC, OpenCLIP, EVA-CLIP

ALIGN (Google, 2021): misma idea que CLIP, escala de 1.8B de pares, 90% ruidosos. Demostró que los datos ruidosos escalan. OpenCLIP (LAION): reproducción abierta de CLIP en LAION-400M / 2B, múltiples escalas, el checkpoint abierto de referencia. EVA-CLIP: inicializa a partir de modelamiento de imágenes enmascaradas (masked image modeling); espina dorsal fuerte para VLMs. BASIC: híbrido de CLIP+ALIGN de Google. Todos pertenecen a la misma familia, con diferentes datos y ajustes.

El techo de zero-shot

Los modelos de la clase CLIP tienen un tope de al rededor del 76% de acierto zero-shot en ImageNet (CLIP-G, OpenCLIP-G). Ir más allá requiere datos mucho más grandes (SigLIP 2 obtiene más del 80%) o cambios en la arquitectura (cabezales supervisados, más parámetros). El benchmark se está saturando; el valor real es el espacio de incrustación que consumen las VLMs a nivel descendente (downstream).

Uso

code/main.py implementa:

  1. Un codificador dual de juguete (características de imagen basadas en hash, características de caracteres de texto) para que pueda ver el formato InfoNCE sin numpy.
  2. Pérdida InfoNCE en Python puro (estabilidad numérica mediante log-sum-exp).
  3. Pérdida sigmoide por pares para comparación.
  4. Una rutina de clasificación zero-shot: calcular la similitud de coseno frente a un conjunto de prompts de texto, aplicando argmax para la predicción.

Ejecútelo y observe la curva de pérdida. Los números absolutos son de juguete; la forma coincide con la que emite un entrenador CLIP real.

Envío

Esta lección produce outputs/skill-clip-zero-shot.md. Dado un conjunto de imágenes (a través de una ruta) y una lista de clases objetivo, construye prompts de texto con la plantilla de CLIP, incrusta ambos lados con un checkpoint determinado (por ejemplo, openai/clip-vit-large-patch14) y devuelve predicciones top-1 / top-5 con puntuaciones de similitud. La habilidad (skill) se rehúsa a realizar afirmaciones sobre clases que no estén en la lista de prompts.

Ejercicios

  1. Implemente InfoNCE manualmente para un lote de 4 pares. Construya la matriz de similitud de 4x4, ejecute softmax, seleccione la diagonal y calcule la entropía cruzada. Verifique su implementación de Python con este cálculo manual.
  2. SigLIP utiliza un parámetro de sesgo b además de la temperatura: S'[i,j] = S[i,j]/tau + b. ¿Qué papel juega b cuando el lote tiene un gran desequilibrio de clases (muchos más negativos que positivos por fila)? Lea la Sección 3 de SigLIP (arXiv:2303.15343).
  3. Construya un clasificador zero-shot para gatos vs perros. Pruebe dos plantillas de prompt: a photo of a {class} y a picture of a {class}. Mida la precisión en 100 imágenes de prueba. ¿El conjunto (ensemble) de plantillas supera a la plantilla única?
  4. Calcule el costo de comunicación de softmax InfoNCE vs sigmoide por pares para una ejecución de 512 GPUs a un tamaño de lote de 32k. ¿Cuál escala como O(N) y cuál como O(N^2)? Cite la Sección 4 de SigLIP.
  5. Lea el artículo de leyes de escala de OpenCLIP (arXiv:2212.07143, Cherti et al.). Reproduzca la conclusión de ellos para la escala de datos a partir de las figuras: a un tamaño de modelo fijo, ¿cuál es la relación log-lineal entre la precisión zero-shot en ImageNet y el tamaño de los datos de entrenamiento?

Términos Clave

Término Lo que la gente dice Lo que realmente significa
InfoNCE "Pérdida contrastiva" Entropía cruzada sobre la matriz de similitud de un lote; el positivo de cada elemento es su elemento emparejado, los negativos son todo lo demás
Pérdida sigmoide (Sigmoid loss) "Pérdida SigLIP" Entropía cruzada binaria por par; sin softmax, sin all-gather, escala económicamente en el entrenamiento distribuido
Temperatura "tau" Escalar que escala los logits antes de softmax/sigmoide; controla la nitidez de la distribución
Zero-shot "clasificación sin ajuste fino" Usar prompts de texto para construir incrustaciones de clase y clasificar por similitud de coseno; sin entrenamiento en las clases objetivo
Plantilla de prompt (Prompt template) "a photo of a..." Estructura de texto alrededor del nombre de una clase; afecta la precisión zero-shot de 1 a 5 puntos
Codificador dual (Dual encoder) "Dos torres" Un codificador de imágenes + un codificador de texto, con saídas en un espacio D-dimensional compartido
Negativo difícil (Hard negative) "Distrator difícil" Un negativo que es lo suficientemente similar al positivo como para que el modelo tenga que esforzarse para separarlos
Linear probe "Congelado + una capa" Entrenar únicamente un clasificador lineal sobre características congeladas; mide la calidad de las características
NaFlex "Resolución flexible nativa" Capacidad de SigLIP 2 para ingerir imágenes con cualquier relación de aspecto y resolución sin cambiar su tamaño
Escalamiento de temperatura (Temperature scaling) "tau parametrizado en log" CLIP parametriza log(1/tau) para que los gradientes se comporten correctamente; limita (clips) para evitar el colapso a un tau cercano a cero

Lectura Adicional

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