之前很多研究都是生成、发现、过滤高质量的通用指令微调数据,而大家对代码任务的越发关注,如何构建更好的代码指令调整数据也越发重要。
下面给大家带来一篇筛选高质量代码指令微调数据的文章,主要基于指令的复杂性、回复质量和指令的多样性三个维度来进行样本的筛选,同时也指出了当前部分代码指令数据在HumanEval上存在严重的数据泄露。
Paper:https://github.com/banksy23/XCoderData-HF:
数据筛选
数据筛选过程主要从三个维度(指令复杂性、响应质量和指令多样性)从数据池中选择样本。
对于一个数据池,首先使用复杂性评分器和单元测试模型来计算每个数据的复杂性评分和质量评分 。然后,对复杂性评分和质量评分进行归一化得到和 ,经过线性组合后,得到整体评分 ,最后将数据池进行排序,并根据多样性进行迭代采样,直到筛选数据集达到预计大小为止,算法流程如下图所示。
效果分析
为了构建最佳的代码指令微调数据集,收集了各种可用的开源数据集,共2.5M样本。优于数据池过大,经过以下步骤过滤、去重,最终获得336K样本。
LLaMA3-8B-Base上采用Xcoder数据进行了实验,如下表所示,在仅使用40K数据在LiveCodeBench和BigCodeBench上就取得了优于基线的性能;增加到80K数据时,指标持续提高。
基于LLaMA3-70B-Base在Xcoder数据上训练了XCoder-70B模型,成为效果最佳的开源的代码大模型。
HumanEval上不是最优,是因为Magicoder-Evol-Instruct和Codefuse-Evol-Instruct数据在HumanEval存在数据泄露情况。
并提出了TLI(测试泄露指标)来量化训练集对测试集泄露数据程度。主要对两个数据集生成n-gram片段,并测量每个测试样本的n-gram片段与所有训练样本的n-gram片段之间的重叠情况,其中,测试样本中的公共n-gram片段个数与测试样本中的总n-gram片段个数的比率作为测试样本与训练样本之间的相似度分数。所有测试集中的相似度分数的平均值作为TLI值,其中,TLI值越高,泄露风险越大。
消融实验,三个维度的指标对于最终数据的选择均有益。
针对复杂性评估,可以发现杂性评分器 > 指令长度 > 困惑度 > 随机。
针对单元测试模型,可以发现训练的Llama3-70模型由于GPT4模型。
并且Xcoder选择10K数据的训练效果,就堪比随机选择160K数据效果。
同时,分析了XCoder的数据组成,重新评估了不同数据源的优势和劣势。
写在最后
大模型发展到现在,合成数据的重要性不言而喻,但需要我们注意的一点是,如果一味的增加低质量数据或模式固定的单一数据,除了增加模型训练时间外,毫无用处,甚至会带来模型过拟合等负面影响。
因此,大模型在微调过程中,无论是通用任务、还是代码任务,对数据进行多样性、质量的选择是有必要的,也许提分就在这毫厘之间。
本文转载自,作者: