phi-1一种新的大型编程语言模型,其规模明显小于竞争模型:phi-1 是一个基于 Transformer 的模型,拥有 13 亿参数,在8个A100上训练了 4 天,使用了从网络上筛选的“教材质量”数据(60 亿 tokens)和用 GPT-3.5 合成生成的教材和练习(10 亿 tokens)。尽管规模较小,phi-1 在 HumanEval 上的 pass@1 准确率达到 50.6%,在 MBPP 上达到 55.5%。与phi-1-base(我们在对编码练习数据集进行微调前的模型)和 phi-1-small(一种使用和phi-1 相同的流程训练的 3.5 亿参数的较小模型,在 HumanEval 上仍然达到 45%)相比,它还展示了令人惊讶的突现特性。
论文:https://arxiv.org/pdf/2306.11644.pdf 祝:大家端午安康
1 引言
在过去的十年里,训练大型人工神经网络的方法取得了非凡的进步,尤其是在发现 Transformer 架构 之后,然而这一成功背后的科学依然有限。在一个庞大且令人困惑的结果数组中,Transformer 引入的同时,一种表现得有些可预测的秩序出现了,即当我们提高计算量或网络规模时,性能会有所改善 ,这种现象现在被称为规模定律。之后深度学习的规模探索受到这些规模定律的指导 ,这些定律的变体的发现导致了性能的快速提升 。
在这项工作中,我们紧跟 Eldan 和 Li 的脚步,探讨了通过提高数据质量可以获得的改进。众所周知,更高质量的数据会带来更好的结果,例如,数据清洗是现代数据集创建的重要部分 ,它还可以带来其他一些好处,如略小的数据集 或允许在数据上进行更多的传递。Eldan 和 Li 最近关于 TinyStories(一个用于教神经网络英语的高质量合成数据集)的工作表明, 事实上高质量数据的影响远远不止这些 : 提高数据质量可以极大地改变规模定律的形状,从而可能使得更小规模的训练和模型能够匹配大规模模型的性能。在这项工作中,我们超越了 Eldan 和 Li 的初步尝试,证明了高质量数据可以提高大型语言模型(LLM)的 SOTA,同时显著减小数据集规模和训练计算量。值得注意的是,较小的模型需要较少的训练,可以显著降低 LLM 的环境成本。

表 1:我们在可用时使用自报分数。尽管在大大较小的规模上进行训练,phi-1 在 HumanEval 和 MBPP 上胜过竞争模型,除了 GPT-4(同样,WizardCoder 在 HumanEval 上表现更好,但在 MBPP 上表现较差)。
我们将关注训练用于编码的 LLM,特别是根据文档字符串编写简单 Python 函数。后者工作中提出的评估基准 HumanEval 已被广泛用于比较 LLM 在编码方面的性能。我们通过训练一个拥有 13 亿参数的模型(我们称之为 phi-1)来展示高质量数据打破现有规模定律的能力,大约在 70 亿 tokens上进行8轮训练(稍多于 500 亿 tokens 总计),然后在不到 2 亿 tokens 上进行微调。简而言之,我们在“教材质量”数据上进行预训练,这些数据既包括合成生成的(使用 GPT-3.5),也包括从网络来源筛选出的,我们在“教材练习类似”的数据上进行微调。尽管在数据集规模和模型规模方面都比竞争模型小数个数量级(见表 1),我们在 HumanEval 上的 pass@1 准确率达到了 50.6%,在 MBPP(大部分基本 Python 程序)上的 pass@1 准确率达到了 55.5%,这是使用单一 LLM 生成的最佳自报数字之一。
在第 2 节中,我们介绍了一些训练过程的细节,并讨论了我们的数据选择过程在实现这一结果方面的重要性。此外,尽管与现有模型相比,phi-1 的 tokens 数量要少得多,但它仍然具有突现特性。
在第 3 节中,我们讨论了这些突现特性,特别是通过比较 phi-1 和 phi-1-small 的输出,确认参数数量在突现中起关键作用,后者是使用相同流程训练的只有 3.5 亿参数的模型。本节中使用的方法让人想起了 Sparks of AGI 论文,该论文主张摆脱静态基准测试来评估 LLM 的性能。
最后在第 4 节中,我们讨论了评估模型的其他基准,在第 5 节中,我们研究了我们的训练数据与 HumanEval 的可能污染。
更多相关工作:我们的工作是使用 LLM 进行程序合成的最近项目的一部分。我们的方法也是使用现有 LLM 为新一代 LLM 的训练合成数据的新兴趋势的一部分。关于这种“递归训练”是否会导致 LLM 范围变窄的争论仍在进行中,关于反面观点的论文请参见相关论文。需要注意的是,在这篇论文中,我们专注于有意设计的狭义任务,在这种情况下,在特定任务上获得比教师 LLM 更好的性能似乎是合理的。
训练细节与高质量数据的重要性

图 2.1:HumanEval 上的 Pass@1 准确率(%)。柱状图的分组对应于通常的扩展维度,包括增加计算时间(在此从 26B 个 token 到 76B 个 token 的更多数据传递)或增加模型的参数数(在此从 350M 到 1.3B)。每组内的每一列对应不同的训练数据集:(A)第一(橙色)列表示在标准数据集上训练的模型的性能,该数据集来自 The Stack 的去重 Python 文件(加上 1.3B 参数模型的 StackOverflow);(B)第二(浅绿色)列表示在我们新的数据集组合 CodeTextbook 上训练的模型的性能;(C)最后,第三(深绿色)列对应于在我们新的 CodeExercises 数据集上微调的第二列模型。我们强调,即使没有任何微调,我们在 CodeTextbook 数据集上训练的 phi-1-base 模型仅使用 1.3B 参数模型就实现了 29% 的 HumanEval 性能。之前在 HumanEval 上实现接近 30% 性能的最小模型是 Replit-Finetuned,参数为 2.7B,其训练 token 数比我们多 100 倍 。在此基础上,对我们的 CodeExercises 数据集进行微调以获得 phi-1 不仅使我们在 HumanEval 上获得了最高 51% 的性能,而且还解锁了更多意想不到的编码能力(参见第 3 节)。
正如本文标题所暗示的,我们的模型依赖的核心成分是教材质量的训练数据。与之前使用诸如 The Stack (包含具有许可证的源代码的仓库)和其他基于网络的数据集(例如,StackOverflow 和 CodeContest )的标准文本数据源进行代码生成的工作不同,我们认为这些来源无法最佳地教导模型如何进行理性和算法规划。另一方面,我们的模型架构和训练方法相当传统(第 2.3 节),因此我们主要用这一部分来解释我们是如何策划我们的数据的。
标准代码数据集形成了一个庞大且多样化的语料库,涵盖了广泛的主题和用例。然而,基于对随机样本的手动检查,我们观察到许多这样的片段对于学习编码基础知识并不具有很好的教学作用,并且存在以下几个缺点:
- 许多样本不是自包含的,这意味着它们依赖于其他模块或文件,这些模块或文件位于片段之外,使得在没有额外上下文的情况下难以理解。
- 典型的示例不涉及任何有意义的计算,而是包括琐碎或模板代码,例如定义常量、设置参数或配置 GUI 元素。
- 包含算法逻辑的样本通常隐藏在复杂或文档不足的函数中,使其难以理解或学习。
- 示例在某些主题或用例上倾斜,导致数据集中编码概念和技能的分布不平衡。
人们可以想象,如果一个人试图从这些数据集中学习编码技能,将会遇到多么令人沮丧和低效的情况,因为他们必须处理数据中的大量噪声、歧义和不完整性。我们假设这些问题也会影响语言模型的性能,因为它们降低了将自然语言映射到代码的信号的质量和数量。我们推测,语言模型将受益于一个具有人类认为是良好“教材”的相同特质的训练集:它应该是清晰的、自包含的、具有教学意义的和平衡的。
在这项工作中,我们直接应对这一挑战,并表明通过有意选择和生成高质量数据,我们可以用更小的模型和更少的计算实现代码生成任务的最先进结果。我们的训练依赖于三个主要的数据集:
- 过滤后的代码语言数据集,它是 The Stack 和 StackOverflow 的一个子集,通过使用基于语言模型的分类器获得(包含大约 6B 个 token)。
- 由 GPT-3.5 生成的 Python 教材的合成教材数据集,包含 <1B 个 token。
- 一个小型合成练习数据集,包含约 180M 个 Python 练习和解决方案的 token。
我们在下一小节中更详细地描述这些数据集。综合上述数据集包含不到 7B 个 token。我们将过滤后的代码语言和合成教材数据集的组合称为“CodeTextbook”,并在预训练阶段使用它来获得我们的基础模型 phi-1-base —— 这个模型已经实现了 29% 的竞争性 HumanEval 性能。然后,我们使用 180M 个 token 的合成练习数据集(称为“CodeExercises”)来微调我们的 phi-1-base 模型,以获得 phi-1。尽管“CodeExercises”数据集的规模较小,但使用这个数据集进行微调对于在生成简单 Python 函数方面取得大幅度改进至关重要,如图 2.1 所示,更广泛地说,解锁我们的 phi-1 模型中许多有趣的新兴能力,这些能力在 phi-1-base 中没有观察到(参见第 3 节)。
2.1 使用基于 Transformer 的分类器对现有代码数据集进行过滤
我们从公开可用的 Python 代码数据集开始:我们使用 The Stack 和 StackOverflow 的去重版本的 Python 子集,这两者共包含超过 3500 万个文件/样本,总计超过 350 亿个 token。我们使用 GPT-4 为这些文件的一小部分(约 10 万个样本)注释质量:给定一个代码片段,模型被提示“确定它对于学习基本编码概念的学生的教育价值”。
然后,我们使用这个带注释的数据集来训练一个随机森林分类器,该分类器使用预训练的代码生成模型的输出嵌入作为特征来预测文件/样本的质量。我们注意到,与 GPT-3.5 不同,我们广泛使用 GPT-3.5 生成合成内容(在下文中讨论),我们仅将 GPT-4 用于最小化地对 The Stack 和 StackOverflow 样本的小部分质量进行注释。因此,我们将我们对 GPT-4 的使用视为一种避免繁琐的人工注释工作的方法 。

2.2 合成教材质量数据集的创建
在为代码生成创建高质量数据集时,一个主要挑战是确保示例多样化且不重复。多样性意味着示例应涵盖广泛的编码概念、技能和场景,并且它们在难度、复杂性和风格方面应有所不同。多样性之所以重要,有几个原因:它让语言模型接触到用代码表达和解决问题的不同方法,降低了过拟合或记忆特定模式或解决方案的风险,并提高了模型对未见过或新颖任务的泛化和鲁棒性。
然而,实现多样性并非易事,特别是在使用由另一个语言模型生成的合成数据时。简单地提示模型生成一个编码教材或一组练习,即使在指令或参数方面有所变化,很可能导致一个非常同质化和冗余的数据集,其中相同的概念和解决方案一次又一次地以微小的变化重复出现。这是因为语言模型倾向于遵循给定训练数据和先验知识的最可能或最常见的路径,它们缺乏创造力或探索生成代码的替代或新颖方法的动力。因此,需要找到合适的“技巧”,使语言模型在输出中更具创造力和多样性,同时仍保持示例的质量和连贯性。受 [arXiv preprint arXiv:2305.07759, 2023] 启发,其中通过在提示中包含从某个固定词汇中选择的随机子集的单词,并要求它们以某种方式组合在生成的文本中,创建了一组多样化的短篇小说,我们寻找将随机性注入提示的方法以产生多样化的数据集。
合成教材数据集
这个数据集包含了少于 10 亿个由 GPT-3.5 生成的 Python 教材的 token,这些教材经过合成,提供了一个高质量的自然语言重型文本,其中穿插着相关的代码片段。我们进一步将这些教材的内容定位为涵盖促进推理和基本算法技能的主题。在这里,多样性是通过对生成教材的主题和目标受众施加约束来实现的。以下示例演示了合成生成的教材文本:

CodeExercises 数据集
这是一个小型合成练习数据集,包含不到 1.8 亿个 Python 练习和解决方案的 token。每个练习都是一个需要完成的函数的文档字符串。这个数据集的目标是使模型根据自然语言指令执行基于函数完成任务。这个数据集也是由 GPT-3.5 生成的,主要通过限制函数名称来引出多样性。对于这个特定的数据集,我们在以下部分进行显式去污染和替代评估,以确保在微调过程中不会出现类似于 HumanEval 基准的问题。以下片段展示了一个合成生成的练习。

2.3 模型架构和训练
我们使用仅解码器的 Transformer 模型,并采用 FlashAttention 实现多头注意力。我们还按照一些近期模型(如 CodeGen 和 GPT-NeoX )的示例,将 MHA 和 MLP 层并行配置。我们的 13 亿参数 phi-1 模型的架构包括 24 层,隐藏维度为 2048,MLP-内部维度为 8192,以及每个维度为 64 的 32 个注意力头。较小的 3.5 亿参数 phi-1-small 模型包括 20 层,隐藏维度为 1024,MLP-内部维度为 4096,以及每个维度为 64 的 16 个注意力头。我们还使用旋转维度为 32 的旋转位置嵌入。这些架构选择来自 [arXiv preprint, 2022]。我们还使用与codegen-350M-mono相同的分词器。除了 FlashAttention,我们的模型没有使用其他新技术,如 Fill-In-the-Middle(FIM)或 Multi-Query-Attention(MQA),这些技术可以进一步提高性能和效率 。
对于预训练和微调,我们将各自的数据集连接成一个单维数组,文件之间用 "⟨∣endoftext∣⟩" 进行分隔。我们在从数据集数组中切片的 2048 个序列长度上训练我们的模型,使用下一个 token 预测损失。我们使用 fp16 训练、AdamW 优化器、线性热身线性衰减学习率调度,以及 0.1 的注意力和残差丢失。我们使用 deepspeed 在 8 个 Nvidia-A100 GPU 上进行训练。我们的预训练基础模型 phi-1-base 在不到 4 天的训练中获得。在相同硬件上进行微调以获得 phi-1 需要额外的 7 小时。
预训练:phi-1-base 在 CodeTextbook 数据集(过滤后的代码语言语料库和合成教材)上进行训练。我们使用有效批次大小 1024(包括数据并行和梯度累积)、最大学习率 1e-3(经过 750 步的热身),以及权重衰减 0.1,总共进行 36,000 步。我们将 24,000 步处的检查点作为我们的 phi-1-base , 这相当于在我们的 CodeTextbook 数据集上进行了 ∼ 8 个周期,总共有 500 多亿个总训练 token。尽管规模和计算量较小,但这个模型在 HumanEval 上已经达到了 29% 的准确率。
微调:通过在 CodeExercises 数据集上微调 phi-1-base 获得 phi-1。对于微调,我们使用与预训练相同的设置,但使用不同的超参数:我们使用有效批量大小为 256,最大学习率为 1e-4,经过 50 步热身,以及权重衰减 0.01。我们总共训练了 6,000 步,并选择了最佳检查点(每 1000 步保存一次)。
3 在 CodeExercises 上微调后的模型能力激增
图 2.1 显示了在小型 CodeExercises 数据集(<200M tokens)上进行微调后,在HumanEval 上取得的最大改进。CodeExercises 仅包含使用基本 Python 库的简短 Python 任务。在本节中,我们将展示在微调后的模型在执行未在微调数据集中出现的任务方面也有显著改进。这包括处理复杂的算法任务和使用外部库。这表明我们的微调过程可能有助于模型重新组织和巩固在预训练期间获得的知识,即使这样的知识在我们的 CodeExercises 数据集中并未明确体现。在本节中,我们将侧重于从定性角度比较和对比我们的微调模型 phi-1 和其预训练的 13 亿参数基础模型 phi-1-base 的能力。
3.1 微调提高了模型的理解能力
通过我们自己创建的一个简单 Python 函数,我们观察到模型在微调后显示出更高层次的理解和遵循指令的能力。特别是,phi-1-base 在提示中的逻辑关系方面表现得很吃力,而 phi-1 能够解释问题并正确生成答案。在这个例子中,尽管最终解决方案是错误的,但即使是我们的 350M 参数的 phi-1-small 模型也表现出了一定程度的问题理解能力。

3.2 微调提高了模型使用外部库的能力
在这里,我们展示了在 CodeExercises 上进行微调出乎意料地提高了模型使用像 Pygame 和 Tkinter 这样的外部库的能力,尽管我们的练习并未包含这些库。这表明我们的微调不仅改进了我们针对的任务,而且使与之无关的任务更容易从预训练中提取。作为参考,图 3.1 显示了我们在 CodeExercises 数据集中的软件包导入分布。

图 3.1:在微调中的 879486 个练习中的导入次数(忽略了导入次数少于 10 次的库)。该图由 phi-1 根据以下提示生成:“我有一个字典,首先根据值对字典进行排序,从大到小。然后生成一个 pyplot 条形图。首先将字体大小设置为 7,然后将 x 轴标签旋转 90 度,x 轴是键,y 轴是字典的值。在 y 轴上使用对数刻度。此外,将 y 轴标签设置为 'Log Number of Times',x 轴标签设置为 'Imports'。将 dpi 设置为 1000。”
PyGame 示例:我们从一个 PyGame 开始,要求模型生成移动球的代码:

上面的代码片段显示了一个简单 PyGame 程序的主循环,该程序在屏幕上弹跳一个球。phi-1 正确地应用了 PyGame 函数来更新和绘制球,如提示中所指示。phi-1-base 和 phi-1-small 生成了在语法上正确但在语义上无关的函数调用。我们可以看到 phi-1-base 在使用适当的 API 调用方面表现出一定的能力,但无法遵循任务的逻辑,而经过微调的 phi-1-small 理解逻辑,但没有足够的能力学习正确的函数调用。
TKinter 示例:我们的第二个示例是一个 TKinter 应用,要求模型在用户点击按钮时相应地更新文本字段。

这三个模型在提示理解方面存在巨大差距。phi-1-base 和 phi-1-small 均未使用正确的 Tkinter API,并生成了无意义的函数调用。另一方面,phi-1 除了没有正确复制“pewpewpew?”之外,成功实现了 GUI 和所有功能。我们在附录 A 中提供了关于 pytorch 和 pyplot 的两个额外示例。
聊天模式示例:最后,我们展示了尽管聊天数据仅在预训练中独占,而不在微调中,但 phi-1 的聊天能力仍优于 phi-1-base。

4.使用 LLM 评分评估非传统问题
一个关于 phi-1 在 HumanEval 上表现出奇妙好成绩的潜在问题(参见表 1 和图 2.1)是,可能存在源自 CodeExercises 数据集1污染的记忆现象。我们在第 5 节直接研究这种可能的污染,而本节通过一个新的评估来解决这个问题,这个评估被设计成非常非传统,因此不太可能出现在任何训练数据集中。
为了最大程度地减少偏见和泄漏,我们小组中的一个专门团队创建了新的评估问题,该团队没有访问 CodeExercises 数据集或最终模型。他们按照与 HumanEval 相同的格式创建了 50 个新问题,并指导设计那些不太可能出现在现实世界代码库或编码练习中的问题。以下是这类问题的一个示例:

评估语言模型在编码任务上的表现的挑战之一在于,模型的输出通常是二进制的:代码要么通过所有单元测试,要么失败。然而,这并不能捕捉到模型性能的细微差别,因为它可能生成了一个几乎正确但存在轻微错误的代码,或者一个完全错误但偶然通过了一些测试的代码。可以说,评估模型编码技能的更具信息量的方法是将其输出与正确解决方案进行比较,并根据它与预期逻辑的匹配程度进行评分。这类似于人类在编码面试中的评估方式,面试官不仅运行代码,还检查推理过程和解决方案的质量。
为了评估候选解决方案,我们因此采用使用 GPT-4 对解决方案进行评分的方法。这种方法有两个明显的优点:(1)通过使用 GPT-4 作为评分者,我们可以利用其知识和生成能力,获得关于学生模型编码能力的更细粒度和有意义的信号;(2)它消除了对测试的需求。我们的提示指示 LLM 首先用简短的口头评估对学生的解决方案进行评估,然后给出 0 到 10 的评分。

请参阅表 2,了解 phi-1 和竞争模型的结果。在我们新的非传统问题上的评分与 HumanEval(参见表 1)的排名相同。phi-1 再次获得比 StarCoder 高得多的分数,就像它在 HumanEval 上所做的那样。考虑到新问题没有机会污染训练数据,而且是专门设计在训练分布之外的,这些结果大大增加了我们对 phi-1 性能有效性的信心。
5 数据修剪以进行无偏性能评估
在图 2.1 中,我们看到在 CodeExercises 上进行训练使得模型在 HumanEval 基准测试上的性能得到了显著提升。为了研究这种提升,我们建议通过移除与 HumanEval 中的文件“相似”的文件来修剪 CodeExercises 数据集。这个过程可以被视为数据去污染的“强形式”。然后我们在这样修剪过的数据上重新训练模型,并仍然观察到 HumanEval 上的强劲表现。特别是,在大胆修剪 CodeExercises 数据集的 40% 以上之后(这甚至修剪了与 HumanEval 只是略微相似的文件,请参见附录 C),重新训练的 phi-1 仍然优于 StarCoder。
我们认为这种数据修剪实验是一种公平的评估性能的方法,比文献中通常基于训练和测试数据之间的重叠度量的标准“污染”研究更有启发性。为了完整起见,我们从进行标准污染实验开始本节,该实验表明 CodeExercises 没有以这种标准意义上被 HumanEval 污染。
5.1 N-gram 重叠
N-gram 根据共享的 n-词序列衡量文本段落之间的相似性。我们计算每个 humaneval 问题的 docstrings 与生成的 CodeExercises 数据集中的每个练习之间的 n-gram 重叠。我们发现 4 个 humaneval 问题与我们数据集中的至少一个条目在 13-gram 上有重叠。在进一步调查之后,我们发现所有 4 个 13-gram 中的重叠案例都是误报,如下例所示。我们的 n-gram 重叠分析表明,我们的数据集与 HumanEval 的逐个字母重叠最小。

5.2 嵌入和基于语法的相似性分析
现在我们转向修剪实验。如刚才所见,n-gram 分析不够精细,无法在 HumanEval 和 CodeExercises 之间找到相似的代码片段。相反,我们使用嵌入和基于语法的距离的组合。对于嵌入距离,我们计算代码片段嵌入之间的 L2 距离,其中嵌入来自预训练的 CodeGen-Mono 350M 模型 。我们观察到嵌入距离成功捕捉到整体代码语义相似的代码对,这可以通过 Python Docstring、函数/类名称以及代码结构推断出来。
对于基于语法的距离,我们计算两个给定代码片段的抽象语法树(AST)之间的(字符串)编辑距离。AST 距离成功识别了代码对之间的重叠部分,同时对非语法文本(如变量/函数命名、注释和 Python Docstrings)保持不可知。在修剪 CodeExercises 时,我们为嵌入距离固定一个阈值,并测试 AST 距离的几个匹配率 τ。参见附录 C,了解使用嵌入距离和不同 AST 匹配率 τ 捕获的代码对示例。我们将 τ 在 0.95 和 0.8 之间进行变化,这相当于在 CodeExercises 的 879.5K 总问题中移除 42.5K 到 354K。

表 3:不同模型正确解决相似与非相似 HumanEval 问题的百分比。相似性是根据相应的 HumanEval 问题在 CodeExercises 数据集内是否有任何接近的匹配(对于给定的 τ)来确定的。问题计数表示每个子集中的 HumanEval 问题数量。在这里,τ 是基于 AST 的代码匹配率阈值,用于相似性检查。
表 3 总结了我们在修剪过的数据集(τ = 0.95、0.9、0.85 和 0.8)上重新训练的 phi-1 与在完整 CodeExercises 上训练的原始 phi-1 和 15.5B 参数 StarCoder-prompted 的性能。我们根据它们在原始 CodeExercises 数据集内是否至少有一个接近的匹配(对于给定的 τ),将 HumanEval 问题划分为两个子集(“相似”和“非相似”)。然后我们分别报告模型在 HumanEval 的每个子集上的准确率。正如可以看到,即使在大量修剪我们的数据集之后,phi-1 仍然以较大的优势优于 StarCoder-Prompted,这证实了我们的性能提升不是由于数据集“污染”,即使后者被宽松理解。还要注意的是,所有模型在 HumanEval 非相似子集上的准确率都低于相似子集。
6 结论
正如一本全面、精心制作的教材可以为学生提供掌握新学科所需的知识,我们的工作展示了高质量数据在磨练语言模型在代码生成任务中的熟练程度方面的显著影响。通过制作“教材质量”的数据,我们能够训练一个在诸如 HumanEval 和 MBPP 等编码基准测试中胜过几乎所有开源模型的模型,尽管其模型大小减小了 10 倍,数据集大小减小了 100 倍。我们假设这种高质量数据显著提高了语言模型在代码方面的学习效率,因为它们提供了清晰、自包含、具有指导性和平衡的编码概念和技能示例。
与更大的代码模型相比,我们的模型还存在一些局限性。首先,phi-1 专门用于 Python 编程,与多语言模型相比,其通用性受到限制。其次,phi-1 缺乏更大模型的领域特定知识,例如使用特定 API 编程或使用较少见的包。最后,由于数据集的结构化特性和在语言和风格方面的多样性不足,phi-1 对于风格变化或提示中的错误(例如,当提示中有语法错误时,其性能会大幅下降)的鲁棒性较差。我们在附录 B 中详细介绍了这些局限性,并给出了 phi-1 的失败模式示例。
这些局限性似乎都不是根本性的,通过更多的工作,我们的方法可以用来解决其中的每一个问题,尽管不清楚为了克服它们可能需要进行哪些方面的扩展(模型大小和数据集大小)。我们还认为,使用 GPT-4 代替 GPT-3.5 生成合成数据可以实现显著的收益,因为我们注意到 GPT-3.5 数据的错误率较高。值得注意的是,尽管存在这些错误,phi-1 仍能实现如此高的编码熟练程度(在 [AZL23] 中观察到了类似的现象,即在具有 100% 错误率的数据上训练语言模型,而在测试时仍然可以生成正确的答案)。
更一般地说,我们的工作证明,开发用于创建高质量数据集的良好方法是推进自然语言处理和相关领域研究的核心方向。然而,创建高质量数据集并非易事,需要解决几个挑战。一个挑战是确保数据集涵盖了我们希望模型学习的所有相关内容和概念,并以平衡和有代表性的方式呈现。
另一个挑战是确保数据集真正多样化且不重复,以免模型仅对数据过拟合或记住特定模式或解决方案。这需要在保持示例质量和连贯性的同时,找到将随机性和创造性注入数据生成过程的方法。此外,即使在创建了这样的数据集之后,我们还缺乏一种有效的方法来衡量和评估数据中的多样性和冗余程度。例如,如果我们有一个包含编码练习的数据集,很难确定每个练习的不同变体有多少,以及它们如何分布在整个数据集中。最后,由于语言模型本身将用于为未来的语言模型整理数据,这进一步加大了对训练这些模型的道义和社会影响的紧迫性,例如数据和模型在此过程中的问责、透明度和偏见。