如何获取高质量数据进行代码指令调优?

发布于 2024-9-10 11:56
浏览
0收藏

之前很多研究都是生成、发现、过滤高质量的通用指令微调数据,而大家对代码任务的越发关注,如何构建更好的代码指令调整数据也越发重要。

下面给大家带来一篇筛选高质量代码指令微调数据的文章,主要基于指令的复杂性、回复质量和指令的多样性三个维度来进行样本的筛选,同时也指出了当前部分代码指令数据在HumanEval上存在严重的数据泄露。

Paper: https://arxiv.org/abs/2409.03810
Github: https://github.com/banksy23/XCoder
Data-HF: https://huggingface.co/datasets/banksy235/XCoder-80K

数据筛选

如何获取高质量数据进行代码指令调优?-AI.x社区

数据筛选过程主要从三个维度(指令复杂性、响应质量和指令多样性)从数据池中选择样本。

对于一个数据池 ,首先使用复杂性评分器 和单元测试模型 来计算每个数据的复杂性评分 和质量评分 。然后,对复杂性评分和质量评分进行归一化得到 和 ,经过线性组合后,得到整体评分 ,最后将数据池 进行排序,并根据多样性进行迭代采样,直到筛选数据集 达到预计大小为止,算法流程如下图所示。

如何获取高质量数据进行代码指令调优?-AI.x社区

  • 复杂性评分器:利用self-instruct方法获取一个小规模的种子数据 ,然后根据WizardCoder方法进行提示词 次深度进化,产生 轮次数据,将轮次是为复杂性的度量值,训练复杂性评分器。
  • 单元测试模型:代码通过测试用例数量可以作为响应质量的度量,利用6k数据训练LLaMA3-70B-Base模型来作为单元测试模型。在测试过程中,单元测试模型为每个训练样本生成12个测试用例,并执行单元测试程序,将通过的测试用例数量作为质量评分。


如何获取高质量数据进行代码指令调优?-AI.x社区


  • 多样性采样:迭代式从数据池中选择样本 ,当该样本对数据集 多样性做成贡献时,填入数据集 。样本 的多样性的贡献采用 表示,当 为真时,值等于1,被填入数据集 。 为样本 与 中最近样本之间的嵌入距离,τ

效果分析

为了构建最佳的代码指令微调数据集,收集了各种可用的开源数据集,共2.5M样本。优于数据池过大,经过以下步骤过滤、去重,最终获得336K样本。

  • 选取学术工作数据集:Magicoder-OSS-Instruct、Magicoder-Evol-Instruct和Code-Feedback
  • 选择了长度最长的200K个样本
  • 选择复杂性评分最高的200K个样本
  • 去重

如何获取高质量数据进行代码指令调优?-AI.x社区

LLaMA3-8B-Base上采用Xcoder数据进行了实验,如下表所示,在仅使用40K数据在LiveCodeBench和BigCodeBench上就取得了优于基线的性能;增加到80K数据时,指标持续提高。

如何获取高质量数据进行代码指令调优?-AI.x社区

基于LLaMA3-70B-Base在Xcoder数据上训练了XCoder-70B模型,成为效果最佳的开源的代码大模型。

如何获取高质量数据进行代码指令调优?-AI.x社区

HumanEval上不是最优,是因为Magicoder-Evol-Instruct和Codefuse-Evol-Instruct数据在HumanEval存在数据泄露情况。

如何获取高质量数据进行代码指令调优?-AI.x社区

并提出了TLI(测试泄露指标)来量化训练集对测试集泄露数据程度。主要对两个数据集生成n-gram片段,并测量每个测试样本的n-gram片段与所有训练样本的n-gram片段之间的重叠情况,其中,测试样本中的公共n-gram片段个数与测试样本中的总n-gram片段个数的比率作为测试样本 与训练样本 之间的相似度分数。所有测试集中的相似度分数的平均值作为TLI值,其中,TLI值越高,泄露风险越大。

如何获取高质量数据进行代码指令调优?-AI.x社区

消融实验,三个维度的指标对于最终数据的选择均有益。

如何获取高质量数据进行代码指令调优?-AI.x社区

针对复杂性评估,可以发现杂性评分器 > 指令长度 > 困惑度 > 随机。

如何获取高质量数据进行代码指令调优?-AI.x社区

针对单元测试模型,可以发现训练的Llama3-70模型由于GPT4模型。

如何获取高质量数据进行代码指令调优?-AI.x社区

并且Xcoder选择10K数据的训练效果,就堪比随机选择160K数据效果。

如何获取高质量数据进行代码指令调优?-AI.x社区

同时,分析了XCoder的数据组成,重新评估了不同数据源的优势和劣势。

如何获取高质量数据进行代码指令调优?-AI.x社区

写在最后

大模型发展到现在,合成数据的重要性不言而喻,但需要我们注意的一点是,如果一味的增加低质量数据或模式固定的单一数据,除了增加模型训练时间外,毫无用处,甚至会带来模型过拟合等负面影响。

因此,大模型在微调过程中,无论是通用任务、还是代码任务,对数据进行多样性、质量的选择是有必要的,也许提分就在这毫厘之间。

本文转载自 NLP工作站​,作者: 刘聪NLP

已于2024-9-10 12:02:50修改
收藏
回复
举报
回复
相关推荐