lm-evaluation-harness 多语言 LAMBADA 评测指南:StableLM 变体任务与配置详解
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
本文以 lm-evaluation-harness 仓库中的lambada_multilingual_stablelm任务组为主线,系统讲解 LAMBADA 数据集的评测原理、该任务组在仓库中的 YAML 实现细节、运行方式与指标含义。读者在读完本文后,将能够理解多语言 LAMBADA 任务的构造逻辑(机器翻译变体、词级 log-likelihood 评测),并掌握在本地运行该任务组、解读 perplexity 与 acc 结果的完整实战方案。
LAMBADA 数据集:需要跨句语篇上下文的词预测任务
LAMBADA(LAnguage Modeling Broadened to Account for Discourse Aspects)是一个通过"预测最后一个词"来评估模型文本理解能力的基准数据集。它的核心设计思想体现在数据的构造方式上:数据集中每个样本都是一段叙事文本(narrative passage),这些文本具有一个共同特征——人类被试只有在看到完整段落时才能猜出最后一个词;如果只看到目标词之前的那一句话,则无法猜出。
这意味着要在 LAMBADA 上取得好的表现,模型不能只依赖局部上下文(例如紧邻目标词的句子),而必须能够跨句子追踪信息、在更广阔的语篇(broader discourse)中建立联系。用评测领域的术语来说,LAMBADA 检验的是模型的长程语篇建模能力,而不是简单的局部语言模型困惑度。
该数据集最初由 Paperno 等人提出(《The LAMBADA dataset: Word prediction requiring a broad discourse context》,2016 年发布),官方托管于 Zenodo。在 lm-evaluation-harness 仓库中,围绕 LAMBADA 存在多个任务目录,本文聚焦的是lm_eval/tasks/lambada_multilingual_stablelm/下的 StableLM 多语言变体。
任务定位:OpenAI 变体与 StableLM 报告中的机器翻译版本
在 LAMBADA 的评测历史上,OpenAI 曾发布过一个广为人知的变体(即lambada_openai),该变体在原始数据集基础上做了清洗与过滤,是社区评测语言模型时最常使用的版本。lm-evaluation-harness 仓库中至少有三个与 LAMBADA 相关的目录:
- lm_eval/tasks/lambada/:原始英文变体,包含
lambada_openai与lambada_standard两个任务; - lm_eval/tasks/lambada_multilingual/:OpenAI 变体的早期机器翻译版本(
lambada_mt_{en, fr, de, it, es}); - lm_eval/tasks/lambada_multilingual_stablelm/:本文主角,StableLM 报告使用的机器翻译版本。
lambada_multilingual_stablelm任务组所评测的,是OpenAI LAMBADA 变体的多语言机器翻译版本,其来源与报告口径直接对应 Stable LM 2 1.6B 技术报告(Bellagente 等人,arXiv:2402.17834)中所报告的评测设置。换言之,该任务组复刻了一个已在公开论文中发布过的评测协议:如果研究者希望让自己的模型结果与 Stable LM 2 系列技术报告中的多语言 LAMBADA 分数直接可比,就应该使用这个任务组。
组与任务清单
根据 README 的官方说明:
- 组(Group):
lambada_multilingual_stablelm—— 运行该组会一次评估其下所有的lambada_mt_stablelm_X任务; - 任务(Tasks):
lambada_openai_mt_stablelm_{en, fr, de, it, es}—— OpenAI LAMBADA 变体的机器翻译版本。
需要说明的是,README 中列举的语言集合为 5 种(en/fr/de/it/es),而从仓库的实际配置文件来看,该任务目录 下共存在7 个 YAML 文件,除上述 5 种语言外还包含nl(荷兰语)与pt(葡萄牙语):
| 任务名 | 配置文件 | 数据集语言 |
|---|---|---|
lambada_openai_mt_stablelm_en | lambada_mt_stablelm_en.yaml | en |
lambada_openai_mt_stablelm_de | lambada_mt_stablelm_de.yaml | de |
lambada_openai_mt_stablelm_fr | lambada_mt_stablelm_fr.yaml | fr |
lambada_openai_mt_stablelm_it | lambada_mt_stablelm_it.yaml | it |
lambada_openai_mt_stablelm_es | lambada_mt_stablelm_es.yaml | es |
lambada_openai_mt_stablelm_nl | lambada_mt_stablelm_nl.yaml | nl |
lambada_openai_mt_stablelm_pt | lambada_mt_stablelm_pt.yaml | pt |
评测时只需指定组名lambada_multilingual_stablelm,harness 会自动展开并逐个运行组内全部语言的任务,最终按语言分别汇报指标。
YAML 配置逐项解析
该任务组以lambada_mt_stablelm_en.yaml为主配置文件(base config),其余 6 个语言文件均通过 YAMLinclude机制继承它,只覆盖task名与dataset_name两个字段。以德语为例,lambada_mt_stablelm_de.yaml 全文如下:
include: lambada_mt_stablelm_en.yaml task: lambada_openai_mt_stablelm_de dataset_name: de这种"一个主文件 + 多个薄覆盖文件"的组织方式是 lm-evaluation-harness 任务目录中的常见模式,它极大减少了多语言任务间的重复配置,也保证了各语言任务在评测协议上完全一致(除数据集语言外,其余字段全部继承)。
下面逐字段解读基础配置 lambada_mt_stablelm_en.yaml:
tag: lambada_multilingual_stablelm task: lambada_openai_mt_stablelm_en dataset_path: EleutherAI/lambada_multilingual_stablelm dataset_name: en output_type: loglikelihood test_split: test doc_to_text: "{{text.split(' ')[:-1]|join(' ')}}" doc_to_target: "{{' '+text.split(' ')[-1]}}" should_decontaminate: true doc_to_decontamination_query: "{{text}}" metric_list: - metric: perplexity aggregation: perplexity higher_is_better: false - metric: acc aggregation: mean higher_is_better: true metadata: version: 1.0各字段含义如下:
tag:将任务归入lambada_multilingual_stablelm标签/组,供分组评测与任务索引使用;task:任务唯一标识,CLI 与 Python API 中引用该任务的名字;dataset_path:HuggingFace Hub 上的数据集标识符,本任务使用EleutherAI/lambada_multilingual_stablelm;dataset_name:数据集内部的子集(config)名,对应语言代码,如en、de;output_type:loglikelihood,表示本任务按"对每个候选续写计算对数似然"的方式评测(词预测任务的标准配置);test_split:使用数据集的test划分;doc_to_text/doc_to_target:从样本构造 prompt 与目标的关键字段。doc_to_text取样本text去掉最后一个词(text.split(' ')[:-1]|join(' '))作为输入上下文;doc_to_target取最后一个词并前置一个空格(' '+text.split(' ')[-1])作为待预测目标。这种"输入=前 N-1 个词、目标=最后一个词"的切分方式,正是 LAMBADA 词预测任务的核心实现;should_decontaminate:true,表示启用训练数据去污染检查;doc_to_decontamination_query:提供去污染查询所用的原始文本(完整的text);metric_list:声明两个评测指标——perplexity(困惑度,聚合函数为perplexity,越低越好)与acc(准确率,聚合方式为mean,越高越好)。
其中perplexity聚合函数在 lm_eval/api/metrics.py 中定义,它会综合每个样本的 log-likelihood 计算困惑度;acc则统计"模型赋予最后一个词最高似然(或匹配目标词)"的样本占比。两个指标从不同角度刻画模型的语言建模质量:acc反映词预测的硬准确率,perplexity反映整体概率质量分配的好坏。
如何在本地运行该任务组
方式一:CLI 命令行
lm-evaluation-harness 安装后提供lm-eval命令行入口(见 pyproject.toml 中的[project.scripts]配置)。运行整个多语言 StableLM LAMBADA 组的最简命令为:
lm-eval --model hf \ --model_args pretrained=<你的模型名或路径> \ --tasks lambada_multilingual_stablelm \ --device cuda也可以只评测单个语言任务,例如仅评测英语:
lm-eval --model hf \ --model_args pretrained=<你的模型名或路径> \ --tasks lambada_openai_mt_stablelm_en \ --device cuda参数说明:
--model:模型后端,hf表示使用 HuggingFace Transformers 模型;--model_args:以逗号分隔的模型加载参数,pretrained必填,可传模型名或本地路径;--tasks:逗号分隔的任务或组名列表,传组名lambada_multilingual_stablelm即评测全部 7 个语言任务;--device:推理设备(cuda/cpu),也支持--batch_size等更多参数控制批量大小与内存占用。
方式二:Python API
在脚本中使用simple_evaluate接口(来自 lm_eval/evaluator.py)可得到同样的结果,便于二次处理:
from lm_eval import simple_evaluate results = simple_evaluate( model="hf", model_args="pretrained=<你的模型名或路径>", tasks=["lambada_multilingual_stablelm"], device="cuda", ) # results["results"] 中按任务名(如 lambada_openai_mt_stablelm_en) # 保存了 perplexity 与 acc 等指标与仓库中其他 LAMBADA 任务的关系
为帮助读者在仓库中准确选择任务,这里给出三个相关目录的对比(从配置内容看):
| 目录 | 任务命名 | 数据集 | 特点 |
|---|---|---|---|
| lambada/ | lambada_openai、lambada_standard | EleutherAI/lambada_openai 等 | 英文原始/OpenAI 变体 |
| lambada_multilingual/ | lambada_mt_{en,fr,de,it,es} | EleutherAI/lambada_openai | OpenAI 变体的早期机器翻译版本,共 5 种语言 |
| lambada_multilingual_stablelm/ | lambada_openai_mt_stablelm_{...} | EleutherAI/lambada_multilingual_stablelm | 独立的多语言数据集,对应 Stable LM 2 1.6B 报告口径,实际配置覆盖 7 种语言 |
从配置结构看,lambada_multilingual_stablelm与早期lambada_multilingual的评测协议(loglikelihood、同样的词切分方式、相同的两个指标)一脉相承,但数据集源不同——前者使用独立的多语言数据集EleutherAI/lambada_multilingual_stablelm,后者仍基于英文EleutherAI/lambada_openai的翻译版本。因此,若要与 Stable LM 2 系列技术报告中的多语言结果对齐,应选择lambada_multilingual_stablelm。
去污染与评测完整性
该任务组在所有语言的配置中都开启了should_decontaminate: true,并提供了doc_to_decontamination_query(完整的原始文本)。这意味着评测时 harness 会将测试样本的原始文本与模型的预训练语料进行比对,帮助识别"测试数据是否已被模型在训练阶段见过"的潜在污染问题。对于语篇级词预测任务,样本可能以近似形式出现在训练语料中,因此这一检查对结果可信度具有重要意义。
此外,README 的 Checklist 部分说明:该任务对 Evaluation Harness 而言属于新增任务,并已对照 harness v0.3.0 版本完成校验;同时任务明确标注了其"主变体"定位,并说明了各语言变体的评测目标与对应的已发布评测协议(即 Stable LM 2 1.6B 技术报告),方便后续维护者与使用者溯源。
引用方式
在论文或技术报告中引用该任务背后的数据集与评测口径时,可使用 README 中提供的两条文献:
@misc{ author={Paperno, Denis and Kruszewski, Germán and Lazaridou, Angeliki and Pham, Quan Ngoc and Bernardi, Raffaella and Pezzelle, Sandro and Baroni, Marco and Boleda, Gemma and Fernández, Raquel}, title={The LAMBADA dataset}, DOI={10.5281/zenodo.2630551}, publisher={Zenodo}, year={2016}, month={Aug} } @article{bellagente2024stable, title={Stable LM 2 1.6 B Technical Report}, author={Bellagente, Marco and Tow, Jonathan and Mahan, Dakota and Phung, Duy and Zhuravinskyi, Maksym and Adithyan, Reshinth and Baicoianu, James and Brooks, Ben and Cooper, Nathan and Datta, Ashish and others}, journal={arXiv preprint arXiv:2402.17834}, year={2024} }前者对应 LAMBADA 原始论文,后者对应 Stable LM 2 1.6B 技术报告——即该多语言评测任务所匹配的已发布评测设置。在复现对比实验时,请同时引用这两篇文献以保证评测口径可追溯。
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考