基础执行环境信息

下载数据集

本实验中,我们使用DeepMath-103K数学推理训练集。DeepMath-103K是一个高难度的数学数据集,包含了103K个样本,每个样本带有难度标注以及来自DeepSeek-R1的三条推理路径。此外,DeepMath-103K的一大特点是针对现存的各大数学测试集进行了去重操作,确保训练集中不包含主流数学测试集的样本。

Tokenizer与chat_template

Tokenizer的作用是把字符串形式的自然语言文本转化为模型可接受的输入(一个整数id列表)。chat_template是大模型特有的内容,定义了如何把请求组织成对话的形式。

数据集预处理

我们主要对数据进行以下两步预处理:

  1. 筛选数据,只保留答案为纯数字的问题
  2. 长度筛选,只保留长度小于4096的问题

长度筛选

为了训练方便,我们以Qwen/Qwen2.5-Math-1.5B的最大长度4096为界,只保留长度小于模型最大长度的样本

训练模型

实验方便起见,我们使用Qwen/Qwen2.5-Math-1.5B模型作为实验的基底。Qwen/Qwen2.5-Math-1.5B是一个基座模型,未经过指令微调,因此无法进行正常的指令输出,只能进行普通的ICL生成。我们将加载这个模型,并以BF16的精度进行微调。实验使用单张80GB显存的A100。

测试

训练完模型后,我们需要测试训练得到的模型的性能。我们使用广泛使用的math500测试集。math500是MATH测试集的子集,包含500个高中竞赛级别的数学问题。每个问题标注有对应的难度。

模型生成

我们使用vllm作为我们的推理后端。base_model路径填写实际要测试的模型的路径。

数学评测

在这里,我们使用基于规则匹配的方法判断数学题的答案是否正确。我们首先需要从生成的答案中抽取最终的答案值。根据训练时的设定,生成的答案一般会包含在\\boxed{}标签中,因此我们可以利用正则表达式来从生成结果中抽取答案,然后将其与正确答案进行比对

Case Study

在这里,我们随机查看模型生成的内容,观察其生成的特点。通过随机观察样本,我们可以发现:

  1. 微调后的模型有了基本的指令遵循能力
  2. 模型出现明显的反思倾向,出现大量的“confirm”字样,并且倾向于使用代码来对答案进行检验