【大模型微调】4.模型评估标准及操作流程

112 阅读4分钟

引言

要找到最优的模型训练策略,首先要明确模型的评估体系。

进一步可分解为三个子问题:

  • 评估标准是什么?
  • 如何进行模型评估?
  • 如何利用公开数据集进行评估?

本文将从这三个问题进行探究。

评估标准是什么?

评估一个模型性能,有很多标准。以 DeepSeek-R1 论文为例,该文章使用了三个评估标准:

  • pass@1:表示模型在第一次尝试中正确解决问题的概率。
  • cons@64:表示模型在多次尝试(如64次)中一致解决问题的概率。
  • rating:在该平台上的评分或排名,用于衡量模型在编程竞赛中的表现。

图源自 DeepSeek-R1论文

图源自 DeepSeek-R1论文

参考 LLaMA Factory 的文档,其并不支持上述的评估,而采用如下的评估指标:

性能指标:

  • BLEU-4:BLEU(Bilingual Evaluation Understudy)是一种常用的用于评估机器翻译质量的指标。BLEU-4 表示四元语法 BLEU 分数,它衡量模型生成文本与参考文本之间的 n-gram 匹配程度,其中 n=4。值越高表示生成的文本与参考文本越相似,最大值为 100。
  • rouge-1/rouge-2:ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是一种用于评估自动摘要和文本生成模型性能的指标。ROUGE-1 表示一元 ROUGE 分数,ROUGE-2 表示二元 ROUGE 分数,分别衡量模型生成文本与参考文本之间的单个词和双词序列的匹配程度。值越高表示生成的文本与参考文本越相似,最大值为 100。
  • rouge-l:ROUGE-L 衡量模型生成文本与参考文本之间最长公共子序列(Longest Common Subsequence)的匹配程度。值越高表示生成的文本与参考文本越相似,最大值为 100。

速度指标:

  • runtime:预测运行时间,表示模型生成一批样本所花费的总时间。单位通常为秒。
  • samples_per_second:每秒生成的样本数量,表示模型每秒钟能够生成的样本数量。通常用于评估模型的推理速度。
  • steps_per_second:每秒执行的步骤数量,表示模型每秒钟能够执行的步骤数量。对于生成模型,一般指的是每秒钟执行生成操作的次数。

如何进行模型评估?

在 LLaMA Factory 的 webui 中,可以直接在Evaluate & Predict菜单中进行模型评估。

图片

评估(evaluate)和预测(Predict)是同步进行的,因为需要先通过预测得到模型推理结果,再和 ground truth 进行比较。

如果无需保存预测结果,可取消勾选[保存预测结果]选项,默认开启。

选择好评测数据集后,可以再设置截断长度、最大生成长度。

截断长度是指模型处理文本时能接收的最大 token 数量,如果数据集的输入比较长,会进行截断,默认值为 1024,可根据实际数据集的效果适当增大该数值。

最大生成长度是指模型输出的最大 token 数量,默认值为 512,有些偏小,也可以适当调大。

设置完就会自动开启评测过程,结果会在输出目录下得到相应的eval_results.json

图片

如何利用公开数据集进行评估?

上面的评估都是采用的 Alpaca 格式构建的数据集。

下面以 MATH-500 公开数据集为例,在此公开标准数据集上进行评估。

首先使用 Git LFS 下载数据集;

安装 Git LFS

git lfs install

下载数据集仓库

git clone https://huggingface.co/datasets/HuggingFaceH4/MATH-500

MATH-500 本身是jsonl格式,且字典 key 值和 Alpaca 标准不对应,这会导致 LLaMA Factory 无法直接解析该数据集。

MATH-500 原始数据集格式

MATH-500 原始数据集格式

因此,需要通过下述脚本,进行格式转换:

import json


def convert_jsonl_to_alpaca(jsonl_path, output_json_path):
    alpaca_data = []

    with open(jsonl_path, encoding="utf-8") as infile:
        for line in infile:
            item = json.loads(line.strip())
            alpaca_item = {
                "instruction""" + item.get("problem"""),
                "input""",
                "output": item.get("solution"""),
            }
            alpaca_data.append(alpaca_item)

    with open(output_json_path, "w", encoding="utf-8") as outfile:
        json.dump(alpaca_data, outfile, ensure_ascii=False, indent=2)

    print(f"转换完成,保存到 {output_json_path}")


if __name__ == "__main__":
    # Convert the MATH-500 test data
    convert_jsonl_to_alpaca("eval_data/MATH-500_test.jsonl""eval_data/math_500_alpaca_output.json")

转换完成后,用同样的方式就可以加载数据集,并执行评估。

往期内容推荐

大模型微调相关:

1.【大模型微调】1.LLaMA-Factory简介和基本使用流程

2.【大模型微调】2.微调方法详解与模型显存占用实测3.【大模型微调】3.通过Easy Dataset构建自己的微调数据集