作者:杨靖锋,现任亚马逊科学家,本科毕业于北大,硕士毕业于佐治亚理工学院,师从 Stanford 杨笛一教授。
译文由杨昊桐翻译,王骁修订。感谢靳弘业对第一版稿件的建议,感谢陈三星,符尧的讨论和建议。(本文经授权后由OneFlow发布。原文:https://jingfengyang.github.io/gpt)
为什么所有公开的对 GPT-3 的复现都失败了?我们应该在哪些任务上使用 GPT-3.5 或 ChatGPT?
对于那些想要复现一个属于自己的 GPT-3 或 ChatGPT 的人而言,第一个问题是关键的。第二个问题则对那些想要使用它们的人是重要的(下文提到 GPT-3,主要是指 GPT-3.5 或 InstructGPT 的最新版本,除了一些指向 GPT-3 原文的情况)。
这篇博客包括我在仔细重新检查了一系列文章的细节之后给出的总结,以及对上面两个问题我个人的思考。这些文章包括且不限于:GPT-3, PaLM, BLOOM, OPT, FLAN-T5/PaLM, HELM 等。均为个人意见,仅供参考。如果您有更可靠的参考资料或者更实际的经验,欢迎指正。
1
为什么所有公开的对GPT-3的复现都失败了?
这里,我称之为“失败”,是指训练得出模型有接近 GPT-3 或者更大的参数量,但仍无法与 GPT-3 原始文献中报告的性能所匹配。在这一标准下,GPT-3 和 PaLM 是“成功”的,但这两个模型都不是公开的。而所有的公开模型(例如:OPT-175B 和 BLOOM-176B)都在一定程度上“失败”了。但是我们仍然可以从这些“失败”中吸取一些教训。
我们需要注意的是,假如能够多次尝试各种不同的训练设置,开源社区可能最终可以复现 GPT-3。但截至目前,训练另一个版本的 OPT-175B 的开销仍然太过高昂——对于如此大规模的模型,一次训练就将需要在约 1000 个 80G A100 GPU 上花费至少 2 个月的时间(数据来自于 OPT 的原始文献)。
尽管一些文章(例如 OPT-175B 和 GLM-130B)声称,它们在一些任务上能够匹配甚至超过原始的 GPT-3 的表现,在更多 GPT-3 已经测试过的任务上,这种声明仍然是存疑的。同时,根据大多数使用者在更多样的任务上的经验,以及 HELM 的评估来看,最近的 OpenAI GPT-3 的 API 表现也仍然比这些开源模型更好。
尽管它背后的模型可能使用了指令微调(instruction tuning, 正如 InstructGPT 那样),类似的使用了指令微调的 OPT 版本(OPT-IML)和 BLOOM 版本(BLOOMZ)也仍然远比 InstructGPT 和 FLAN-PaLM(PaLM 的指令微调版本)要差得多。
根据文章的细节,相比 GPT-3 和 PaLM 的成功,有多个可能的原因导致了OPT-175B 和 BLOOM-176B 的失败。我将其分为两个部分:预训练数据和训练策略。
预训练数据
让我们首先观察 GPT-3 是如何准备和使用预训练数据的。GPT-3 在共计 300B 的 token 上进行训练,其中 60% 来自经过筛选的 Common Crawl,其它则来自webtext2(用于训练 GPT-2 的语料库)、Books1、Books2 和维基百科。
更新版本的 GPT-3 还用了代码数据集进行训练(例如 Github Code)。每个部分的占比并不与原始数据集的大小成比例,相反,具有更高质量的数据集被更加频繁地采样。导致 OPT-175B 和 BLOOM-176B 失败的,可能是以下三个难点,它们使得开源社区难以收集到类似的数据:
1. 第一点是一个具有良好性能的用于筛选低质量数据的分类器。它被用于构建 GPT-3 和 PaLM 的预训练数据集,但在 OPT 和 BLOOM 的训练中却没有被采用。一些文章已经展示,一个用更少但质量更高的数据集训练的预训练模型,可以在性能上超过另一个用更多的混合质量数据集训练的模型。当然,数据的多样性仍然是十分重要的,正如我们将在第三点中讨论的。因此,人们应当非常小心地处理在数据多样性和质量之间的权衡。
2. 第二点是预训练数据集的去重。去重有助于避免预训练模型多次面对相同的数据后记住它们或者在其上过拟合,因此有助于提高模型的泛化能力。GPT-3 和 PaLM 采用了文档级别的去重,这同样被 OPT 所采用。但 OPT 预训练的去重 Pile 语料库中仍有许多重复存在,这也可能导致它较差的性能(注:在一些最近的文献中显示去重对于预训练语言模型的重要性可能没有想象中大)。
3. 第三点是预训练数据集的多样性,包括领域多样性、格式多样性(例如:文本、代码和表格)和语言多样性。OPT-175B 所使用的 Pile 语料库声称有着更好的多样性,但 BLOOM 采用的 ROOTS 语料库则有太多的已经存在的学术数据集,缺乏 Common Crawl 数据所包含的多样性。这可能导致 BLOOM 性能更差。作为对比,GPT3 来自 Common Crawl 语料的占比则要高得多,而它们来自广泛领域,是多样的,这也可能是 GPT-3 能够作为首个通用聊天机器人 ChatGPT 的基础模型的原因之一。
请注意:虽然一般来说,多样性的数据对于训练一个通用的 LLM(Large Language Model,大规模语言模型)是重要的,但特定的预训练数据分布,则会对 LLM 在特定的下游任务上的性能产生巨大的影响。例如,BLOOM 和 PaLM 在多语言数据上有更高的占比,这导致它们在一些多语言任务和机器翻译任务上的性能更高。
OPT 使用了很多对话数据(例如 reddit),这可能是它在对话中表现好的原因之一。PaLM 有很大的占比在社交媒体对话中,这可能是它在多种问答任务和数据集上有着卓越表现的原因。同样的,PaLM 和更新版本的 GPT-3 有很大比例的代码数据集,这增强了它们在代码任务上的能力,以及可能增强了它们 CoT (Chain-of-Thought,思维链) 的能力。
一个有趣的现象是,BLOOM 在代码和 CoT 上的表现仍然是较差的,尽管它在预训练过程中使用了代码数据。这可能暗示着单独代码数据本身并不能保证模型的代码和 CoT 能力。
总之,一些文章表明了上面三点的重要性,即:通过数据去重避免记忆和过拟合,通过数据筛选以得到高质量数据,保证数据多样性以确保 LLM 的泛化性。但