--- id: generative-evaluation title: Evaluating Generative Models code: EG subtitle: FID, CLIP score, CMMD, Elo, WER, MOS, SECS, EER and FAD. Code, sample sizes and the ways each number fails. hue: 45 sources: phases/08-generative-ai/14-evaluation-fid-clip-score, phases/06-speech-and-audio/17-audio-evaluation-metrics, phases/12-multimodal-ai/14-show-o-discrete-diffusion-unified source_hash: 90f888ea41e1551e --- ## FID and CLIP score type: architecture from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md ```arch node | real | 1,1 | Real images | held-out set | store node | gen | 1,2 | Generated images | 10k or more | store node | inc | 2,1 | Inception-v3 | 2048-D features | model node | gauss | 3,1 | Gaussian fit | mean and covariance | process node | fid | 4,1 | FID | lower is better | client node | prompt | 1,3 | Prompt | | client node | clip | 2,3 | CLIP encoders | image and text | model node | cos | 3,3 | Cosine | per image | process node | score | 4,3 | CLIP score | higher is better | client edge | real | inc | edge | gen | inc | edge | inc | gauss | two pools edge | gauss | fid | Fréchet distance edge | gen | clip | edge | prompt | clip | edge | clip | cos | edge | cos | score | mean over 30k ``` ## Production eval report type: flow from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md 1. **Sample quality**: FID on 10-30k samples against a held-out real set. 2. **Adherence**: CLIP score or CMMD on the same samples against their prompts. 3. **Preference**: win rate in a blinded arena against the previous model. 4. **Failure audit**: flag 50 random outputs for hands, text and object count. 5. **Seeds**: run 3 seeds minimum. Report the std. 6. **Per PR**: FID and CLIP score on a 500-sample subset, about 30 min. 7. **Nightly**: full 10k FID, HPSv2 and Elo. ## Formulas type: concepts from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md, phases/12-multimodal-ai/14-show-o-discrete-diffusion-unified/docs/en.md - **FID**: $\lVert \mu_r - \mu_g \rVert^2 + \mathrm{Tr}(\Sigma_r + \Sigma_g - 2 (\Sigma_r \Sigma_g)^{0.5})$ - **CLIP score**: cosine of `CLIP_image(x_gen)` and `CLIP_text(prompt)`. - **Elo expected**: $E_a = 1 / (1 + 10^{(r_b - r_a)/400})$ - **Elo update**: $r_a \leftarrow r_a + k (s_a - E_a)$. B moves by the same amount the other way. - **WER**: $(S + D + I) / N$ after normalization. CER uses characters. - **DER**: (FA + Miss + Confusion) / total speaker time. - **EER**: the threshold where FAR equals FRR. - **Show-o mask ratio**: $\cos\left(\frac{\pi t}{2T}\right)$, from 1.0 at step 0 to 0 at step T. ## Image metrics in code type: annotated-code lang: python from: phases/08-generative-ai/14-evaluation-fid-clip-score/code/main.py ```python mu_r = mean_vec(real_features) mu_g = mean_vec(gen_features) cov_r = covariance(real_features, mu_r) mean_sq = sum((a - b) ** 2 for a, b in zip(mu_r, mu_g)) sqrt_prod = jacobi_sqrt(prod) # matrix square root return mean_sq + trace(cov_r) + trace(cov_g) - 2 * trace(sqrt_prod) score = clip_like(image, prompt) # cosine, higher is better expected_a = 1 / (1 + 10 ** ((r_b - r_a) / 400)) actual_a = 1.0 if winner == "a" else 0.0 delta = k * (actual_a - expected_a) # k=32 return r_a + delta, r_b - delta ``` ## Audio metrics in code type: annotated-code lang: python from: phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md ```python transform = Compose([ToLowerCase(), RemovePunctuation(), Strip()]) score = wer(truth="", hypothesis="", truth_transform=transform, hypothesis_transform=transform) sv = EncoderClassifier.from_hparams("speechbrain/spkrec-ecapa-voxceleb") emb_ref = sv.encode_batch(load_wav("reference.wav")) emb_clone = sv.encode_batch(load_wav("cloned.wav")) secs = torch.nn.functional.cosine_similarity(emb_ref, emb_clone, dim=-1).item() fad = FrechetAudioDistance() score = fad.get_fad_score("generated_folder/", "reference_folder/") ``` ## Metric functions type: task-table from: phases/08-generative-ai/14-evaluation-fid-clip-score/code/main.py, phases/06-speech-and-audio/17-audio-evaluation-metrics/code/main.py, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md | Task | Code | |---|---| | Image FID | `fid(real_features, gen_features)` | | Elo from a pair | `elo_update(r_a, r_b, winner, k=32)` | | Word error rate | `wer(ref, hyp)` | | Character error rate | `cer(ref, hyp)` | | Equal error rate | `eer_from_scores(same, diff)` | | FAD-shaped distance | `embedding_fad_like(real_embeds, fake_embeds)` | | Multiple-choice accuracy | `mmau_accuracy(predictions, golds)` | | TTS round-trip WER | `ttr_wer(tts_model, asr_model, texts)` | ## Image metrics side by side type: comparison from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md span: 2 | Factor | FID | CLIP score | CMMD | Human preference | |---|---|---|---|---| | Measures | sample quality | prompt adherence | quality, subtle differences | overall preference | | Features | Inception-v3, 2048-D | CLIP image and text | CLIP | humans or an LLM judge | | Minimum | 10k vs held-out real | 30k | 5k | 200 blinded pairs | | Weak spot | small N, domains far from ImageNet | weak composition, short prompts | not covered | judge variance, prompt choice | ## Sampling cost of unified models type: comparison from: phases/12-multimodal-ai/14-show-o-discrete-diffusion-unified/docs/en.md | Factor | Chameleon, Emu3 | Transfusion | Show-o | |---|---|---|---| | Decoding | autoregressive tokens | continuous diffusion | masked discrete diffusion | | Steps | 1024-4096 passes | ~20 | ~16 | | Each step | one token | full transformer pass | top-K tokens commit | ## Audio numbers to beat type: concepts from: phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md - **WER**: below 5% is human parity on read speech. - **UTMOS**: correlates ~0.9 with human MOS. F5-TTS 3.95, ground truth 4.08. - **SECS**: above 0.75 is a recognizable clone. - **CLAP**: above 0.3 is reasonable text-audio alignment. - **EER**: ECAPA on VoxCeleb1-O gives 0.87%. - **FAD**: MusicGen-small on MusicCaps 4.5. Lower is better. - **MMAU-Pro**: random chance is 25% on 4-way. - **Barge-in**: target below 150 ms. ## Defaults type: defaults from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md, phases/08-generative-ai/14-evaluation-fid-clip-score/code/main.py, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md, phases/12-multimodal-ai/14-show-o-discrete-diffusion-unified/code/main.py | Setting | Default | Note | |---|---|---| | Elo `k` | 32 | `elo_update` | | Elo start rating | 1000 | Both models | | FID samples | 10k | Low-N FID is unreliable | | CLIP score samples | 30k | Average to one scalar | | Inception input | 299×299 | Match resolutions | | MOS listeners | 20+ | 100+ samples per model | | Show-o steps `T` | 8 | Cosine schedule | | Keep ratio floor | 0.15 | `keep_ratio` per step | ## Troubleshooting type: troubleshooting from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md | Symptom | Cause | Fix | |---|---|---| | Low FID from few samples | Small N underestimates covariance | Use N of 10k or more | | FID meaningless on faces or art | Inception trained on ImageNet | Domain extractor, for example FD-DINO | | FID shifts across resolutions | 299×299 resize | Compare at matched resolution | | CLIP score up, images not better | "high quality, 4k, masterpiece" | Check binding and saturation | | Elo is meaningless | Models saw the benchmark prompts | Use held-out prompt sets | | 5% WER hides 30% on accents | Aggregate WER | Report by demographic slice | | Bad UTMOS on cloned audio | Trained on clean speech | Use a domain MOS panel | | FAD not comparable | Different reference sets | Same reference set for all models | ## Rules type: tips from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md - Normalize text before WER. Report the normalization rule. - Report distributions. P50/P95/P99 for latency, per class, per category. - Run one public benchmark and one in-house held-out set. - Cache the real features once as a `.npz` file. - Batch eval generation with `num_images_per_prompt=8`. - Use three metrics that agree, plus a qualitative review. ## Questions type: qa from: phases/08-generative-ai/14-evaluation-fid-clip-score/docs/en.md, phases/06-speech-and-audio/17-audio-evaluation-metrics/docs/en.md, phases/12-multimodal-ai/14-show-o-discrete-diffusion-unified/docs/en.md - **Why CMMD?** It uses CLIP features and MMD. It is less biased and has no Gaussian assumption. - **High SECS, low MOS?** The timbre is right but the voice is unnatural. - **EER or minDCF?** minDCF is more production-relevant. It weights cost at an operating point. - **What does 10k SDXL samples cost?** About 11 hours on one L4 at one request at a time. - **Why does Show-o inpaint for free?** Its training predicts masked tokens.