GPT(Generativepre-Training)是指使用生成式预训练的语言模型,是NLP领城中的一种强大的模型。初代的GPT是在2018年由 OpenAI提出的,之后更新为GPT2GPT-3、InstructGPT,以及后续一系列变体模型(统称GPT-3.5系列),最终发展到如今的智能对话搜索引擎ChatGPT,以及多模态引擎Visual ChatGPT和GPT-4。初代的GPT-1已经在多种任务中达到了SOTA,而之后的GPT甚至可以解决未经过训编的新任务(Zero-shot),并可以生成符合人类阅读习惯的长文本或者生成符合输入文本语义的逼真图像、视频等。在这个更新迭代的过程中,GPT 模型和数据的体量、训练的方式、模型的架构等都发生了改变,GPT-3和GPT-4的参数量分别达到了175亿参数和100万亿参数,大模型的概念因此被提出。
研究大模型是至关重要的,由于业务场景复杂,对AI的需求呈现出碎片化、多样化的特点。从研发到应用,AI模型成本高且难以定制,导致AI模型研发处于手工作坊状态,公司需要招聘新的AI研发人员。为了解决这个问题,大模型提供了"预训练大模型+下游任务微调"的方案,通过大规模预训练扩展模型的泛化能力,解决通用性难题,并应用于自然语言、多模态等各项任务。为了进一步阐明GPT和大模型为何有如此强大的能力,下面我们将对GPT的发展历史和其中的关键研究论文中的技术细节进行详细的阐述。
1.GPT-1
GPT-1试图解决的问题是,如何在人工标注稀缺的情况下尽可能地提升性能。在GPT-1之前大部分的 NLP模型都是针对特定任务而训练的,如情感分类等,所以使用的是有监督学习。但有监督的学习方式要求大量人工标注数据,并且训练出的模型无法泛化到其他任务上。经验表明,从无监督学习得到的表示可以让性能显著提升比如广泛使用预训练词嵌入来提高NLP任务的性能。但是如何进行无监督训练、如何设定目标函数、如何将无监督训练的模型匹配下游任务,这些问题仍有待解决。为了解决上述问题,GPT-1选择了一种半监督方法,即"预训练+微调"。该方法分为两个阶段,第一阶段使用大量数据进行无监督训练 ,让模型学习词之间的相关关系,或者说"常识";第二阶段通过有监督学习的方式 进一步提升模型解决下游任务的能力,并且不改变模型的主要结构。具体来说,第一阶段的目标函数是自回归式的 ,模型要最大化下面这个似然函数。其中是神经网络的参数,即使用前k个词来预测第k+1个词。这样训练的模型可以捕捉到词之间的相关关系,得到较好的表示。第二阶段训练的目标函数则是有监督的形式,GPT-1的第二阶段训练使用了L2+L1来提高泛化能力。经过无监督训练的模型只需要加上一个线性层中的sofmax层 就可以进行有监督训练 。由于无须改变模型的主要结构,所以可以较好地利用无监督训练得到的表示。此外,在进行微调时还需要对输入文本进行结构化的变换,如加入起始符 和终止符 ,在例子之间加入分隔符 等,让模型理解所进行的任务类型。经过预训练后的Transformer 可以被用在各种下游任务(下游任务"通常指的是在完成一系列预处理或中间步骤之后,需要执行的具体任务或目标的任务)中进行微调,比如完成MultipleChoice(多选)、Similarity(相似度计算)、Entailment(蕴涵关系)、Classification(分类)等任务。
在模型方面,GPT-1使用的是Transformer,这是因为Transformer 具有更加结构化的记忆单元来解决长距离依赖问题,能够处理更长的文本信息,从而使得学习到的特征在各个任务中的迁移具有更强的鲁棒性。完整的Transformer包含编码器和解码器两个部分,而GPT只使用了Transformer的解码器部分,因为解码器中可以使用mask 机制让模型只能接触到上文信息,从而匹配GPT的无监督训练目标。在此之前LSTM 是语言模型的主要架构,但GPT发现 Transformer 作为语言模型,比LSTM 有更高的信息容量,效果更好,因此开创了大模型以Transformer(及其变体)为基的先河。
与 GPT同一时期的"竞争对手"BERT是一种mask语言模型,即在预测句子中某一个词的时候可以同时看到它的上下文信息,类似于一种完形填空任务,所以BERT 选择的是Transformer 的编码器模块。GPT仅使用前文信息预测当前词,这种目标函数是更难的,使用前文信息预测未来信息自然比完形填空难度更大。在此我们给出了GPT-1的模型参数和训练参数,并且在后续内容中和GPT-2,GPT-3进行对比,以此让大家认知GPT系列模型的大小。GPT-1的总参数量为1.11亿参数,其中特征维度为"768",Transformer 层数是"12",头数为"12",训练数据为BooksCorpus数据集,文本大小约5GB。该数据集是由约 7000 本书籍组成的。选择该数据集主要的好处是书籍文本包含大量高质量长句,保证了模型学习的长距离依赖。
实验结果表明,在12个任务中,GPT-1在其中的9个任务中的表现比专门有监督训练的 SOTA模型表现得更好。此外,GPT-1还显示出了一定的 Zero-shot 能力,即在完全未训练过的任务类型中也有较好的性能。随着GPT预训练步数的增加,模型在下游与预训练相关任务上的Zero-shot的表现超过了传统的LSTM感器,并且拥有更小的方差,这表明GPT有着更好的稳定性和记忆归纳能力。这是因为GPT-1在预训练中获得了较强的泛化能力,这也为GPT-2、GPT-3 的出现打下了基础。
2.GPT-2
GPT-2发现模型在大规模数据上进行无监督训练后,有能力直接在多个任务之间进行迁移,而不需要额外提供特定任务的数据。在此介绍一下GPT-2中的核心思想--"Zero-shot"。不论是GPT-1还是BERT,使用"预训练+微调"的范式意味着对一个新的下游任务还是需要有监督数据去进行额外的训练的,其中可能会存在较多的人工成本。GPT-2试图彻底解决这个问题,其背后的思想是,当模型的容量非常大且数据量足够丰富时,仅仅靠语言模型的学习便可以完成其他有监督学习的任务,不需要在下游任务中进行微调。GPT-2相比GPT-1,其改进主要在模型大小和训练数据大小上。GPT-2有15亿参数,Transformer有48层,并目上下文窗口为"1024"。GPT-2训练了4个不同大
小的模型,参数量分别为1.17亿参数、3.45亿参数、7.62亿参数和1.5亿参数,实验结果发现模型越大,下游任务的性能就越好,并且随着模型增大,模型的"perplcxin*会下降。这意味着模型更好地理解了语言文本。训练样本为从Redit中挑出的高质量帖子做成的网页文本(WebText),其中有40GB的文本数据。WebText数据集远远大于GPT-1使用的 BooksCorpus数据集。GPT-2的作者指出大规模的模型必须要用更多的数据才能收敛,而实验结果表明模型现在仍处于欠拟合的状态。GPT-2的模型架构也有所微调,层归一化(LayerNormalization)被挪到了每个子模块之前的输入位置,效仿了预激活残差网络(Pre-Activation ResNet);对残差层的参数进行了缩放,在最后的自注意力层后加了额外的层归一化。这些调整都是为了减少预训练过程中各层之间的方差变化,以使梯度更加稳定。此外,GPT-2使用了多任务训练的方式,并提出了"Task Conditioning"的概念,即特定任务的学习目标应写为p(outputinput,task),模型对于同一个数据,在不同的任务中应生成不同的输出。对于语言模型"Task Conditioning"可以通过在输入文本中加入样例或自然语言的摄示语句等方式完成。这个概念为"Zero-shotLearning"提供了基础。
Zero-shot Learning"(又称"Zero-shot Task Transfer")指模型可以在没有任何训练样本和自然语言样例的情况下,理解任务的需求并根据自然语言指示生成正确的回答。GPT-2希望通过大模型和大数据训练来实现这种能力。与GPT-1的微调阶段不同。在处理下游任务时 GPT-2不需要对语句进行重组,而是直接接受自然语言提示,比如英文到中文的翻译问题,模型的数据就是英文语句,然后是单词"Chinese"和提示词":"。这样 GPT-2就不需要对下游任务的数据进行调整,也就不涉及在无监督训练中使用特殊分隔符了。通过建立尽可能大且多样的数据集来收集尽可能多的、不同领域、不同任务的自然语言描述,从而让 GPT-2有理解任务内涵的能力。实验结果表明,GPT-2在较多任务上相比无监督算法是有一定的提升的,它在8个任务中的7个任务中,在Zero-shot的情形下,提高了SOTA,这说明它拥有 Zero-shol的能力。但是在很多任务中与有监督微调的方法相比还有一定差距,即使 GPT-2的参数量比BERT多,但在主流的NLP下游任务中的表现相比 BERT 并不突出。此外,实验结果表明该模型仍处于一个欠拟合的状态,并且模型越大,性能越好,这说明GPT-2中15亿参数还没有达到模型的极限。GPT-2 随着参数量的增长,在各个下游任务上的性能也在上涨,并日还有继续上涨的趋势。
3.GPT-3和大模型
从 GPT-2的实验可以发现,随着型大小的增加,模型的Zero-shot 能力也在增加。为了建立一个尽可能强大的且不需要微调就能处理下游任务的语言模型,OpenAI提出了 GPT-3。GPT-3 的模型为1750亿参数,远远超过 GPT-2的参数。大量的模型参数和训练数据使得GPT-3可以在下游的"Zero-shot"或者"Few-shot"任务中有着出色的表现。不仅如此,GPT-3可以生成高质量的文章,并且还有数学计算、编写代码的能力。本小节,我们将结合GPT-3中的核心技术和关键概念(少样本学习、上下文学习、提示学习和涌现能力)进行介绍。
少样本学习
少样本学习(Few-shot Learming)是机器学习中的一种学习范式,其目标是从很少的训练样本中学习得到一个模型,并使其能够快速地进行分类、识别或者回归等任务。在传统机器学习中,通常需要大量的标注数据来训练模型,例如,对于一个分类任务,可能需要数千或数万个标注数据才能训练出一个较好的模型。但是在实际场景中,很多时候我们可能只能获得很少的标注数据。这时,少样本学习就可以派上用场上了。少样本学习的核心思想是通过学习少量的样本,得到一个能够泛化出新数据的模型。此前少样本学习主要使用基于元学习的方法。这些方法通过使用一个元学习器从多个小任务中学习到通用的特征表示,从而使得模型在新的任务上可以利用少量的样本数据进行泛化。
GPT3使用的是基子生成模型的"Few-shot Learning"方法,通过在大规模无标注数据进行预训练,它能够在输入的样本中找到样本文字的规律,然后结合其在预训练中学到的文字规律去解决目标问题。GPT-3不是GPT-2那种不需要任何样本就能表现很好的模型,而是像人类学习一样,阅读极少数样本之后便可以根据过往的知识和部性本的知识解决特定问题。注意GPT-3仅仅是阅读新样本,并不会根据新样本进行梯度更新。因为在 GPT-3的参数规模下,即使是微调,成本也是极高的。当输入文本中包含较少的几个样本时,GPT-3 展现了强大的从样本中学习的能力并超过了基于微调的 BERT模型。
具体来说,在"Zero-shot"情形下,测试输入中仅使用当前任务的自然语言描述而在"Few-shot"情形下,测试输入中除了有自然语言的描述,还有在模型上下文窗口中加入的样本。GPT-3可以根据任务描述和样本示范来回答问题。"One-shotLeaming"是少样本学习中的特例,其仅仅使用一个样本示范。
上下文学习
上下文学习(In-contextLearning)是一种比较新的自适应学习技术,指在完成特定任务时,结合任务所处的上下文环境,将相关信息纳入模型,以提高模型的准确性和泛化能力。传统的机器学习模型通常从一个静态的数据集中学习,然后应用到新的数据中。这种模型缺乏对数据的实时理解和适应能力,很难处理一些涉及时间、空间、位置等动态变化的任务。而上下文学习倡导结合任务的上下文环境进行学习,以便更好地理解和处理数据。注意,GPT-3在上下文学习中不更新梯度,而是设计输入上下文来充分挖掘模型已有的能力,从而提高性能。在GPT-3中,上下文学习通常在以下场景中使用:
1.生成对话。当GPT-3被用于生成对话时,上下文学习可以帮助模型根据当前的上下文和对话历史生成更加准确和流畅的回复。例如,当模型被要求回答"你最喜欢的食物是什么?"时,上下文学习可以帮助模型基于之前的回答和对话历史来生成更好的答案。
2.文本生成。当GPT-3 被用于文本生成任务时,上下文学习可以帮助模型根据当前的上下文和任务需求生成更加准确和有逻辑的文本。例如,在给定一些输入信息后,模型可以使用上下文学习生成更加准确的摘要或描述。
3.问答。当GPT-3 被用于问答任务时,上下文学习可以帮助模型根据当前的问题和上下文生成更加准确和有逻辑的答案。例如,在回答一个开放式问题时,上下文学习可以帮助模型在回答中融入当前的上下文,从而生成更加合理的答案。
提示学习
提示学习(PromptLeamming)是一种自适应学习技术,用于自然语言处理领域中的预训练语言模型。它的目标是让预训练语言模型能够通过简单的提示完成各种任务,而无须进行额外的特定任务的微调。提示学习的基本思想是使用预定义的提示来指导预训练语言模型的生成过程。通常这些提示针对的是特定任务的文本片段,可提问题、关键字、主题等。在训练过程中将这些提示与输入文本一起给预训练语言型,模型可以根据提示生成相应的输出结果,从而实现特定的任务。在提示学习中"提示"被视为对模型的指令,它们指导模型在不同的上下文中执行不同的任务。他用提示的好处是,可以使模型更加专注于特定的任务,从而提高模型在这些任务上的性能和效果。此外,提示学习还可以避免在特定任务上进行额外的微调,从而减少模型的计算负担和训练时间。
在 GPT-3 中,提示学习可以让用户输入自定义的提示,从而指定模型要执行的务和要生成的内容。例如,用户可以将"Translate from English to Spanish"作为提示然后输入一段英语文本,GPT-3会根据这个提示生成对应的西班牙语。用户还可以通过输入不同的提示来控制文本风格、主题等。GPT-3还可以使用一种名为"CompletionPrompt"的提示方式,这种提示方式将任务要求以自然语言的形式呈现给模型,模型再根据提示生成相应的文本结果。在GPT-3中,"Completion Prompt"通常由两部分组成:任务描述和文本模板。"任务描述"描述了模型需要完成的任务,如文本分类生成、问答等。在"CompletionPrompt"中,任务描述通常以自然语言的形式给出,如"给定以下文本,预测它属于哪个类别"或"给定以下问题,回答问题"等。"文本模板"则是指用于生成文本结果的模板文本。在"Completion Prompt"中,文本模板通常是一个带有空缺的句子,模型需要根据任务描述和文本模板生成一个完整的句子。
除了提示学习,研究者们发现还可以使用一种模拟人类思考习惯的学习方式,即"思维链提示"(Chain-of-ThoughtPrompting)。人类在解决数学、逻辑等推理问题时通常要把问题分解为多个中间步骤,在逐个解决每个问题后得到答案。思维链提示的目标就是使语言模型产生一个类似思维链的能力。在Few-shot场景下,输入的样本会包含详细的推理过程,从而鼓励模型在输出的回答中提供连贯的思维链,以得到更准确的答案。而在Zero-shot情形下,仅仅在提示中输入"Let's think step by step"(让我们一步一步地思考)就能显著提高模型预测的准确率。在多轮对话的情形下,思维链提示不是单独生成每一轮对话,而是将每一轮对话当作一个环节,将它们组成一个连续的链条。这样做的好处是,它可以避免生成无意义或不连贯的对话,同时还可以保持对话的连贯性和一致性。思维链提示的实现方法通常是将上一轮的回答作为下轮的输入,并使用自然语言模型生成下一轮的回答。在生成下一轮回答时,模型会考虑到上一轮的回答和任务描述,以保持对话的一致性和连贯性。标准提示(Standard Prompting)与思维链提示(Chain-of-ThoughtPrompting)进行对比,在思维链提示下,模型会在回答问题时给出推理过程及案,进一步利用大模型的推理能力。