吴恩达说的「小数据」有多大威力?这个只有 1.3B 参数量的模型给出了证明。
人工智能的三个核心要素是算力、算法和数据,这是大多数人在初识人工智能时都会接触到的一个观点。不过,在深入阐述该观点时,很多材料都倾向于解释数据「大」的一面,毕竟当前的大模型一直在由不断增加的「大数据」来推动,而且这条路似乎还没有走到极限。不过,随着数据获取难度增加以及算力增长出现瓶颈,单纯追求「大模型、大数据」的道路变得愈发难以为继。因此,早在 2022 年,吴恩达就在采访中呼吁大家关注「小数据」,即数据量较小但质量较高的数据。「在数据行业,我认为重点必须从大数据转向优质数据。拥有 50 个精心设计的示例就足以向神经网络解释用户希望它学习什么。」吴恩达表示。高质量的「小数据」到底有多大威力?最近,来自微软的一篇题为「Textbooks Are All You Need」的论文给出了一个非常直观的答案。论文链接:https://arxiv.org/pdf/2306.11644.pdf他们用规模仅为 7B token 的「教科书质量」数据训练了一个 1.3B(13 亿参数)的模型 ——phi-1。phi-1 专注于编码任务,具体来说是编写 Python 函数和对应的文档字符串。训练数据由网上筛选的教科书质量数据(6B token)和 GPT-3.5 生成的教科书及练习数据(1B token)组成。训练时,模型对 70 亿的 token 进行了 8 次遍历。然后在不到 2 亿 token 的数据上进行了微调。整个训练过程在 8 个 A100 上进行,为期 4 天。结果表明,尽管在数据集和模型大小方面比竞品模型小几个数量级,phi-1 依然在 HumanEval 的 pass@1 上达到了 50.6% 的准确率,在 MBPP 上达到了 55.5%,这是仅使用一个 LLM 生成的最佳自我报告数字之一。论文作者之一 Sebastien Bubeck 表示,任何在 HumanEval 上达到 50% 以上准确率的模型都要比 phi-1 大得多,比如前段时间超越所有开源模型、击败 Claude 和 Bard、专门用于编程任务的大模型 WizardCoder 参数量达到了 phi-1 的 10 倍以上,而所用的数据集规模则高达百倍。此外,研究者还提出了一个更小的模型:参数量为 350M 的 phi-1-small。该模型用与 phi-1 相同的 pipeline 进行训练,在 HumanEval 上达到了 45% 的准确率。从 phi-1 这项研究可以看到,高质量数据的引入改变了模型性能与规模之间的关系,突破了之前的 scaling laws。它表明,高质量数据可以提升大型语言模型(LLM)的 SOTA,同时大大降低数据集的规模和计算量,这对于当前算力紧张的局面来说是个好消息。在论文第二部分,作者详述了他们的训练过程,并讨论了他们的数据选择过程对于取得这个结果的重要性。此外,尽管 phi-1 的训练 token 远少于现有模型,但它仍然显示出了涌现特性。在第三部分,作者讨论了这些涌现特性,通过比较 phi-1 和 phi-1-small 的输出,确认了参数数量在「涌现」方面起关键作用的假设。这一部分用到的方法与 Sparks of AGI 论文的精神相呼应,该论文主张摆脱静态基准,来测试 LLM 的性能。最后,在第四部分,作者讨论了评估模型的替代基准,而在第五部分,他们研究了他们的训练数据在 HumanEval 方面可能受到的「污染」。这篇论文引起了不少研究者的关注,认为它代表了一种研究趋势。最近回归 OpenAI 的 Andrej Karpathy 展望说,「我们可能会看到更多创造性的『缩小规模』工作:将数据质量和多样性置于数量之上,更多的合成数据生成以及小型但功能强大的专家模型将会出现。」爱丁堡大学博士生符尧也给予了该文高度评价,认为其通过将数据工程推向极限,充分利用了基础模型(不仅仅是 GPT-3.5)的潜力,同时指出该研究可能过于偏向于 HumanEval 风格的测试,因此未来的研究方向可能需要平衡模型的能力。这可能是最重要 / 棘手的部分,因为作者大量使用 promp 来引导 GPT-3.5 生成预训练的教科书和 SFT 代码练习。显然,大部分性能提升来自这个阶段。我进一步的假设是:
如果将这些数据用于继续训练 GPT-3.5 本身,即教师模型,它也会有进一步改进的性能,就像之前的 LMSI(Large Language Models Can Self-Improve)论文展示的一样,因此我倾向于将 Phi-1 论文视为推动 LMSI 方法的一大步。将教师模型更改为在足够多代码上进行预训练的任何预训练模型,也可以获得类似质量的数据,当然,这需要一个良好的基础模型。综合上述观点,基本上对于任何优秀的基础模型,都可以从基础模型中通过 prompt 合成教科书数据,然后使用模型生成的数据来改进自身,或者蒸馏为更小的专门化变体。
从论文的印象来看,我觉得预训练和 SFT 数据可能与 HumanEval 过于接近(并且作者证明没有污染)。基本上,作者构建了一个用于 Human Eval 的训练集。这有多重含义:
为感兴趣的测试问题构建训练集没有问题,我猜测大多数部署的模型都这样做。然而,它降低了在分布内泛化的挑战程度,尽管对于与推理相关的任务和小型模型来说,这仍然是个挑战。然而,LLM 最重要的能力在于分布外泛化,因为更大的模型会泛化到远离其训练 / 微调分布的内容。Phi-1 在小模型的分布内泛化方面做得最好(可能是极限),但在 LLM 时代,我们对分布外、少样本泛化更感兴趣。
推动分布内泛化的极限,会以显著降低通用领域能力为代价,如作者所讨论的(也可以参见我们以前的工作:https://arxiv.org/abs/2301.12726)。因此,下一步工作可能落脚于如何进行好的数据混合,以保持编码性能的同时,也能提高通用能力。
总体而言,这是一项令人印象深刻的工作!我学到了很多!
- 一个经过筛选的代码 - 语言数据集,它是 The Stack 和 StackOverflow 的一个子集,通过使用基于语言模型的分类器获得(包含约 6B token)。
- 一个合成的教科书数据集,包含不到 1B 个 token 的 GPT-3.5 生成的 Python 教科书。
- 一个小型的合成练习数据集,包含大约 180M 个 token 的 Python 习题和答案。
以上数据组成了总 token 量不到 7B 的训练数据集。作者将经过筛选的代码 - 语言数据集和合成的教科书数据集的组合称为「CodeTextbook」,并在预训练阶段使用它来获得一个基础模型 phi-1-base—— 该模型已经在 HumanEval 上达到了 29% 的准确率。然后,他们使用 180M 个 token 的合成练习数据集,称为「CodeExercises」,对 phi-1-base 模型进行微调,以获得 phi-1 模型。尽管「CodeExercises」数据集规模较小,但通过这个数据集进行微调不仅在生成简单的 Python 函数方面带来了巨大的改进(如图 2.1 所示),而且更广泛地解锁了 phi-1 模型中许多有趣的新能力,这些能力在 phi-1-base 模型中没有观察到。该研究使用仅含解码器(decoder-only)的 transformer 模型 —— 使用多头注意力 (MHA) 的 FlashAttention 实现,并参考一些新模型,包括 CodeGen、PaLM 和 GPT-NeoX,在并行配置中使用 MHA 和 MLP 层。具体来说,1.3B 参数的 phi-1 模型由 24 层组成,隐藏维度为 2048,MLP 内部维度为 8192,使用 32 个注意力头,每个注意力头维度为 64。350M 参数的 phi1-small 模型由 20 层组成,隐藏维度为 1024,MLP 内部维度为 4096,16 个注意力头,每个维度为 64。值得注意的是,该研究没有使用 Fill-In-the-Middle (FIM)、 Multi-Query-Attention (MQA) 等可以进一步提高模型性能和效率的新方法。在 CodeExercises 上微调后模型能力的峰值如下图 2.1 所示,该研究发现模型在 HumanEval 基准上的最大改进来自于在小型 CodeExercises 数据集(<200M token)上的微调。CodeExercises 仅包含使用基本 Python 库的简短 Python 任务。该研究表明,微调后的模型在执行微调数据集中没有的任务上也表现出显著的性能改进。该研究仅使用简单的 Python 函数就观察到,微调后的模型对指令的理解和遵循程度要高得多。例如,phi-1-base 很难处理 prompt 中的逻辑关系,而 phi-1 可以正确解释问题并生成答案。该研究发现在 CodeExercises 上的微调意外地提高了模型使用 Pygame 和 Tkinter 等外部库的能力,尽管微调中不包含这些库。这表明微调不仅改进了目标任务,还使不相关的任务更容易从预训练中蒸馏(distill)出来。如下表 1 所示,phi-1 在 HumanEval 基准上取得了令人惊讶的良好性能。但一个潜在问题是,phi-1 优越的性能可能来源于 CodeExercises 数据集的「污染」。为了最大限度地减少 bias 和数据泄露(data leakage),该研究在没有访问 CodeExercises 数据集的情况下创建了新的评估问题。具体来说,该研究以 HumanEval 的格式创建了 50 个新问题,并附有设计说明,这些问题不太可能出现在现实世界的代码库或编码练习中。例如:下表 2 显示了 phi-1 和一些模型的比较结果:如上图 2.1 所示,在 CodeExercises 上的训练显著提升了模型在 HumanEval 基准上的性能。为了研究这种提升,该研究通过移除与 HumanEval「相似」的文件来修剪 CodeExercises 数据集。这个过程可以被视为数据净化的「强力形式」。然后,该研究在修剪过的数据上重新训练模型,模型在 HumanEval 基准上仍然表现出强大的性能。特别是,即使在修剪超过 40% 的 情况下,重新训练的 phi-1 仍然优于 StarCoder。