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 — calidad de la muestra
Heusel et al. (2017). Pasos:
- Extraer características de Inception-v3 (2048-D) para N imágenes reales y N generadas.
- Ajustar una Gaussiana a cada grupo: calcular la media
μ_r, μ_gy la covarianzaΣ_r, Σ_g. - 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:
- FID en 10-30k muestras contra una distribución real reservada (calidad de la muestra).
- CLIP score / CMMD en las mismas muestras frente a sus prompts (adherencia).
- Tasa de victorias en una arena ciega frente al modelo anterior (preferencia general).
- 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
- 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. - 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.
- 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(...).imagesconnum_images_per_prompt=8en 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
- Heusel et al. (2017). GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium (FID) — artículo de FID.
- Jayasumana et al. (2024). Rethinking FID: Towards a Better Evaluation Metric for Image Generation (CMMD) — CMMD.
- Radford et al. (2021). Learning Transferable Visual Models from Natural Language Supervision (CLIP) — CLIP.
- Wu et al. (2023). HPSv2: A Comprehensive Human Preference Score — HPSv2.
- Xu et al. (2023). ImageReward: Learning and Evaluating Human Preferences for Text-to-Image Generation — ImageReward.
- Yu et al. (2023). Scaling Autoregressive Models for Content-Rich Text-to-Image Generation (Parti + PartiPrompts) — PartiPrompts.
- Stein et al. (2023). Exposing flaws of generative model evaluation metrics — estudio de modos de fallo.