大家好,我是刘聪NLP。
之前很多研究都是生成、发现、过滤高质量的通用指令微调数据,而大家对代码任务的越发关注,如何构建更好的代码指令调整数据也越发重要。
下面给大家带来一篇筛选高质量代码指令微调数据的文章,主要基于指令的复杂性、回复质量和指令的多样性三个维度来进行样本的筛选,同时也指出了当前部分代码指令数据在HumanEval上存在严重的数据泄露。
Paper: https://arxiv.org/abs/2409.03810
Github: https://github.com/banksy23/XCoder
Data-HF: https://huggingface.co/datasets/banksy235/XCoder-80K
数据筛选
数据筛选过程主要从三个维度(指令复杂性、响应质量和指令多样性)从数据池中选择样本。
对于一个数据池 ,首先使用复杂性评分器 和单元测试模型 来计算每个数据的复杂性评分 和质量评分 。然后,对复杂性评分和质量评分进行归一化得到 和 ,经过线性组合后,得到整体评分 ,最后将数据池 进行排序,并根据多样性进行迭代采样,直到筛选数据集 达到预计大小为止,算法流程如下图所示。
复杂性评分器:利用self-instruct方法获取一个小规模的种子数据 ,然后根据WizardCoder方法进行提示词 次深度进化,产生 轮次数据,将轮次是为复杂性的度量值,训练复杂性评分器。 单元测试模型:代码通过测试用例数量可以作为响应质量的度量,利用6k数据训练LLaMA3-70B-Base模型来作为单元测试模型。在测试过程中,单元测试模型为每个训练样本生成12个测试用例,并执行单元测试程序,将通过的测试用例数量作为质量评分。 多样性采样:迭代式从数据池中选择样本 ,当该样本对数据集 多样性做成贡献时,填入数据集 。样本 的多样性的贡献采用 表示,当 为真时,值等于1,被填入数据集 。 为样本 与 中最近样本之间的嵌入距离, 为超参数(0.945)。
效果分析
为了构建最佳的代码指令微调数据集,收集了各种可用的开源数据集,共2.5M样本。优于数据池过大,经过以下步骤过滤、去重,最终获得336K样本。
选取学术工作数据集:Magicoder-OSS-Instruct、Magicoder-Evol-Instruct和Code-Feedback 选择了长度最长的200K个样本 选择复杂性评分最高的200K个样本 去重
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的数据组成,重新评估了不同数据源的优势和劣势。
写在最后
大模型发展到现在,合成数据的重要性不言而喻,但需要我们注意的一点是,如果一味的增加低质量数据或模式固定的单一数据,除了增加模型训练时间外,毫无用处,甚至会带来模型过拟合等负面影响。
因此,大模型在微调过程中,无论是通用任务、还是代码任务,对数据进行多样性、质量的选择是有必要的,也许提分就在这毫厘之间。
PS:给公众号添加【星标⭐️】不迷路!您的点赞、在看、关注是我坚持的最大动力!
欢迎多多关注公众号「NLP工作站」,加入交流群,交个朋友吧,一起学习,一起进步!
往期推荐:
一大堆Chinese Llama3正在袭来 LLM2LLM:迭代数据增强策略提升大模型微调效果 如何快速提高大模型的向量表征效果? RAG系统中答案无关片段对LLMs生成答案有何影响? InternLM2技术报告 Qwen1.5-MoE模型:2.7B的激活参数量达到7B模型的性能 RAG与Long-Context之争—没必要争 角色扮演大模型的碎碎念 自我蒸馏方法-减轻大模型微调过程中的灾难性遗忘 Yi技术报告细节分享 大模型增量预训练新技巧-解决灾难性遗忘 如何提高LLMs的文本表征(Text Embedding)能力? DEITA-大模型指令微调的数据高效筛选方法 大模型微调技巧 | 高质量指令数据筛选方法-MoDS 辟谣!微软撤回声称ChatGPT为20B参数的论文,并给出解释。 如何看待微软论文声称 ChatGPT 是 20B (200亿) 参数量的模型? 大模型微调技巧-在Embeeding上加入噪音提高指令微调效果 如何从数据集中自动识别高质量的指令数据 BaiChuan2技术报告细节分享&个人想法 大模型LLM微调经验总结&项目更新 打造LLM界的Web UI 是我们在训练大模型,还是大模型在训练我们? Llama2技术细节&开源影响 大模型时代-行业落地再思考 垂直领域大模型的一些思考及开源模型汇总 如何评估大模型-LLMs的好坏?