StarCoder2-15B-Instruct 发布:完全透明可许可的自对齐代码模型
StarCoder2-Instruct: Fully Transparent and Permissive Self-Alignment for Code Generation
Hugging Face 发布 StarCoder2-15B-Instruct-v0.1,这是首个用完全可许可且透明的管线自对齐训练的代码大语言模型。它用 StarCoder2-15B 自行生成数千条指令-响应对再微调自身,不使用人工标注或大型闭源模型的蒸馏数据,在 HumanEval 上取得 72.6 分,超过 CodeLlama-70B-Instruct 的 72.0 分。
原文公开了完全透明的自对齐数据管线,读者可据此了解不依赖 GPT-4 蒸馏也能训练代码指令模型。
指令微调是一种微调方法,使大型语言模型(LLM)具备遵循自然和人类编写指令的能力。然而,对于编程任务,大多数模型是基于人类编写的指令(成本非常高)或由巨型专有 LLM 生成的指令(可能不被允许)进行微调的。我们推出了 StarCoder2-15B-Instruct-v0.1,这是首个完全自对齐的代码 LLM,采用完全开放且透明的流程训练而成。我们的开源流程使用 StarCoder2-15B 生成数千个指令-响应对,然后用于微调 StarCoder-15B 本身,无需任何人工标注或从巨型专有 LLM 中蒸馏的数据。
StarCoder2-15B-Instruct 在 HumanEval 上取得了 72.6 分,甚至超过了 CodeLlama-70B-Instruct 的 72.0 分!在 LiveCodeBench 上的进一步评估表明,自对齐模型甚至优于使用 GPT-4 蒸馏数据训练的同一模型,这意味着 LLM 从自身分布内的数据中学习可能比从教师 LLM 的偏移分布中学习更有效。
方法
我们的数据生成流程主要包括三个步骤:
- 从 The Stack v1 中提取高质量且多样化的种子函数,这是一个包含大量宽松许可源代码的语料库。
- 创建多样化且贴近实际的代码指令,融入种子函数中存在的不同代码概念(例如数据反序列化、列表拼接和递归)。
- 对于每条指令,通过执行引导的自验证生成高质量的响应。
在以下各节中,我们将详细探讨这些方面。
收集种子代码片段
为了充分释放代码模型的指令遵循能力,应当让它接触涵盖广泛编程原则和实践的多样化指令集。受 OSS-Instruct 的启发,我们进一步通过从开源代码片段中挖掘代码概念来促进这种多样性,具体而言,是从 The Stack V1 中提取格式良好的种子 Python 函数。
对于种子数据集,我们仔细提取 The Stack V1 中所有带有文档字符串的 Python 函数,使用 autoimport 推断所需依赖,并对所有函数应用以下过滤规则:
- 类型检查:我们应用 Pyright 启发式类型检查器来移除所有产生静态错误的函数,这标志着可能存在问题的条目。
- 去污染:我们检测并移除所有我们评估所用的基准条目。我们对解决方案和提示均使用精确字符串匹配。
- 文档字符串质量过滤:我们利用 StarCoder2-15B 作为评判者来移除文档质量差的函数。我们用 7 个少样本示例提示基础模型,要求它以"Yes"或"No"回应是否保留该条目。
- 近似去重:我们利用 MinHash 和局部敏感哈希,以 0.5 的 Jaccard 相似度阈值过滤数据集中的重复种子函数。这与应用于 StarCoder 训练数据的流程相同。
该过滤流程从 500 万个带有文档字符串的函数中筛选出 25 万个 Python 函数的数据集。此过程深受 MultiPL-T 中所用数据收集流程的启发。
Self-OSS-Instruct
收集种子函数后,我们使用 Self-OSS-Instruct 生成多样化的指令。具体来说,我们采用上下文学习让基础 StarCoder2-15B 从给定的种子代码片段中自行生成指令。此过程使用了 16 个精心设计的少样本示例,每个示例格式为 (代码片段, 概念, 指令)。指令生成过程分为两步:
- 概念提取: 对于每个种子函数,StarCoder2-15B 被提示生成函数中存在的代码概念列表。代码概念指的是编程中使用的基础原则和技术,如模式匹配和数据类型转换,这些都是开发者必须掌握的关键内容。
- 指令生成: 随后,StarCoder2-15B 被提示自行生成一个编码任务,该任务包含已识别的代码概念。
最终,这一过程生成 238k 条指令。
响应自验证
根据 Self-OSS-Instruct 生成的指令,我们的下一步是为每条指令匹配高质量的响应。以往实践通常依赖于从更强的教师模型(如 GPT-4)中蒸馏响应,希望以此获得更高质量的成果。然而,蒸馏专有模型会导致非宽松许可,而且更强的教师模型并不总是可用。更重要的是,教师模型也可能出错,教师与学生之间的分布差距可能有害。
我们提出通过明确指示模型在生成自然语言交织的响应后生成测试进行自我验证,从而自我对齐 StarCoder2-15B。这一过程类似于开发者测试其代码实现的方式。具体而言,对于每条指令,StarCoder2-15B 生成 10 个格式为 (自然语言响应, 测试) 的样本,我们过滤掉在沙盒环境下测试执行失败的那些。然后,我们从每条指令的通过响应中随机选择一个,加入最终的 SFT 数据集。总共,我们以温度 0.7 为 238k 条指令生成了 2.4M(10 x 238k)个响应,其中 500k 个通过了执行测试。去重后,我们剩下 50k 条指令,每条指令配有一个随机通过的响应,最终用作我们的 SFT 数据集。
评估
在流行且严格的 EvalPlus 基准测试中,StarCoder2-15B-Instruct 在其规模下脱颖而出,成为性能最佳的宽松许可 LLM,超越了规模更大的 Grok-1 Command-R+、DBRX,同时与 Snowflake Arctic 480B 和 Mixtral-8x22B-Instruct 相近。据我们所知,StarCoder2-15B-Instruct 是首个具有完全透明且宽松许可管道的代码 LLM,达到 70+ HumanEval 分数。它大幅超越了 OctoCoder,后者是之前具有透明管道的最先进宽松许可代码 LLM。
即使与具有限制性许可的强大 LLM 相比,StarCoder2-15B-Instruct 也保持竞争力,超越 Gemini Pro 和 Mistral Large,并可与 CodeLlama-70B-Instruct 相媲美。此外,完全基于自生成数据训练的 StarCoder2-15B-Instruct,与 OpenCodeInterpreter-SC2-15B 非常接近,后者是在 GPT-3.5/4 蒸馏数据上微调 StarCoder2-15B。
除了 EvalPlus,我们还使用类似或更小尺寸的最先进开源模型在 LiveCodeBench 上进行了评估,该基准包含 2023-09-01 之后创建的新编程问题,以及针对数据科学程序的 DS-1000。在 LiveCodeBench 上,StarCoder2-15B-Instruct 在评估的模型中取得了最佳结果,并且持续优于蒸馏 GPT-4 数据的 OpenCodeInterpreter-SC2-15B。在 DS-1000 上,尽管 StarCoder2-15B-Instruct 仅在非常有限的数据科学问题上进行训练,但其表现仍然具有竞争力。
结论
StarCoder2-15B-Instruct-v0.1 首次展示了我们可以在不依赖 GPT-4 等更强教师模型的情况下,创建强大的指令调优代码模型。该模型表明,自对齐——即模型利用自身生成的内容进行学习——对代码同样有效。它完全透明,并允许蒸馏,这使其有别于其他更大、许可宽松但不透明的模型,如 Snowflake-Arctic、Grok-1、Mixtral-8x22B、DBRX 和 CommandR+。我们已将数据集和整个流程,包括数据整理和训练,完全开源。我们希望这项开创性工作能够激发该领域未来更多的研究与开发。
资源
- StarCoder2-15B-Instruct-v0.1:指令调优模型
- starcoder2-self-align:自对齐流程
- StarCoder2-Self-OSS-Instruct:自生成的指令调优数据集
引用
@article{wei2024selfcodealign,
title={SelfCodeAlign: Self-Alignment for Code Generation},
author={Yuxiang Wei and Federico Cassano and Jiawei Liu and Yifeng Ding and Naman Jain and Zachary Mueller and Harm de Vries and Leandro von Werra and Arjun Guha and Lingming Zhang},
year={2024},
journal={arXiv preprint arXiv:2410.24198}
}
来源:Hugging Face Blog · hf-mirror.com