多模态评估 本节摘要:训练是循环的一半,另一半是测量。本节从原语建三个评估面:图文检索报 R@1/R@5/R@10;视觉问答报精确匹配准确率;图像字幕报 BLEU-4。每指标是模型输出上的函数加秒级跑的合成评估套件。诱惑是训练损失高原就宣多模态模型完成——训练损失测训练分布拟合,不测模型能否在留出批排名配对、答问、或写人能接受的字幕。三个评估面是标准:检索(R@K,建查询字幕联合嵌入、按余弦排每图、报匹配图是否落前 1/5/10)、VQA(精确匹配,给(图,问)输出答案 token,与参考比)、字幕(BLEU-4,生成字幕、对参考算 14 gram 精确率几何均值带短惩罚)。每指标是薄函数,本节全用代码建使数学具体、面在你控下。
本节摘要:训练是循环的一半,另一半是测量。本节从原语建三个评估面:图文检索报 R@1/R@5/R@10;视觉问答报精确匹配准确率;图像字幕报 BLEU-4。每指标是模型输出上的函数加秒级跑的合成评估套件。诱惑是训练损失高原就宣多模态模型完成——训练损失测训练分布拟合,不测模型能否在留出批排名配对、答问、或写人能接受的字幕。三个评估面是标准:检索(R@K,建查询字幕联合嵌入、按余弦排每图、报匹配图是否落前 1/5/10)、VQA(精确匹配,给(图,问)输出答案 token,与参考比)、字幕(BLEU-4,生成字幕、对参考算 1~4 gram 精确率几何均值带短惩罚)。每指标是薄函数,本节全用代码建使数学具体、面在你控下。
对应原课程:Phase 19 · Lesson 63 ·
multimodal-eval(原英文phases/19-capstone-projects/63-multimodal-eval/docs/en.md)。本节属「多模态/VLM」赛道第六节,也是本章最后一节。
阅读完本节,你应当能够:
建图与字幕嵌入间 (N,N) 余弦相似矩阵。每行按降序排列。Recall@K 是对角列索引落前 K 位的行分数。对称 Recall@K(字幕→图)在转置矩阵上算,两数都报。N=100 评估时,R@1=0.6 意味 100 字幕中 60 个检索到正确图为 top 匹配。
每(图,问,答):编码图、嵌问题、经解码器融合、读下一 token。预测 token id 与参考 id 比,等则对。集上取均。真 VQA 数据集每问带多人标注答案、用软精度公式(10 标注者至少 3 同意则 1.0,以下缩放);本节用单答精确匹配求清。
BLEU-4 = BP * exp(mean(log p1, log p2, log p3, log p4))
p_n 是修正 n-gram 精确率(生成 n-gram 出现在任一参考的截断计数,除总生成 n-gram),BP 是短惩罚:
BP = 1 若生成长 > 参考长 = exp(1 - r/g) 否则, r 参考长 g 生成长
小样本需平滑(某 p_n 为零)。实现用 Chen 与 Cherry「method 1」(任零计数分子分母加 1),低计数区最安全默认。多参考支持(一图多参考字幕)。
从第 60 节同 mock 语料模式建内存中 50 样本套件,用留出种子。三列组:pairs(检索用 50 对)、vqa(50 三元组)、caps(50 条带至多 3 参考)。套件种子确定、与训练语料留出,故指标算在模型未见数据上。
| 指标 | 范围 | 随机基线(N=50) |
|---|---|---|
| R@1 | 0~1 | 0.02(1/N) |
| R@5 | 0~1 | 0.10 |
| R@10 | 0~1 | 0.20 |
| VQA EM | 0~1 | 1/词表 |
| BLEU-4 | 0~1 | 小但非零 |
50 步合成训练的指标预期不高,但预期超随机基线——demo 检的就是这。
code/main.py 实现:
recall_at_k(sim_matrix, k):两方向返 [0,1] 浮点。vqa_exact_match(predictions, references):返 int 等的均。bleu4(generated, references, smoothing=True):多参考支持。build_eval_suite(seed, n_samples, vocab_size, max_len):返三确定性评估列。evaluate(model, suite):跑全部三指标返数字字典。def recall_at_k(sim, k): N = sim.shape[0] ranks = sim.argsort(dim=1, descending=True) # 每行降序 diag_pos = (ranks == torch.arange(N).unsqueeze(1)).nonzero()[:, 1] i2t = (diag_pos < k).float().mean() # 图 -> 文 ranks_t = sim.T.argsort(dim=1, descending=True) diag_pos_t = (ranks_t == torch.arange(N).unsqueeze(1)).nonzero()[:, 1] t2i = (diag_pos_t < k).float().mean() # 文 -> 图 return {"i2t": i2t.item(), "t2i": t2i.item(), "mean": ((i2t+t2i)/2).item()} def bleu4(generated, references, smoothing=True): precs = [] for n in range(1, 5): # 1~4 gram gen_ngrams = ngrams(generated, n) max_ref = Counter() for ref in references: ref_ngrams = Counter(ngrams(ref, n)) for g, c in ref_ngrams.items(): max_ref[g] = max(max_ref[g], c) hits = sum(min(c, max_ref.get(g, 0)) for g, c in Counter(gen_ngrams).items()) total = max(1, len(gen_ngrams)) p = (hits + 1) / (total + 1) if (smoothing and hits == 0) else hits / total precs.append(p) bp = 1 if len(generated) > len(references[0]) \ else math.exp(1 - len(references[0])/max(1,len(generated))) return bp * math.exp(sum(math.log(p) for p in precs) / 4)
code/test_main.py 覆盖:recall@k 在完美单位相似矩阵返 1.0、k<N 在翻转矩阵返 0.0;recall@k 尊 k<=N 上限;bleu4 在生成等于某参考时返 1.0、在不交词表返 0.0;VQA 精确匹配等对分数;build_eval_suite 返预期对/VQA/字幕数。
设计要点:recall@k 的「对角位」是关键——相似矩阵对角项是真配对,R@K 就是真配对落前 K 的行分数。BLEU-4 的短惩罚防「生成一句短而精确骗高精确率」。Chen-Cherry method-1 平滑防低计数区
log(0)=-inf毁整个 BLEU。VQA 单答精确匹配是简化(真数据集软精度),但清且接口同——换软精度只改vqa_exact_match内部。三指标各薄函数,benchmark 无关,真数据集(MS-COCO/VQA v2)插同函数形状。
每指标直映生产基准:检索(MS-COCO 5K val、Flickr30K、ImageNet 零样本都是同相似矩阵上的 R@K 问题,合成评估换真文件函数签名不变);VQA(VQA v2、GQA、OK-VQA 用同精确匹配形状,VQA v2 软精度替单答 EM);BLEU-4(MS-COCO 字幕、NoCaps、Flickr30K 字幕都用 BLEU-4 加 CIDEr 与 METEOR,加 CIDEr 是多一函数)。本节手写让你看清 recall 的对角位、BLEU 的短惩罚与平滑、VQA 的单答比——这些在用 pycocoevalcap(标准 COCO 评估库)时是黑盒。transformers 的 Trainer.evaluate、evaluate 库的 bleu/recall 是同数学的产品化封装。
code/main.py + code/test_main.py。demo 在 CPU 上约一分钟跑完:前后指标表显示检索从近随机升向模型学到的信号、VQA 升超随机、BLEU-4 升(合成结构够 4-gram 精确率升)。recall_at_k、vqa_exact_match、bleu4、build_eval_suite、evaluate 均可独立复用——任何「检索/VQA/字幕」多模态评估场景。换真数据集(MS-COCO/VQA v2),把 build_eval_suite 换真加载器,函数体不动。
min(human_count/3,1))。bleu4 加空生成序列不崩的变体。build_eval_suite 换 MS-COCO val(若可下载),在真数据上跑三指标。本章至此完成。这 85 个毕业项目是检验你 AI 工程掌握程度的试金石——从终端编码代理到多模态 VLM,从单卡训练到分布式 FSDP,从提示工程到自主研究循环。下一章我们将进入(下一章主题)。