Phase 08 - Lesson 14

Avaliação — FID, CLIP Score, Preferência Humana

Cada leaderboard de modelo generativo cita o FID, o CLIP score e uma taxa de vitória de uma arena de preferência humana. Cada número tem um modo de falha que um pesquisador determinado pode manipular. Se você não conhece os modos de falha, não conseguirá distinguir uma melhoria real de uma manipulação de métricas.

Tipo: Build Linguagens: Python Pré-requisitos: Phase 8 · 01 (Taxonomy), Phase 2 · 04 (Evaluation Metrics) Tempo: ~45 minutos

O Problema

Um modelo generativo é julgado pela qualidade da amostra e pela aderência ao condicionamento. Nenhum dos dois possui uma medida em forma fechada. Seu modelo precisa renderizar 10.000 imagens; algo precisa atribuir números a elas; você precisa confiar nos números entre famílias de modelos, resoluções e arquiteturas diferentes. Três métricas sobreviveram à prova de fogo de 2014-2026:

  • FID (Fréchet Inception Distance). Uma distância entre duas distribuições — real e gerada — no espaço de características de uma rede Inception. Quanto menor, melhor.
  • CLIP score. Similaridade de cosseno entre o embedding de imagem do CLIP de uma imagem gerada e o embedding de texto do CLIP de um prompt. Quanto maior, melhor. Mede a aderência ao prompt.
  • Preferência humana. Coloque dois modelos frente a frente no mesmo prompt, faça com que humanos (ou um modelo da classe do GPT-4) escolham o melhor e agregue os resultados em uma pontuação Elo.

Você também verá: IS (inception score, amplamente aposentado), KID, CMMD, ImageReward, PickScore, HPSv2, MJHQ-30k. Cada uma delas corrige uma falha da anterior.

O Conceito

FID, CLIP e preferência: três eixos, diferentes modos de falha

FID — qualidade da amostra

Heusel et al. (2017). Passos:

  1. Extrair características do Inception-v3 (2048-D) para N imagens reais e N geradas.
  2. Ajustar uma Gaussiana a cada conjunto: calcular a média μ_r, μ_g e a covariância Σ_r, Σ_g.
  3. FID = ||μ_r - μ_g||² + Tr(Σ_r + Σ_g - 2 · (Σ_r · Σ_g)^0.5).

Interpretação: Distância de Fréchet entre duas Gaussianas multivariadas no espaço de características. Menor = distribuições mais semelhantes.

Modos de falha:

  • Viesado para N pequeno. O FID é a média quadrática sobre a distribuição de características — um N pequeno subestima a covariância, fornecendo um FID falsamente baixo. Sempre use N ≥ 10.000.
  • Dependente do Inception. O Inception-v3 foi treinado no ImageNet. Domínios distantes do ImageNet (rostos, arte, imagens de texto) produzem um FID sem sentido. Use um extrator de características específico para o domínio.
  • Manipulação (Gaming). O overfitting ao prior do Inception fornece um FID baixo sem melhoria na qualidade visual. Supere isso com o CMMD (abaixo).

CLIP score — aderência ao prompt

Radford et al. (2021). Para uma imagem gerada + prompt:

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

Média em 30 mil imagens geradas → um escalar comparável entre modelos.

Modos de falha:

  • Pontos cegos do próprio CLIP. O CLIP tem um raciocínio composicional fraco ("um cubo vermelho em cima de uma esfera azul" frequentemente falha). Os modelos podem ter uma boa classificação no CLIP score sem realmente seguir prompts complexos.
  • Viés de prompt curto. Prompts curtos têm mais correspondências de imagem-CLIP no mundo real. Prompts mais longos têm CLIP scores mecanicamente menores.
  • Manipulação de prompt (Prompt gaming). Incluir "high quality, 4k, masterpiece" no prompt infla o CLIP score sem melhorar o alinhamento entre imagem e texto.

O CMMD (Jayasumana et al., 2024) corrige alguns desses problemas: usa características do CLIP em vez do Inception, e a discrepância média máxima (maximum-mean discrepancy) em vez de Fréchet. É melhor para detectar diferenças sutis de qualidade.

Preferência humana — a verdade fundamental (ground truth)

Escolha um conjunto de prompts. Gere imagens com o modelo A e o modelo B. Mostre os pares para humanos (ou para um juiz LLM forte). Agregue as vitórias em uma pontuação Elo ou Bradley-Terry. Benchmarks:

  • PartiPrompts (Google): 1.600 prompts diversos, 12 categorias.
  • HPSv2: 107 mil anotações humanas, amplamente utilizado como proxy automatizado.
  • ImageReward: 137 mil pares de preferência prompt-imagem, sob termos da MIT.
  • PickScore: treinado com base em 2.6 milhões de preferências do Pick-a-Pic.
  • Arenas de imagem no estilo Chatbot Arena: https://imagearena.ai/ e outras.

Modos de falha:

  • Variância dos avaliadores. Não especialistas têm preferências diferentes dos especialistas. Use ambos.
  • Distribuição de prompts. Prompts selecionados a dedo (cherry-picked) favorecem uma família de modelos. Sempre documente.
  • Reward hacking do juiz LLM. O juiz GPT-4 é enganado por saídas bonitas, mas incorretas. Faça a triangulação com humanos.

Uso conjunto

Um relatório de avaliação de produção deve incluir:

  1. FID em 10-30 mil amostras contra uma distribuição real reservada (qualidade da amostra).
  2. CLIP score / CMMD nas mesmas amostras versus seus prompts (aderência).
  3. Taxa de vitória em uma arena cega versus o modelo anterior (preferência geral).
  4. Análise de modos de falha: 50 saídas amostradas aleatoriamente, sinalizadas para problemas conhecidos (anatomia das mãos, renderização de texto, contagem consistente de objetos).

Qualquer métrica isolada é uma mentira. Três métricas corroborativas + revisão qualitativa são uma afirmação.

Construa

O arquivo code/main.py implementa FID, um equivalente a CLIP-score e agregação Elo em "vetores de características" sintéticos (usamos vetores 4-D como substitutos para as características do Inception). Você verá:

  • Cálculo do FID em um N pequeno e em um N grande — o viés.
  • "CLIP score" como similaridade de cosseno entre conjuntos de características.
  • Regra de atualização Elo a partir de um fluxo de preferências sintético.

Passo 1: FID em quatro linhas

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

Passo 2: Similaridade de cosseno no 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)

Passo 3: Agregação 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

Armadilhas

  • FID com N=1000. A heurística não é confiável abaixo de N=10k. Artigos que relatam FID com N baixo estão manipulando os resultados.
  • Comparar FID entre resoluções diferentes. O redimensionamento do Inception para 299×299 altera a distribuição de características. Compare apenas em resoluções correspondentes.
  • Relatar apenas uma seed. Execute no mínimo 3 seeds. Relate o desvio padrão (std).
  • Inflação do CLIP score via prompts negativos. Alguns pipelines aumentam o CLIP score fazendo overfitting ao prompt. Verifique se há saturação visual.
  • Viés de Elo por sobreposição de prompts. Se ambos os modelos viram um prompt de benchmark durante o treinamento, o Elo perde o sentido. Use conjuntos de prompts reservados.
  • Viés de público pago em avaliações humanas. Avaliadores do Prolific ou MTurk tendem a ser mais jovens e familiarizados com tecnologia. Mescle-os com especialistas contratados em arte/design.

Uso Prático

Protocolo de avaliação de produção em 2026:

Pilar Mínimo Recomendado
Qualidade da amostra FID em 10k vs real reservada + CMMD em 5k + FID em subconjunto por categoria
Aderência ao prompt CLIP score em 30k + HPSv2 + ImageReward + resposta a perguntas estilo VQA
Preferência 200 pares cegos vs baseline + 2000 humanos pareados + juiz LLM + Chatbot Arena
Análise de falhas 50 sinalizados manualmente 500 sinalizados manualmente + classificador de segurança automatizado

Todos os quatro pilares em um único relatório = uma afirmação. Qualquer um sozinho = marketing.

Envio

Salve outputs/skill-eval-report.md. A habilidade recebe um novo checkpoint de modelo + baseline e gera um plano de avaliação completo: tamanhos de amostra, métricas, testes de modos de falha e critérios de aprovação.

Exercícios

  1. Fácil. Execute code/main.py. Compare o FID em N=100 versus N=1000 nas mesmas distribuições sintéticas. Relate a magnitude do viés.
  2. Médio. Implemente o CMMD a partir de características sintéticas no estilo CLIP (consulte Jayasumana et al., 2024 para a fórmula). Compare a sensibilidade a diferenças de qualidade em relação ao FID.
  3. Difícil. Replique a configuração do HPSv2: pegue 1000 pares de imagem-prompt de um subconjunto do Pick-a-Pic, faça o ajuste fino de um pequeno pontuador baseado em CLIP nas preferências e meça a sua concordância com um conjunto reservado.

Termos-Chave

Termo O que as pessoas dizem O que realmente significa
FID "Fréchet Inception Distance" Distância de Fréchet de ajustes Gaussianos a características do Inception reais vs geradas.
CLIP score "Similaridade texto-imagem" Similaridade de cosseno entre embeddings de imagem e texto do CLIP.
CMMD "Substituto do FID" MMD de características do CLIP; menos viesado, sem suposição Gaussiana.
IS "Inception score" Exp KL(p(y|x) || p(y)); correlaciona-se mal com modelos modernos, aposentado.
HPSv2 / ImageReward / PickScore "Proxies de preferência aprendidos" Modelos pequenos treinados em preferências humanas; usados como juízes automáticos.
Elo "Pontuação de xadrez" Agregação Bradley-Terry de vitórias pareadas.
PartiPrompts "O conjunto de prompts de benchmark" 1.600 prompts organizados pelo Google em 12 categorias.
FD-DINO "Substituto auto-supervisionado" FD usando características do DINOv2; melhor para domínios fora do ImageNet.

Nota de produção: avaliação também é uma carga de trabalho de inferência

Executar o FID em 10k amostras significa gerar 10k imagens. Para um SDXL base com 50 passos a 1024² em uma única L4, isso representa cerca de 11 horas de inferência de requisição única. Os orçamentos de avaliação são reais, e o enquadramento é exatamente o cenário de inferência offline (maximizar o throughput, ignorar o TTFT):

  • Agrupe ao máximo em batches, esqueça a latência. Avaliação offline = batching estático no maior tamanho que couber na memória. pipe(...).images com num_images_per_prompt=8 em uma H100 de 80GB roda 4-6× mais rápido no tempo de relógio real do que requisições individuais.
  • Faça cache das características reais. A extração de características do Inception (FID) ou CLIP (CLIP-score, CMMD) sobre o conjunto de referência real é executada uma única vez e armazenada como um .npz. Não recalcule a cada avaliação.

Para CI / portões de regressão: execute o FID + CLIP score em um subconjunto de 500 amostras por PR (~30 min); execute o FID completo de 10k + HPSv2 + Elo diariamente durante a noite.

Leituras Adicionais

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