Phase 08 - Lesson 14

Evaluación — FID, CLIP Score, Preferencia Humana

Cada leaderboard de modelos generativos cita FID, CLIP score y una tasa de victorias de una arena de preferencia humana. Cada número tiene un modo de falla que un investigador decidido puede manipular. Si no conoce los modos de falla, no podrá distinguir una mejora real de una ejecución manipulada.

Tipo: Build Idiomas: Python Prerrequisitos: Phase 8 · 01 (Taxonomy), Phase 2 · 04 (Evaluation Metrics) Tiempo: ~45 minutos

El Problema

Un modelo generativo se evalúa en función de la calidad de la muestra y la adherencia al condicionamiento. Ninguna tiene una medida en forma cerrada. Su modelo debe generar 10,000 imágenes; algo tiene que asignarles números; debe confiar en los números a través de familias de modelos, resoluciones y arquitecturas. Tres métricas sobrevivieron a la prueba de fuego de 2014-2026:

  • FID (Fréchet Inception Distance). Una distancia entre dos distribuciones (real y generada) en el espacio de características de una red Inception. Menor es mejor.
  • CLIP score. Similitud de coseno entre el embedding de imagen CLIP de una imagen generada y el embedding de texto CLIP de un prompt. Mayor es mejor. Mide la adherencia al prompt.
  • Preferencia humana. Enfrente a dos modelos cara a cara con el mismo prompt, haga que humanos (o un modelo de la clase de GPT-4) elijan el mejor y agregue los resultados en una puntuación Elo.

También verá: IS (inception score, prácticamente retirado), KID, CMMD, ImageReward, PickScore, HPSv2, MJHQ-30k. Cada una de ellas corrige una falla de la anterior.

El Concepto

FID, CLIP y preferencia: tres ejes, diferentes modos de fallo

FID — calidad de la muestra

Heusel et al. (2017). Pasos:

  1. Extraer características de Inception-v3 (2048-D) para N imágenes reales y N generadas.
  2. Ajustar una Gaussiana a cada grupo: calcular la media μ_r, μ_g y la covarianza Σ_r, Σ_g.
  3. FID = ||μ_r - μ_g||² + Tr(Σ_r + Σ_g - 2 · (Σ_r · Σ_g)^0.5).

Interpretación: Distancia de Fréchet entre dos Gaussianas multivariadas en el espacio de características. Menor = distribuciones más similares.

Modos de falla:

  • Sesgado con un N pequeño. El FID es la media cuadrática sobre la distribución de características; un N pequeño subestima la covarianza, lo que genera un FID falsamente bajo. Utilice siempre N ≥ 10,000.
  • Dependente de Inception. Inception-v3 se entrenó en ImageNet. Los dominios alejados de ImageNet (rostros, arte, imágenes de texto) producen un FID sin sentido. Utilice un extractor de características específico del dominio.
  • Manipulación (Gaming). El sobreajuste (overfitting) al prior de Inception produce un FID bajo sin mejorar la calidad visual. Supérelo con CMMD (abajo).

CLIP score — adherencia al prompt

Radford et al. (2021). Para una imagen generada + prompt:

clip_score = cos_sim( CLIP_image(x_gen), CLIP_text(prompt) )

Promedio a través de 30k imágenes generadas → un escalar comparable entre modelos.

Modos de falla:

  • Puntos ciegos propios de CLIP. CLIP tiene un razonamiento composicional débil ("un cubo rojo sobre una esfera azul" suele fallar). Los modelos pueden obtener una buena puntuación de CLIP sin seguir realmente prompts complejos.
  • Sesgo de prompt corto. Los prompts cortos tienen más coincidencias de CLIP-imagen en el mundo real. Los prompts más largos tienen puntuaciones de CLIP mecánicamente más bajas.
  • Manipulación de prompts (Prompt gaming). Incluir "high quality, 4k, masterpiece" en el prompt infla la puntuación de CLIP sin mejorar la alineación entre imagen y texto.

CMMD (Jayasumana et al., 2024) corrige algunos de estos problemas: utiliza características de CLIP en lugar de Inception, y la discrepancia media máxima (maximum-mean discrepancy) en lugar de Fréchet. Es mejor para detectar diferencias sutiles de calidad.

Preferencia humana — la verdad fundamental (ground truth)

Elija un conjunto de prompts. Genere con el modelo A y el modelo B. Muestre pares a humanos (o a un juez LLM robusto). Agregue las victorias en una puntuación Elo o Bradley-Terry. Benchmarks:

  • PartiPrompts (Google): 1,600 prompts diversos, 12 categorías.
  • HPSv2: 107k anotaciones humanas, ampliamente utilizado como proxy automatizado.
  • ImageReward: 137k pares de preferencia prompt-imagen, bajo términos de la MIT.
  • PickScore: entrenado con 2.6M de preferencias de Pick-a-Pic.
  • Arenas de imágenes al estilo Chatbot Arena: https://imagearena.ai/ y otras.

Modos de falla:

  • Varianza de los evaluadores. Los no expertos tienen preferencias diferentes a las de los expertos. Use ambos.
  • Distribución de prompts. Los prompts seleccionados a dedo (cherry-picked) favorecen a una familia. Documente siempre.
  • Hacking de recompensa del juez LLM. El juez GPT-4 es engañado por salidas atractivas pero incorrectas. Triangule con humanos.

Uso conjunto

Un informe de evaluación de producción debe incluir:

  1. FID en 10-30k muestras contra una distribución real reservada (calidad de la muestra).
  2. CLIP score / CMMD en las mismas muestras frente a sus prompts (adherencia).
  3. Tasa de victorias en una arena ciega frente al modelo anterior (preferencia general).
  4. Análisis de modos de falla: 50 salidas muestreadas al azar, marcadas para problemas conocidos (anatomía de manos, renderizado de texto, conteo consistente de objetos).

Cualquier métrica única es una mentira. Tres métricas corroborativas + revisión cualitativa son una afirmación.

Construcción

code/main.py implementa FID, un equivalente a CLIP-score y agregación Elo en "vectores de características" sintéticos (usamos vectores 4-D como sustitutos de las características de Inception). Verá:

  • Cálculo de FID en un N pequeño y en un N grande: el sesgo.
  • "CLIP score" como similitud de coseno entre conjuntos de características.
  • Regra de actualización de Elo a partir de un flujo de preferencias sintético.

Paso 1: FID en cuatro líneas

def fid(real_features, gen_features):
    mu_r, cov_r = mean_and_cov(real_features)
    mu_g, cov_g = mean_and_cov(gen_features)
    mean_diff = sum((a - b) ** 2 for a, b in zip(mu_r, mu_g))
    trace_term = trace(cov_r) + trace(cov_g) - 2 * sqrt_cov_product(cov_r, cov_g)
    return mean_diff + trace_term

Paso 2: Similitud de coseno al estilo CLIP

def clip_like(image_feat, text_feat):
    dot = sum(a * b for a, b in zip(image_feat, text_feat))
    norm = math.sqrt(dot_self(image_feat) * dot_self(text_feat))
    return dot / max(norm, 1e-8)

Paso 3: Agregación Elo

def elo_update(r_a, r_b, winner, k=32):
    expected_a = 1 / (1 + 10 ** ((r_b - r_a) / 400))
    actual_a = 1.0 if winner == "a" else 0.0
    r_a_new = r_a + k * (actual_a - expected_a)
    r_b_new = r_b - k * (actual_a - expected_a)
    return r_a_new, r_b_new

Errores Comunes

  • FID con N=1000. La heurística no es confiable con menos de N=10k. Los artículos que reportan FID con un N bajo están manipulando los datos.
  • Comparar FID entre resoluciones. El cambio de tamaño a 299×299 de Inception altera la distribución de características. Compare únicamente con la misma resolución.
  • Reportar una sola semilla. Ejecute un mínimo de 3 semillas. Reporte la desviación estándar (std).
  • Inflación de la puntuación de CLIP mediante prompts negativos. Algunos pipelines aumentan el CLIP al sobreajustar el prompt. Verifique si hay saturación visual.
  • Sesgo de Elo por superposición de prompts. Si ambos modelos vieron un prompt de benchmark durante el entrenamiento, el Elo no tiene sentido. Utilice conjuntos de prompts reservados.
  • Sesgo de público pagado en evaluación humana. Los evaluadores de Prolific o MTurk tienden a ser más jóvenes y afines a la tecnología. Combínelos con expertos en arte/diseño reclutados.

Uso Prático

Protocolo de evaluación de producción en 2026:

Pilar Mínimo Recomendado
Calidad de la muestra FID en 10k vs real reservada + CMMD en 5k + FID en subconjunto por categoría
Adherencia al prompt CLIP score en 30k + HPSv2 + ImageReward + respuesta a preguntas estilo VQA
Preferencia 200 pares ciegos vs baseline + 2000 humanos emparejados + juez LLM + Chatbot Arena
Análisis de fallas 50 marcados a mano 500 marcados a mano + clasificador de seguridad automatizado

Los cuatro pilares en un solo informe = una afirmación. Cualquiera de ellos por separado = marketing.

Envíelo

Guarde outputs/skill-eval-report.md. La habilidad recibe un nuevo checkpoint del modelo + línea base (baseline) y genera un plan de evaluación completo: tamaños de muestra, métricas, pruebas de modos de fallo y criterios de aprobación.

Ejercicios

  1. Fácil. Ejecute code/main.py. Compare el FID con N=100 frente a N=1000 en las mismas distribuciones sintéticas. Reporte la magnitud del sesgo.
  2. Medio. Implemente CMMD a partir de características sintéticas al estilo CLIP (consulte Jayasumana et al., 2024 para obtener la fórmula). Compare la sensibilidad a las diferencias de calidad frente al FID.
  3. Difícil. Replique la configuración de HPSv2: tome 1000 pares de imagen-prompt de un subconjunto de Pick-a-Pic, ajuste un evaluador pequeño basado en CLIP en las preferencias y mida su concordancia con un conjunto reservado.

Términos Clave

Término Lo que la gente dice Lo que realmente significa
FID "Fréchet Inception Distance" Distancia de Fréchet de ajustes Gaussianos a características de Inception reales vs generadas.
CLIP score "Similitud texto-imagen" Similitud de coseno entre embeddings de imagen y texto de CLIP.
CMMD "El reemplazo de FID" MMD de características de CLIP; menos sesgado, sin suposición Gaussiana.
IS "Inception score" Exp KL(p(y|x) || p(y)); se correlaciona mal en modelos modernos, retirado.
HPSv2 / ImageReward / PickScore "Proxies de preferencia aprendidos" Modelos pequeños entrenados en preferencias humanas; utilizados como jueces automáticos.
Elo "Calificación de ajedrez" Agregación Bradley-Terry de victorias por pares.
PartiPrompts "El conjunto de prompts de benchmark" 1,600 prompts seleccionados por Google en 12 categorías.
FD-DINO "Reemplazo auto-supervisionado" FD que utiliza características de DINOv2; mejor para dominios fuera de ImageNet.

Nota de producción: la evaluación también es una carga de trabajo de inferencia

Ejecutar FID en 10k muestras significa generar 10k imágenes. Para un SDXL base de 50 pasos a 1024² en una sola GPU L4, eso representa ~11 horas de inferencia de solicitud única. Los presupuestos de evaluación son reales y el enfoque es exactamente el escenario de inferencia offline (maximizar el rendimiento [throughput], ignorar el TTFT):

  • Agrupe al máximo en lotes, olvídese de la latencia. Evaluación offline = agrupamiento estático en lotes (batching) con el tamaño más grande que quepa en memoria. pipe(...).images con num_images_per_prompt=8 en una H100 de 80GB se ejecuta 4-6 veces más rápido en tiempo real que una solicitud única.
  • Guarde en caché las características reales. La extracción de características de Inception (FID) o CLIP (CLIP-score, CMMD) sobre el conjunto de referencia real se ejecuta solamente una vez y se almacena como un .npz. No la recalcule por cada evaluación.

Para compuertas de integración continua (CI) / regresión: ejecute FID + CLIP score en un subconjunto de 500 muestras por PR (~30 min); ejecute el FID de 10k completo + HPSv2 + Elo todas las noches.

Lecturas Adicionales

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