ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SCORE 鲁棒性评估任务全解析:在 lm-evaluation-harness 中使用 SCORE 评测 LLM 的一致性

SCORE 鲁棒性评估任务全解析:在 lm-evaluation-harness 中使用 SCORE 评测 LLM 的一致性 SCORE 鲁棒性评估任务全解析在 lm-evaluation-harness 中使用 SCORE 评测 LLM 的一致性【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harnessSCORESystematic COnsistency and Robustness Evaluation是一套由 NVIDIA 贡献到 lm-evaluation-harness 的系统性鲁棒性评测套件用于量化评估大语言模型面对选项顺序扰动、提示词改写与解码随机性时的表现稳定性。本文将以lm_eval/tasks/score/目录下的任务定义、工具函数与运行脚本为基础完整讲解 SCORE 的任务结构、鲁棒性指标Accuracy 与 Consistency Rate的计算原理并给出可直接复用的运行命令与非贪心评测的完整实操流程。SCORE 是什么为一致性而生的评测套件传统基准测试通常只关心模型在单一固定设置下的平均准确率而 SCORE 更进一步它系统性地扰动评测输入与生成过程观察模型答案是否随之漂移。一个鲁棒的模型应当在正确选项被挪到不同位置、提示词以不同措辞给出、生成 seed 变化时仍然稳定地给出同一正确答案。在 lm-evaluation-harness 中SCORE 以一组任务task与分组group的形式实现全部位于 lm_eval/tasks/score/ 目录下覆盖三个公开基准数据集MMLU-ProTIGER-Lab/MMLU-Pro参考文献 [1]更鲁棒、更具挑战性的多任务语言理解基准AGIEval参考文献 [2]以人类考试题目为核心的评测基准SCORE 选用其 7 个多项选择子集agieval-sat-math、agieval-lsat-lr、agieval-lsat-rc、agieval-logiqa-en、agieval-aqua-rat、agieval-sat-en、agieval-lsat-arHendrycks MATH参考文献 [3]数学问题求解数据集。所有 SCORE 任务都是0-shot评测即不提供任何少样本示例这保证了扰动变量是评测中唯一的自变量。任务与分组结构一张任务清单SCORE 在三个数据集上分别构建了三个分组group其组织关系由顶层组配置 score_robustness.yaml 定义group: score_robustness task: - score_robustness_agieval - score_robustness_mmlu_pro - score_robustness_math metadata: version: 1.0每个子分组又聚合了各自的鲁棒性任务。以 agi_eval/score_robustness_agieval.yaml 为例group: score_robustness_agieval task: - score_prompt_robustness_agieval - score_option_order_robustness_agieval - score_non_greedy_robustness_agieval metadata: version: 1.0完整的分组与任务对应关系如下表分组选项顺序鲁棒性提示词鲁棒性非贪心鲁棒性score_robustness_mmlu_proscore_option_order_robustness_mmlu_proscore_prompt_robustness_mmlu_proscore_non_greedy_robustness_mmlu_proscore_robustness_agievalscore_option_order_robustness_agievalscore_prompt_robustness_agievalscore_non_greedy_robustness_agievalscore_robustness_math—无score_prompt_robustness_mathscore_non_greedy_robustness_mathMMLU-Pro 与 AGIEval 各自包含 3 个鲁棒性任务而 MATH 数据集只包含 prompt 鲁棒性与 non-greedy 鲁棒性 2 个任务MATH 是开放式数学题本身不存在A-J 选项这一扰动维度。每个数据集分组下还有按子科目拆分的细粒度任务 YAML例如 mmlu_pro/ 直接使用 MMLU-Pro 的validation/test划分而 agi_eval/ 和 math/ 则进一步按aqua_rat、algebra等子集拆分为 7 个独立 YAML。从源码结构看任务实现采用共享工具函数 数据集定制函数的模式每个数据集目录下的utils_*.py通过functools.partial复用 score/utils.py 中的通用处理逻辑仅传入各自的模板文件路径与标签集合从而避免三份实现相互重复。三大鲁棒性维度测试什么、如何构造选项顺序鲁棒性Option Order Robustness该维度衡量模型对正确选项在列表中出现位置的敏感度。构造方式是将正确答案与其余每一个选项逐一交换位置形成多份同一问题、不同正确位置的评测样本。实现细节见 score/utils.py 中的option_order_robustness_process_docs对每条样本遍历标签集合MMLU-Pro 使用LABELS [A,B,C,D,E,F,G,H,I,J]即最多 10 个选项将options列表中正确项与第label_ind个选项互换同时更新answer_index与answer字段并记录always_same_option正确答案当前被放在哪个标签位。对应的 score_option_order_robustness_mmlu_pro.yaml 中为每个标签位A~J分别注册了一个per_option_macro_accuracy_{X}指标另有一个options_consistency_rate用于度量跨位置的一致性。提示词鲁棒性Prompt Robustness该维度衡量模型对提示词措辞变化的敏感度同一道题用 10 种不同措辞的提示词各问一遍。10 个提示词模板集中存放在各数据集目录下的prompt_templates.json文件中键名为prompt_robustness例如 mmlu_pro/prompt_templates.json。以 MMLU-Pro 为例10 个模板在措辞上差异显著有的要求只看选项字母You must reply with only a single letter...有的引导逐步推理Lets think step by step.有的强调输出格式必须以The best answer is (answer_letter)结尾。模板通过process_docs_add_prompts将每条样本复制 10 份并打上prompt_id0~9同时解析出options_format如\n{letter}: {option}支持{numeral}、{roman_numeral}、{lower_case_letter}等占位符。因此该任务实际上计算了10 个独立提示词下的宏平均准确率0_macro_accuracy~9_macro_accuracy外加一个整体consistency_rate见 score_prompt_robustness_mmlu_pro.yaml。非贪心鲁棒性Non-Greedy Robustness该维度衡量模型对解码随机性的敏感度固定同一提示词以temperature 0.7的采样解码分别用 5 个随机种子seed 1, 2, 3, 4, 5各生成一次考察模型答案是否保持一致。YAML 中的关键配置见 score_non_greedy_robustness_mmlu_pro.yamlgeneration_kwargs: until: [] max_gen_toks: 1024 do_sample: true temperature: 0.7非贪心评测的完整执行流程与其余两类任务不同需要多次运行 离线汇总详见下文实战指南。指标体系Accuracy 与 Consistency RateCR所有鲁棒性任务统一输出两类指标准确率Accuracy与一致性率Consistency Rate, CR。CR 的数学定义取自文献 [4]$$CR \frac{1}{|Q|} \sum_{Q_k \in Q} \sum_{y_i \in Y_k} \sum_{\substack{y_j \in Y_k \ j \neq i}}\frac{\text{sim}(y_i, y_j)}{\binom{|Y_k|}{2}}$$其中Q是问题集合Y_k是同一问题在不同扰动条件下的模型回答集合sim在 SCORE 实现中取字符串完全相等int(answer1 answer2)。直观理解CR 表示同一问题在不同扰动设置下模型任意两次回答彼此一致的平均概率取值范围 [0, 1]越接近 1 说明模型对该扰动越鲁棒。在代码层面CR 由 score/utils.py 中的calculate_consistency_rate实现对每个问题的回答集合取两两组合itertools.combinations统计相等对占全部组合的比例最后按问题数平均。不同任务通过prompt_consistency_rate、options_consistency_rate会先把模型答对但选的是新位置的情况归一化回原始选项再计算一致性避免选项搬移本身干扰 CR等包装函数接入各自的聚合逻辑。准确率指标统一采用宏平均macro average先按category科目类别分别计算准确率再对各类别取平均np.round(np.mean(...), 4)防止样本量大的类别掩盖小类别表现。实现可见 mmlu_pro/utils_mmlu_pro.py 中的per_prompt_macro_accuracy、per_option_macro_accuracy、non_greedy_macro_accuracy以及 math/math_grader.py 中面向数学符号等价性的math_equal判定。生成结果的解析同样值得注意__postprocess_pred会从模型输出中提取The best answer is ...之后的第一个 token 并做清洗translate_model_answer_to_labels则把数字、罗马数字等选项格式统一翻译回 A~J 标签确保不同options_format下的答案可比。实战指南如何运行 SCORE 评测基础要求所有 SCORE 任务面向Instruct指令微调模型设计官方 README 明确建议在运行命令中传入--apply_chat_template标志以套用模型的对话模板0-shot 设置下无需--num_fewshot。模型后端可以是hfHugging Face、vllm、openai-completions等 lm-evaluation-harness 支持的任意后端。运行选项顺序 / 提示词鲁棒性任务直接指定任务名或分组名即可例如lm_eval --model hf \ --model_args pretrainedYOUR_MODEL,dtypebfloat16 \ --tasks score_option_order_robustness_mmlu_pro \ --batch_size auto \ --apply_chat_template # 一次跑完整个 MMLU-Pro 分组含三类任务但 non-greedy 部分需另行处理见下文 lm_eval --model vllm \ --model_args pretrainedYOUR_MODEL,dtypebfloat16,tensor_parallel_size8 \ --tasks score_robustness_mmlu_pro \ --apply_chat_template运行非贪心鲁棒性任务完整五步流程非贪心评测必须配合--log_samples保存每份 seed 的预测日志其完整流程如下官方步骤见 NON_GREEDY.md为 seed1 运行评测任务名写作score_non_greedy_robustness_{DATASET_NAME}DATASET_NAME取agieval、mmlu_pro或math固定--seed1务必传--log_samples输出目录写成--output_pathSOME_OUTPUT_PATH/seed_1。若使用 vLLM 后端还需在--model_args中显式指定seed...否则采样随机性不受 harness 侧 seed 控制。重复运行 5 次将--seed与--output_path依次改为 2~5。离线汇总运行 non_greedy_summarizer.py把包含seed_1~seed_5五个子目录的父目录传给--log_dir注意不必等于第一步的--output_path只要其下存在 5 个 seed 子目录即可并用--dataset指定数据集名python lm_eval/tasks/score/non_greedy_summarizer.py \ --log_dir SOME_OUTPUT_PATH \ --dataset mmlu_pro汇总脚本会输出标准的 lm-evaluation-harness 结果表格其中包含每个 seed 的准确率seed_1_accuracy~seed_5_accuracy与整体consistency_rate并将聚合结果以{dataset}_results_{时间戳}.json写入--log_dir。仓库还提供了参数化示例脚本 non_greedy.sh其用法为./non_greedy.sh -m MODEL -t TASK -s SEED -o OUTPUT_DIR默认以 vLLM 后端、tensor_parallel_size8、gpu_memory_utilization0.9、max_model_len4096、do_sample采样并传入seed$SEED运行。需要留意的两点由于必须开启--log_samples每个 seed 的预测结果都会落盘会占用额外磁盘空间汇总脚本对每个数据集/子科目严格校验只能有一个匹配的samples_*.jsonl重复则抛FileExistsError缺失则抛FileNotFoundError请勿在同一 seed 目录下混入多次运行的日志。非贪心评测的源码工作方式non_greedy_summarizer.py在读取各 seed 的 JSONL 日志后按question_id与category将 5 次运行结果纵向合并pandas.merge得到每条问题的 5 个回答随后对 agieval / mmlu_pro直接以字符串相等判定final_answer_seed_X gt计算逐 seed 准确率用calculate_consistency_rate计算 CR对 math改用math_equal数学表达式等价判定计算准确率用calculate_math_consistency_rate计算 CR——这保证了$22$与$4$这类表达等价也能被正确计为一致。最终通过lm_eval.utils.make_table打印标准结果表并以handle_non_serializable序列化落盘。注意事项与使用前提Instruct 模型专用SCORE 的提示词均要求模型遵循以The best answer is ...结尾的指令式格式基座base模型通常难以稳定遵循请配合--apply_chat_template使用。0-shot 约束任务定义中未配置 fewshot 示例评测目标就是隔离扰动变量无需、也不应额外传入--num_fewshot。MATH 的差异MATH 只有 prompt 与 non-greedy 两个鲁棒性任务且答案比对使用符号等价判定math_grader.pyCR 的语义与前两者略有不同。vLLM 后端注意非贪心任务中模型的采样 seed 必须在--model_args里设置seed$SEEDharness 侧的--seed只控制数据采样与打乱两者需要同时固定才能保证可复现。数据访问MMLU-Pro 直接从 Hugging Face 拉取TIGER-Lab/MMLU-ProAGIEval 与 MATH 的加载逻辑分别位于 agi_eval/utils_agieval.py 与 math/utils_math.py其中 MATH 还附带 to_be_fixed_questions.json 用于标注待修正的样本。参考文献[1] Wang, et al. MMLU-Pro: A More Robust and Challenging Multi-Task Language Understanding Benchmark. arXiv preprint arXiv:2406.01574 (2024)。[2] Zhong, et al. AGIEval: A Human-Centric Benchmark for Evaluating Foundation Models. arXiv preprint arXiv:2304.06364 (2023)。[3] Hendrycks et al. Measuring Mathematical Problem Solving With the MATH Dataset. arXiv:2103.03874 (2021)。[4] Yukun et al. Improving the Robustness of Large Language Models via Consistency Alignment. arXiv:2403.14221 (2024)。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表