深入解析微软研究院的最新代码生成模型 phi-1
在大型语言模型(LLMs)的研究领域,微软研究院的最新成果 "Textbooks Are All You Need" 论文(以下简称为 TAAYN
论文)。该论文介绍了phi-1
的新型代码生成模型,旨在证明通过构造高质量的预训练数据,小模型能够在较低的训练成本下,达到显著优于更大规格模型的性能。
整个系列的宗旨是研究在「小模型尺寸」,「小数据规模」,「高数据质量」的综合配置下,小模型(SLM)能达到怎样的效果,研究的核心是「数据质量」
术语解释
-
Transformer:一种用于自然语言处理的神经网络架构,依靠自注意机制处理序列数据。
-
HumanEval:评估Transformers等模型的代码生成能力,检查其编程任务解决效果,由OpenAI发布。
-
MBPP(Mostly Basic Python Programs):是一个包含多样化基本Python编程任务的数据集,主要用于评估和训练AI模型的代码生成和理解能力。
-
鲁棒性:是指系统在面对不确定性、噪声或变化条件下仍能保持稳定和有效性能的能力。
phi-1 模型概述
phi-1
Phi系列的开山之作, 一个基于 Transformer 的模型,拥有 1.3B(13亿)参数,主要面向Python代码任务。使用了从网络(web)上精选的 "教科书质量数据" (6B 个 token)以及用 GPT-3.5 合成的教科书和练习(1B 个 token)。尽管规模小,phi-1 在 HumanEval 和 MBPP 基准测试中的通过率分别达到了 50.6% 和 55.5%。
训练细节和数据选择
phi-1 的训练依赖于三个主要数据集:
-
1、过滤后的代码语言数据集:这是 The Stack 和 StackOverflow 的子集,通过使用基于语言模型的分类器获得(约 6B 个 token)。
- 数据来源:Web
- 数据标注:从超过3500万个文件/样本,总计超过350亿个标记。使用GPT-4对这些文件(约10万个样本)中的一小部分进行质量注释:给定一个代码片段,模型会被提示“确定其对想要学习基本编码概念的学生的教育价值”。由原始的35B原始Web数据得到6B的训练数据
此处具体的prompt没给,大致为:给定以下代码片段,来标记该代码片段是否对学生教学含有价值:{code snippet}
论文中还提到,即使是不搞后面的东西,仅仅通过这一步数据标记过滤操作,原始的数据即使训练了200B个token性能也远不及用过滤后的75Btoken性能好。前者
HumanEval
评分12.19%,后者17.68% -
2、合成教科书数据集(Pretrain):由 GPT-3.5 生成的 Python 教科书,约 1B 个 token。
- 利用GPT合成数据的关键在于保证质量的前提下如何保证数据的多样性,减少重复。这一点文中并没有详细阐述,[而是直接引用了TinyStories]。TinyStories使用GPT-3.5生成了一个短故事的数据集,具体prompt如下:
Write a short story (3-5 paragraphs) which only uses very simple words that a 3 year old child would likely understand. The story should use the verb "decorate", the noun "thunder" and the adjective "ancient". The story should have the following features: the story should contain at least one dialogue, the story has a bad ending. Remember to only use simple words!
主要想法是: 先准备一个名字、动词、形容词的待选词表,以及一些故事的待选feature(如bad ending),然后每次随机采样这些单词和feature组成上述prompt,要求生成结果必须包含这些单词以及满足feature需求,从而保证多样性。这跟现在的各类SFT数据合成方式在原理上是类似的,本质上都是基于随机种子+prompt设计生成特定需求的数据
- 3、合成练习数据集:由 GPT-3.5 生成的 Python 练习和解答,约 180M 个 token。
- 同
2
的Pretrain,3.5需要返回函数名、函数注释、函数的具体实现,具体例子如下图 - 对于生成的数据,作者通过n-gram和embedding相似度检索的方式,进行了HumanEval测试集的去重
- 同
这些数据集的组合被称为 "CodeTextbook",在预训练阶段使用 1-2
,以获得基础模型 phi-1-base。然后,使用3
作为 "CodeExercises" 数据集进行微调[SFT]
,以获得 phi-1。
微调后的模型能力提升
微调后的 phi-1 在执行微调数据集中未包含的任务时也显示出了显著的提高,包括管理复杂的算法任务和使用外部库。这表明微调过程可能帮助模型重组和巩固了在预训练过程中获得的知识。
论文中还给出了几个例子,有兴趣可以去翻第3大章节
第四大章节内容简述
对 LLM 级非常规问题的评估
评估phi-1在HumanEval上的表现是否因数据集小或记忆缺失而受到影响。为了避免偏见,新评估问题由独立团队设计,他们没有接触到CodeExercises数据集或最终模型。这些新问题不太可能在真实世界的代码库或编码练习中出现。
使用GPT-4评分候选方案的评估方法,有两个主要优点:利用GPT-4的知识和生成能力获得更细致的信号;不需要测试。通过新设计的问题进行评估,结果与HumanEval一致,phi-1的得分显著高于StarCoder,增加了对phi-1性能有效性的信心。
第五大章节内容简述
作者为了避嫌,把CodeExercises
数据集跟HumanEval
中相似的文件进行裁剪,进行了超过 40% 的强力模糊去重,重新训练后的 phi-1 仍然优于 StarCoder
缺点
虽然通过简单练习进行微调显著提升了模型的整体性能,但有些内在限制无法仅通过微调克服。首先,我们的模型只有1.3B参数、7B参数,这限制了它处理复杂任务的能力,比如开发复杂的Flask应用程序。相比StarCoder或ChatGPT,还有几个其他弱点:对提示变化敏感,提示长度增加会显著影响性能,生成结果对略微修改的提示有很大差异。
对自然语言输入的敏感性。phi-1在处理自然语言方面的鲁棒性较差,特别是在模糊提示下。可能是因为训练过程中过滤掉了某些类型的数据以保证教材级质量。例如,模型难以处理“unchanged”这个术语,并且难以理解提示中的编号列表。
不擅长计数和空间推理。我们的模型在处理涉及计数和空间推理的任务上表现较差,难以精确保持场景中元素的数量和位置。例如:
它生成了一个额外的文本字段,并将 按钮错放到了场景中。
结论
TAAYN 论文证明了高质量数据集对于训练高效代码生成模型的重要性。phi-1 模型以其较小的规模和数据量,在代码生成任务上超越了几乎所有开源模型,这为我们提供了一个重要的启示:在自然语言处理和相关领域中,开发高质量的数据集是推动研究进展的核心方向。