参考文献

注册

 

发新话题 回复该主题

为什么所有GPT3复现都失败了使用Ch [复制链接]

1#

机器之心专栏

作者:杨靖锋

为什么所有公开的对GPT-3的复现都失败了?我们应该在哪些任务上使用GPT-3.5或ChatGPT?

这一推文写于年2月12日,其中均为个人意见,仅供参考。

为什么所有公开的对GPT-3的复现都失败了?我们应该在哪些任务上使用GPT-3.5或ChatGPT?

这篇推文将包括,我在仔细重新检查了一系列文章的细节之后给出的总结,以及对上面两个问题我个人的思考。这些文章包括且不限于:GPT-3,PaLM,BLOOM,OPT,FLAN-T5/PaLM,HELM等。如果您有更可靠的参考资料或者更实际的经验,欢迎指正。

对于那些想要复现一个属于自己的GPT-3或ChatGPT的人而言,第一个问题是关键的。第二个问题则对那些想要使用它们的人是重要的(下文提到GPT-3,主要是指GPT-3.5或InstructGPT的最新版本,除了一些指向GPT-3原文的情况)。

为什么所有公开的对GPT-3的复现都失败了?

这里,我称之为“失败”,是指训练得出模型有接近GPT-3或者更大的参数量,但仍无法与GPT-3原始文献中报告的性能所匹配。在这一标准下,GPT-3和PaLM是“成功”的,但这两个模型都不是公开的。而所有的公开模型(例如:OPT-B和BLOOM-B)都在一定程度上“失败”了。但是我们仍然可以从这些“失败”中吸取一些教训。

我们需要注意的是,假如能够多次尝试各种不同的训练设置,开源社区可能最终可以复现GPT-3。但截至目前,训练另一个版本的OPT-B的开销仍然太过高昂——对于如此大规模的模型,一次训练就将需要在约个80GAGPU上花费至少2个月的时间(数据来自于OPT的原始文献)。

尽管一些文章(例如OPT-B和GLM-B)声称它们在一些任务上能够匹配甚至超过原始的GPT-3的表现,在更多GPT-3已经测试过的任务上,这种声明仍然是存疑的。同时,根据大多数使用者在更多样的任务上的经验,以及HELM的评估来看,最近的OpenAIGPT-3的API表现也仍然比这些开源模型更好。

尽管它背后的模型可能使用了指令微调(instructiontuning,正如InstructGPT那样),类似的使用了指令微调的OPT版本(OPT-IML)和BLOOM版本(BLOOMZ)也仍然远比InstructGPT和FLAN-PaLM(PaLM的指令微调版本)要差得多。

根据文章的细节,有多个可能的原因导致了相比GPT-3和PaLM的成功,OPT-B和BLOOM-B的失败。我将其分为两个部分:预训练数据和训练策略。

预训练数据

让我们首先观察GPT-3是如何准备和使用预训练数据的。GPT-3在共计B的token上进行训练,其中60%来自经过筛选的CommonCrawl,其它则来自:webtext2(用于训练GPT-2的语料库),Books1,Books2和维基百科。

更新版本的GPT-3还用了代码数据集进行训练(例如GithubCode)。每个部分的占比并不与与原始数据集的大小成比例,相反的,具有更高质量的数据集被更加频繁地采样。导致OPT-B和BLOOM-B失败的,可能是以下三个难点,它们使得开源社区难以收集到类似的数据:

1.第一点是一个具有良好性能的用于筛选低质量数据的分类器。它被用于构建GPT-3和PaLM的预训练数据集,但在OPT和BLOOM的训练中却没有被采用。一些文章已经展示,一个用更少但质量更高的数据集训练的预训练模型,可以在性能上超过另一个用更多的混合质量数据集训练的模型。当然,数据的多样性仍然是十分重要的,正如我们将在第三点中讨论的。因此,人们应当非常小心地处理在数据多样性和质量之间的权衡。

2.第二点是预训练数据集的去重。去重有助于避免预训练模型多次面对相同的数据后记住它们或者在其上过拟合,因此有助于提高模型的泛化能力。GPT-3和PaLM采用了文档级别的去重,这同样被OPT所采用。但OPT预训练的去重Pile语料库中仍有许多重复存在,这也可能导致它较差的性能(注:在一些最近的文献中显示去重对于预训练语言模型的重要性可能没有想象中大)。

3.第三点是预训练数据集的多样性,包括领域多样性、格式多样性(例如:文本、代码和表格)和语言多样性。OPT-B所使用的Pile语料库声称有着更好的多样性,但BLOOM采用的ROOTS语料库则有太多的已经存在的学术数据集,缺乏CommonCrawl数据所包含的多样性。这可能导致BLOOM性能更差。作为对比,GPT3来自CommonCrawl语料的占比则要高得多,而它们是多样的和来自广泛领域的,这也可能是GPT-3能够作为首个通用聊天机器人ChatGPT的基础模型的原因之一。

请注意:虽然一般来说,多样性的数据对于训练一个通用的LLM(LargeLanguageModel,大规模语言模型)是重要的,但特定的预训练数据分布,则会对LLM在特定的下游任务上的性能产生巨大的影响。例如,BLOOM和PaLM在多语言数据上有更高的占比,这导致它们在一些多语言任务和机器翻译任务上的性能更高。

OPT使用了很多对话数据(例如reddit),这可能是它在对话中表现好的原因之一。PaLM有很大的占比在社交媒体对话中,这可能是它在多种问答任务和数据集上有着卓越表现的原因。同样的,PaLM和更新版本的GPT-3有很大比例的代码数据集,这增强了它们在代码任务上的能力,以及可能增强了它们CoT(Chain-of-Thought,思维链)的能力。

一个有趣的现象是BLOOM在代码和CoT上的表现仍然是较差的,尽管它在预训练过程中使用了代码数据。这可能暗示着单独代码数据本身,并不能保证模型的代码和CoT能力。

总之,一些文章表明了上面三点的重要性,即:通过数据去重避免记忆和过拟合,通过数据筛选以得到高质量数据,保证数据多样性以确保LLM的泛化性。但不幸的是,对于PaLM和GPT-3预处理这些数据的细节,或者这些预训练数据本身,仍然没有公布,这使得公共社区很难去复现它们。

训练策略

此处训练策略包括训练框架、训练持续时间、模型架构/训练设置、训练过程中的修改。在训练非常大的模型时,它们被用于获得更好的稳定性和收敛性。一般来说,由于未知的原因,预训练过程中广泛观察到损失尖峰(lossspike)和无法收敛的情况。因此,众多的对训练设置和模型架构的修改被提出,用以避免这些问题。但是其中一些修改在OPT和BLOOM之中还不是最优解,这可能导致它们的性能较差。GPT-3并没有明确提到他们是如何解决这个问题的。

1.训练框架。一个参数量大于B的模型往往需要ZeRO式的数据并行(分布式的优化器)和模型并行(包括张量并行(tensorparallel)、流水线并行(pipelineparallel),有时还包括序列并行(sequenceparallel))。OPT采用了ZeRO的FSDP实现,以及模型并行的Megatron-LM实现。BLOOM采用了ZeRO的Deepspeed实现和模型并行的Megatron-LM实现。

PaLM采用了Pathways,这是一个基于TPU的模型并行和数据并行系统。GPT-3的训练系统的细节仍然未知,但它们至少在一定程度上使用了模型并行(一些人称它使用了Ray)。不同的训练系统和硬件可能导致不同的训练时的现象。显然,一些在PaLM的文章中呈现的、用于TPU训练的设置,可能并不适用于其它所有模型使用的GPU训练。

硬件和训练框架的一个重要的影响是,人们是否可以使用bfloat16去存储模型权重和中间层激活值等。这已经被证明是稳定训练的一个重要因素,因为bfloat16可以表示更大范围的浮点数,能够处理在损失尖峰时出现的大数值。在TPU上bfloat16是默认设置,这可能是PaLM能够成功的一个秘密。但是在GPU上,以前人们主要使用float16,这是V中混合精度训练的唯一选择。

OPT使用了float16,这可能是其不稳定的因素之一。BLOOM发现了这样的问题并最终在AGPU上使用了bfloat16,但它没有意识到这种设置的重要性,因此在第一个词向量层后引入额外的层归一化(layernormalization),用于解决他们使用float16的初步实验中的不稳定性。然而,这种层归一化已被证明会导致更糟糕的零样本泛化(zero-shotgeneralization),这可能是BLOOM失败的一个因素。

2.训练过程中的修改。OPT做了很多中途调整并从最近的checkpoint重启训练,包括改变截断梯度范数(clipgradientnorm)和学习率,切换到简单的SGD优化器然后回到Adam,重置动态损失标量(dynamiclossscalar),切换到更新版本的Megatron等等。

这种中途调整可能是OPT失败的原因之一。相比之下,PaLM几乎没有做任何中途调整。它只是当损失尖峰出现时,从尖峰开始前大约步的checkpoint重新开始训练,并跳过了大约-个batch的数据。仅仅依靠这种简单的重启,PaLM就取得神奇的成功。这是由于它在预训练数据构建期间就已经完成采样,因此模型具有在Bit意义上的确定性,以及它对模型架构和训练设置进行了许多修改以获得更好的稳定性。PaLM中的此类修改在下一点中展示。

3.模型架构/训练设置:为了使训练更稳定,PaLM对模型架构和训练设置进行了多项调整,包括使用Adafactor的修改版本作为优化器,缩放在softmax之前的输出logit,使用辅助损失来鼓励softmax归一化器接近0,对词向量和其他层权重使用不同的初始化,在前馈层和层归一化中不使用偏差项,并且在预训练期间不使用dropout。

请注意,GLM-B中还有更多有价值的内容关于如何稳定地训练非常大的模型,例如:使用基于DeepNorm的后置层归一化而不是前置层归一化,以及词向量层梯度收缩。以上大多数模型修改没有被OPT和BLOOM采用,这可能会导致它们的不稳定和失败。

4.训练过程:如下表所示,原始的GPT-3预训练过程见过的token数与OPT和BLOOM接近,而PaLM则远远超过了它们。同样,PaLM和GPT-3预训练语料库都大于BLOOM和OPT。因此,在更多的token上、用更大规模的高质量语料库进行预训练可能是GPT-3和PaLM成功的一个重要因素。

除了上面列出的四点,还有一些其它因素,它们可能对于更稳定的训练并不重要,但仍然可能影响最终的性能。

第一点,PaLM和GPT-3都使用了在训练过程中从小到大逐渐增加的batchsize,这已经被展示对于训练一个更好的LLM是有效的,然而OPT和BLOOM都使用了恒定的batchsize。

第二点,OPT使用了ReLU激活函数,而PaLM使用SwiGLU激活函数,GPT-3和BLOOM使用GeLU,它通常使得训练的LLM的性能更好。

第三点,为了更好的建模更长的序列,PaLM使用RoPE词向量,BLOOM使用ALiBi词向量,而原始的GPT-3和OPT使用学习得到的词向量,这可能影响在长序列上的性能。

我们应该在哪些任务上使用GPT-3.5或ChatGPT?

我尝试解释我们应该在哪些任务和应用上使用GPT-3,而哪些则不该使用。为了展示GPT-3是否适合某个特定任务,我主要比较了带有提示(prompting)的GPT-3和经过微调的更小的模型,这些小模型有时还加入了其他特殊的设计。鉴于最近出现的更小的而且可以微调的FLAN-T5模型的良好性能,这一问题更加重要。

在理想情形下,如果微调GPT-3的负担是能够承担的,它可能带来更进一步的提升。然而,在一些任务上通过微调PaLM-B带来的提升是如此有限,让人们怀疑在一些任务中微调GPT-3是否是值得的。从科学的角度来看,更公平的比较应在微调GPT-3和提示GPT-3之间进行。然而,要使用GPT-3,人们可能更关心将提示GPT-3和微调一个更小的模型去进行对比。

注意到,我主要关心的是将完成任务的精确度作为度量,但仍然存在很多其它重要的维度,例如:有害性(toxicity)、公平性等,它们也应该在决定是否使用GPT-3时被纳入考虑,正如HELM的文章中所呈现的。下图展示了一个粗略的决策流程,希望它能够作为一个有用的实践指南,无论对于已有任务还是一个全新的任务。

注1:由于在对话场景下的良好对齐,ChatGPT作为一个聊天机器人表现优异。但我们通常使用GPT-3、InstructGPT(GPT-3.5)、以及Codex这些ChatGPT背后的模型作为在更多任务和使用场景下的通用模型。

注2:这一节中的结论是基于一些对模型当前版本的发现得到的,这可能不适用于未来的更强的模型。因为,使用更多与目标数据集接近的预训练数据、学术数据集指令调整(例如提示一个FLAN-PaLM可能会带来更强的性能,它仍未公开)或者通过RLHF以使得模型对目标任务的更好对齐,这些都可能使得模型在目标任务中表现更好,即使有时这会牺牲在其他场景下的能力(例如,InstructGPT的“对齐税/Alignmenttax”)。

在这种情况下,很难判断GPT是进行泛化和跨任务泛化,还是仅仅在预训练时就已经记住了一些测试样例,或者说见过那些在预训练时所谓“没有见过”的任务。然而,记忆在实践中是否真的是一个严重的问题,这仍然值得怀疑。因为用户与研究人员不同,如果他们发现GPT已经可以在他们的测试数据上表现良好,他们可能不会关心GPT在预训练期间是否看到了相同或相似的数据。

不论如何,为了最大化这一节在当前的实用价值,我尽最大努力,试图比较微调公共的更小型的模型(T5、FALN-T5、一些特殊设计的微调SOTA模型等)和最近的GPT-3(GPT-3.5、InstructGPT)、PaLM(或FLAN-PaLM)的最佳性能,如果这些模型的测评数据够获得的话。

适合使用GPT-3的任务

一般来说,有以下这些情况更适合使用提示GPT-3。令人惊讶的是,如果我们回看GPT-3论文的介绍部分,在那里很多初始设计时的目标涵盖了这些任务。这意味着那些当初宏伟的目标已经被部分实现了。

1.创造性和复杂的任务:包括代码(代码补全、自然语言指令生成代码、代码翻译、bug修复)、文本摘要、翻译、创造性写作(例如写故事、文章、邮件、报告,以及写作的改进等)。正如原始的GPT-3文献中所示,GPT-3被设计用于那些困难和“不可能标注”的任务。在一定程度上,对于这些任务,先前那种经过微调的模型不可能应用于真实世界的应用;而GPT-3使它们成为可能。举个例子,最近的文章显示,过去的人类标注的文本摘要已经被LLM生成的摘要所超越。

在某些需要从低、中资源语言翻译到英语的机器翻译任务中,通过提示PaLM-B,它甚至能够超越微调模型。

在BLOOM-B中也观察到了类似的趋势。这是因为英语数据通常在预训练语料库中占了很大比例,因此LLM擅长于生成英语语句。注意到,为了在代码任务中获得良好性能,尽管Codex和PaLM已经在整体上具有比之前模型更好的性能,我们仍然需允许LLM多次(k次)采样,以通过测试样例(使用pass

k作为度量)。

2.只有少数标注或者没有标注数据的任务。正如原始的GPT-3文献所说,GPT-3是为了那些“昂贵标注”的任务设计的。在这种情况下,用极少量标注数据微调一个更小的模型通常不可能达到GPT-3在零样本(zero-shot)、单样本(ont-shot)或少样本(few-shot)的情况下的表现。

3.分布外(Out-of-distribution,OOD)泛化。给定一些训练数据,传统的微调可能会过拟合训练集并且有较差的分布外泛化能力;而少样本的上下文学习(in-contextlearning)能够有更好的分布外泛化性。例如,带有提示的PaLM能够在对抗自然语言推断任务(AdversarialNaturalLanguageInference,ANLI)上超越经过微调的SOTA模型,而它在正常的语言推断任务上可能仍然劣于微调的SOTA。

另一个例子是提示LLM比微调模型显示出更好的组合泛化能力。更好的分布外泛化性可能是因为在上下文学习期间不需要更新参数,避免了过拟合;或者因为那些过去的分布外样例对于LLM而言是分布内的。这种使用场景被阐释为GPT-3的初始设计目标之一:“微调模型在特定任务的数据集上的性能可以达到所谓的人类水平,实际上可能夸大了在真实世界中该任务上的性能,这是因为模型只是学到了训练集中存在的虚假的相关性,以及模型过度拟合了这个训练集狭窄的分布。”

4.需要处理多种任务的能力,而非

分享 转发
TOP
发新话题 回复该主题