☰
s1 项目实战指南:在 lm-evaluation-harness 中评测 MC-TACO 时序常识理解任务
2026/10/9 2:07:07 网站建设 项目流程
  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

MC-TACO(Multiple-Choice Temporal Commonsense)是一个聚焦时序常识(temporal commonsense)理解能力的英文问答评测数据集,本仓库通过 lm-evaluation-harness 将其封装为mc_taco评测任务。本文以 mc_taco/README.md 为核心,结合 default.yaml 配置与 task.py 源码,完整讲解该任务的评测协议、YAML 配置、multiple_choice输出类型的底层原理、指标实现以及--limit参数带来的“假分数”陷阱,帮助你正确地在自己的模型上复现与解读 MC-TACO 评测结果。

MC-TACO 数据集:模型需要掌握的“时间常识”

MC-TACO 由论文"Going on a vacation" takes longer than "Going for a walk": A Study of Temporal Commonsense Understanding提出(arXiv 编号 1909.03065)。数据集包含约1.3 万个问答对(13k question-answer pairs),全部用于检验模型对事件与时间之间关系的常识推理能力,覆盖五类时间属性:

时间属性含义
duration(时长)一个事件通常持续多久
temporal ordering(时序)事件之间典型的发生先后顺序
typical time(典型时间)事件通常在什么时间点发生
frequency(频率)事件多久发生一次
stationarity(恒定性)某个状态是长时间维持,还是无限期持续

读者可以在本仓库的任务索引表 tasks/README.md 中找到mc_taco条目,其描述为“Question-answer pairs that require temporal commonsense comprehension.”,语言为英语,属于独立任务(README 注明目前尚未归入任何任务组,即Not part of a group yet)。

说明:原 README 中的 Citation 区块目前只是占位符(BibTeX-formatted citation goes here),尚未填写正式引用条目。在论文、报告或基准对比中引用该任务时,请直接引用上述原始论文,并按需自行整理 BibTeX 条目。

任务接入:default.yaml 逐字段解析

MC-TACO 的评测配置完整保存在 default.yaml 中,全文如下:

task: mc_taco dataset_path: mc_taco output_type: multiple_choice validation_split: validation test_split: test doc_to_text: "{{sentence}}\nQuestion: {{question}}\nAnswer: {{answer}}\nPlausible:" doc_to_target: label doc_to_choice: ["no", "yes"] should_decontaminate: true doc_to_decontamination_query: "{{question}} {{sentence}}" metric_list: - metric: acc - metric: f1 metadata: version: 1.0

各字段的含义与设计意图如下(字段语义可对照 task_guide.md 与 new_task_guide.md 中的通用约定):

  • task: mc_taco:任务注册名,命令行中通过--tasks mc_taco引用。
  • dataset_path: mc_taco:指向 Hugging Face Datasets 上的数据集标识符(mc_taco)。harness 运行时通过该路径加载原始数据集。
  • output_type: multiple_choice:声明本任务按“多选题”方式评测,即对每个候选答案计算续写对数似然(loglikelihood)并取最大者作为模型预测。这是理解整个评测协议的关键,详见下文源码解析。
  • validation_split: validation/test_split: test:分别指定验证集与测试集划分。MC-TACO 官方数据本身就包含这两个划分,因此这里直接映射即可,无需额外切分逻辑。
  • doc_to_text: "{{sentence}}\nQuestion: {{question}}\nAnswer: {{answer}}\nPlausible:":提示模板(Jinja2)。它把数据集中三个字段拼装成输入上下文:先给出包含事件的句子(sentence),再给出问题(question)与单个候选答案(answer),最后以Plausible:收尾,要求模型判断该候选答案对当前问题是否“合理”。注意这里只放一个候选答案——这正是“每个候选答案被拆成独立文档”的直接体现(详见“--limit陷阱”一节)。
  • doc_to_target: label:正确标签直接取自数据特征label。在 MC-TACO 中label是 0/1 整数(1 表示候选答案合理,0 表示不合理),而output_type为multiple_choice时,doc_to_target返回的是答案选项列表的下标(参见 new_task_guide.md)。
  • doc_to_choice: ["no", "yes"]:与label下标一一对应的候选词表,即“不合理 = no = 0”、“合理 = yes = 1”。这组 verbalizer 的写法和superglue/boolq中的["no", "yes"]用法一致(见 new_task_guide.md)。
  • should_decontaminate: true与doc_to_decontamination_query: "{{question}} {{sentence}}":开启评测去污。harness 会用该模板生成查询串,与训练语料的 n-gram 做比对,过滤掉可能与预训练语料重叠的样本,从而避免“背题”带来的虚高分数。should_decontaminate默认值为False,doc_to_decontamination_query缺省时则回退到doc_to_text(见 task_guide.md)。
  • metric_list:报告acc(准确率)与f1两项指标,其中 F1 的实现细节见下文“指标实现”一节。
  • metadata: version: 1.0:当前配置版本号。

时序常识如何被建模为“多选题”:multiple_choice 源码原理

虽然 MC-TACO 官方以“问题 + 候选答案合理性”形式组织,但 harness 把它统一建模为multiple_choice任务。其核心逻辑位于 task.py 的construct_requests与process_results两个方法中。

请求构造阶段(task.py#L1334-L1345):对每个文档,先通过self.doc_to_choice(doc)取出候选词表,然后**把每个候选词作为续写(continuation)**分别构造loglikelihood请求:

elif self.OUTPUT_TYPE == "multiple_choice": choices = self.doc_to_choice(doc) target_delimiter = self.config.target_delimiter ... # Otherwise they are placed in the continuation arguments = [(ctx, f"{target_delimiter}{cont}") for cont in choices]

也就是说,模型对ctx + " " + "no"和ctx + " " + "yes"分别计算对数似然,MC-TACO 的“合理性判断”由此被转译成“两个词谁更可能接在后面”。

预测阶段(task.py#L1433-L1453):对所有候选的对数似然取argmax作为预测标签,同时计算按候选长度归一化后的pred_norm(长度较长的选项自动获得更高的负对数似然,归一化可削弱 token 数偏差):

pred = np.argmax(lls) pred_norm = np.argmax(lls / completion_len)

随后通过gold = self.doc_to_target(doc)拿到正确标签下标,与pred比对即可得到每个文档的命中情况;如果gold超出候选范围(例如-100),harness 会打印警告日志(task.py#L1460-L1479)。

理解这一点后就能明白:评测结果等价于“模型逐候选判断合理性的二元分类准确率”,而不是对完整多选题五选一的端到端回答,这也是阅读 MC-TACO 分数时必须注意的评测口径。

指标实现:acc 与 F1

metric_list中的f1指标由 harness 内置的 F1 聚合函数实现,位于 metrics.py#L57-L66:

@register_aggregation("f1") def f1_score(items): from sklearn.metrics import f1_score unzipped_list = list(zip(*items)) golds = unzipped_list[0] preds = unzipped_list[1] fscore = f1_score(golds, preds) return np.max(fscore)

它把整个评测集上所有文档的 gold/pred 标签汇总后一次性调用sklearn.metrics.f1_score计算 F1(np.max的处理在多分类场景下取各类别 F1 的最大值;MC-TACO 是 no/yes 二分类,返回即为二元 F1)。因此该指标是“数据集级”聚合指标,而不是逐样本指标的平均,这也解释了 task_guide.md 中“aggregation与逐样本metric配对”的框架设计。

作为旁证,仓库测试数据目录下的 tests/testdata/mc_taco-v0-res.json 保留了该任务的早期版本输出(version 0),其结果为{"em": 0.0773, "f1": 0.4160},说明该任务的历史实现曾使用em(exact match)与f1双指标;而当前 default.yaml(version 1.0)已改为acc与f1。对比不同版本日志时需留意这一口径差异。

重要警告:为什么--limit会给出误导性结果

原 README 专门用WARNING段落强调了一个容易踩坑的评测协议问题:在本任务上使用--limit参数会得到误导性结果。

原因在于 MC-TACO 的数据组织方式:原作者收集的每道多选题(一个 question 搭配多个 candidate answers)会被拆分成若干“question-option”对,每个配对被单独封装成一个文档(document)用于合理性检测。harness 在加载这些文档时会做打乱(shuffle),此时若设置--limit截取前 N 个文档,很可能会“切断”某道题的部分候选答案——例如只保留了yes文档而丢掉了对应的no文档。

由于该任务的指标要求穷尽评测一道题的所有候选(README 建议参阅论文第 4 节的细节),--limit造成的候选缺失会让 EM/acc/F1 全部失真:分数既不能代表完整测试集,也不能代表被截取的子集,任何基于--limit的调试结论都不具备可比性。

实操建议:

  • 完整评测时不要加--limit,直接对test划分全量评测;
  • 若确需小规模冒烟测试(smoke test)验证 pipeline 是否跑通,应清楚这只是“流程自检”,其结果不能写入任何评测对比或论文表格;
  • 排查问题时优先使用--limit之外的机制(如先确认数据集加载、再跑小模型全量)。

去污配置与可复现性

MC-TACO 任务默认开启去污(should_decontaminate: true),这是数据污染(contamination)风险较高的常识类基准的常见处理方式。去污查询串由{{question}} {{sentence}}拼装而成,harness 的去污实现与用法可参见仓库 decontamination 相关文档 与 decontamination 模块;should_decontaminate的通用语义在 task_guide.md 中亦有说明(默认False,开启后若未单独指定doc_to_decontamination_query则回退使用doc_to_text作为查询)。

运行评测:命令与验证路径

在当前仓库中,任务的注册目录为lm_eval/tasks/mc_taco/(含 README.md 与 default.yaml),harness 会自动发现该 YAML 并注册mc_taco任务。你可以按以下方式查看与运行(具体模型参数以你的环境为准):

# 查看 harness 支持的全部任务列表(tasks/README.md 中即用该命令列出任务索引) lm-eval --tasks list # 用 Hugging Face 模型评测 MC-TACO(注意不要加 --limit) lm-eval --model hf \ --model_args pretrained=<你的模型名> \ --tasks mc_taco \ --num_fewshot 0

运行结束后,输出中会呈现mc_taco的acc与f1两项结果,可直接用于不同模型之间的时序常识能力横向对比。若你希望核对 harness 自身对该任务的回归测试,可参考仓库中 tests/testdata/mc_taco-v0-res.json 记录的历史基准输出;测试用例的组织方式可进一步阅读 tests 目录下的测试套件。

小结

MC-TACO 在 lm-evaluation-harness 中是一个“小而关键”的任务:配置上它浓缩了multiple_choice输出类型、去污开关、acc/F1 双指标等 harness 核心机制;评测协议上它的“逐候选成文档”结构对--limit使用提出了严格限制。正确理解 default.yaml 的每个字段与 task.py 的multiple_choice处理链路,是准确复现分数、避免“假高/假低”结果的前提。

  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

相关推荐

上一篇:5分钟终极指南:KMS_VL_ALL_AIO智能激活脚本完整教程
下一篇:如何在电脑上免费畅玩Switch游戏:yuzu模拟器终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询