chatgpt模型详解系列–gpt2、gpt3
前言
上篇文章主要介绍了gpt1到gpt4的大概发展流程以及详细介绍了gpt1,这篇文章介绍gpt2与gpt3 本系列以及后续相关文章将同步发布至个人公众号欢迎公众号搜索 AI研究小学僧 查看
GPT-2是OpenAI在2019年提出的一种大规模的语言模型,它的论文标题是Language Models are Unsupervised Multitask Learners。GPT-2是在GPT-1的基础上进行了改进,它的模型结构与GPT-1几乎没有变化,只是增加了模型的层数、宽度和参数量,并且取消了微调的步骤。这意味着GPT-2只需要进行一阶段的预训练,就可以直接应用到多种不同的自然语言任务上,如文本摘要、文本生成等,而无需进行任何任务特定的微调。这样,GPT-2可以实现统一建模,提高模型的泛化能力和灵活性,并且在相关领域取得了很好的效果。
GPT-1使用了12层的Transformer作为其模型结构,而BERT最多使用了24层的Transformer。GPT-2则使用了48层的Transformer,共有15亿个参数。这使得GPT-2成为当时最大的语言模型之一。GPT-2使用了一个称为网页数据(WebText)的数据集作为其训练数据,该数据集是从网站Reddit上爬取的大量外链文本组成的,经过了一些简单的数据清洗,并且覆盖了多个领域和主题。论文中指出,大规模的模型需要更多的数据才能收敛,并且实验结果表明,目前的模型仍然处于欠拟合的状态。因此,增加数据量和模型规模是提升语言模型性能的有效途径。
之前的自然语言模型大多数采用无监督的预训练和有监督的微调的方法,但这种方法有一个缺点,就是针对每个特定任务都需要不同类型和规模的标注数据。而标注数据往往是稀缺、昂贵和单一的,导致系统缺乏泛化性和鲁棒性。OpenAI想通过构建和利用足够大且多样化的数据集,来保证最终的模型能够应用于多个不同的自然语言任务中。为此,OpenAI专门从网站Reddit上爬取了得分高的外链文本作为数据源,并且去除了维基百科等常见数据源。最终得到了一个大小为40GB的数据集,称为网页数据(WebText)。由于Reddit网站上的数据涵盖了各个领域和主题,所以既保证了数据质量、数量又保证了数据多样性。
此外,据研究表明,语言模型有望完成某些特定任务,如常识推理、情感分析等。所以OpenAI提出了去掉有监督的微调阶段,仅采用无监督预训练的语言模型来直接应用到下游任务中。OpenAI通过GPT-2论证了这种方法的可行性,并证明了语言模型在相关领域具有很大潜力。
在本节中,我们将详细介绍GPT-2模型的原理和特点,以及它在各种任务上的表现。
3.1 GPT-2模型结构
自然语言处理任务,如问答、机器翻译、阅读理解和摘要,通常需要在任务特定的数据集上进行有监督的学习才能完成。然而,OpenAI在其论文中证明了,当语言模型在一个由数百万网页组成的新数据集WebText上进行无监督的预训练时,它们就开始学习这些任务,而不需要任何明确的监督信号。例如,当给定一个文档和一个问题时,语言模型可以生成一个合理的答案,在阅读理解CoQA数据集上的F1分数达到了0.55。这说明语言模型具有很强的泛化能力和自适应能力,它们可以利用预训练阶段学习到的通用语言知识来解决各种下游任务。GPT-2就是这样一种强大的语言模型,它在零样本(zero-shot)设置下,在8个测试数据集中有7个实现了最好的性能。
1. 具体方法
GPT-2 的核心是一个语言模型,语言具有天然的顺序性。和监督模型类似,语言模型是对序列的条件概率建模,通常可以表示为如下形式。
可以泛化为:
—任何有监督的任务,都是在估计:P(output|input)。通常我们会用特定的网络结构去给任务建模,但如果要做通用模型,它需要对下面的目标进行建模:P(output|input, task)。
有很多方法可以建模P(output|input, task),比如特定任务的编码器和解码器。语言模型提供了一种灵活的方式来指定任务、输入、输出。比如对于机器翻译任务,训练样本可以表示为序列(翻译为法语, 英语文本, 法语文本);对于阅读理解任务,训练样本可以表示为(回答问题, 文档, 问题,答案)。可以训练单一模型,使用这种格式的样本,对不同的任务做推断。按照上面的方法,语言模型也能够学习某些监督任务,并且不需要明确具体的监督符号。
下面是网页数据WebText训练集中的一个例子。
”Mentez mentez, il en restera toujours quelque chose, ” which translates as, ”Lie lie and something will always remain. ”
从这个例子可以看到,语料中包含了法译英的内容。那么在训练完上面的文本后,语言模型自然地学习到了法语如何翻译成英语。因此监督学习通常只是无监督学
习的一个子集,所以无监督学习的全局最小也必定是监督学习的全局最小。目前的问题变为了无监督学习是否能收敛。
2. 训练数据集
为了训练语言模型,OpenAI 从网上爬取了大量的语料,构建了一个名为WebText的数据集,包含了约800万篇文档,40G 的文本。这些文档涵盖了多个领域,不同于之前的工作,它们只针对单一文本领域,如新闻文章、维基百科或小说。另外,WebText还移除了维基百科(Wikipedia)的数据,以避免和其他数据集重复。
3. 模型改动
GPT-2 相对于 GPT-1 在模型方面几乎没有什么修改,只是在每个编码器层的输入和最后一个注意力层的输出都加入了一个层归一化(Layer normalization)。
为了解决模型深度对残差路径的累积问题,GPT-2 采用了修正的初始化方法,将残差层的权重缩放到倍,其中n为残差层的数量。此外,GPT-2 还扩展了词表的大小到 50257,输入的上下文大小从 512 扩展到了1024,并且使用更大的批处理大小(512)。
总结而言,GPT-2在GPT-1的基础上采用单向语言模型,并舍去微调阶段,利用高质量多样化的大文本数据训练得到一个巨型模型,最终在语言模型相关的任务中取得了不错的成绩。它的主要贡献有以下三点。
- 收集了一个大语料库WebText,即使对于像GPT-2这样的大模型,也依然处于欠拟合的状态。
- 最大的GPT-2模型有15亿的参数量,用零样本提示在很多任务上进行测试,发现有7/8的任务上都达到了最优版本。
- 验证了大模型 + 大语料 + 多样性数据的组合,在多个任务上也能取得不错效果,即使不做微调。
四、GPT-3技术原理
近年来,Transformer语言模型的容量大大增加,从1亿个参数,到3亿个参数,再到15亿个参数、80亿个参数、110亿个参数,最后到了170亿个参数。每次增加都带来了文本合成和下游NLP任务的改进,有证据表明,与许多下游任务相关的对数损失随着规模的增加呈现出平稳的提升趋势。由于上下文学习涉及将许多技能和任务吸收到模型的参数中,因此有可能在不同规模下,上下文学习能力也会有类似的强大收益。
OpenAI通过训练一个1750亿参数的自回归语言模型,即GPT-3,来测试这一假设,并测量它的上下文学习能力。具体来说,在NLP数据集上对GPT-3进行了评估,以及几个旨在测试快速适应训练集中不太可能直接包含的任务的新颖任务。对于每个任务,在以下三种条件下评估GPT-3的性能。
-
少样本学习(few-shot learning),或称为上下文学习,允许尽可能多的样本(通常为10到100个) 。
-
一个样本学习(one-shot learning),只允许一个样本。
-
零样本学习(zero-shot learning),一个样本也不提供,只给出自然语言的指令给模型。
下图展示了一个简单任务的少样本学习过程,要求模型从一个单词中去除多余的符号。模型的表现随着自然语言任务描述的添加和模型上下文中示例的数量k的增加而提高。少样本学习也随着模型规模的增大而显著提高。虽然在这种情况下的结果特别惊人,但这些学习曲线的一般趋势在大多数任务中都成立。这些学习曲线不涉及梯度更新或微调,只涉及作为条件的示例数量的增加。
从图中可以看出更大的模型能够更好地利用自然语言任务描述的上下文信息。我们可以看到,大模型的“上下文学习曲线”更陡峭,表明了从上下文信息中学习任务的能力得到了提高。此外,在许多任务中看到了类似的行为趋势。
1 如何训练GPT-3
OpenAI 使用的预训练方法,包括模型、数据和训练。GPT-3相比之前的大模型预训练,采用了多种上下文学习方式,探索了上下文内的不同学习设置。具体而言,有以下四种上下文设置。
图中展示了使用将 “英语翻译成法语” 的例子来说明上面的四种方法。OpenAI 特别强调了少样本提示的结果,因为它们中的许多仅略逊于最先进的微调模型,这主要是因为通过少样本提示,可以让模型更容易理解人类意图,要知道意图理解是大模型最难完成的任务。然而,单样本提示,甚至有时是零样本提示,似乎才是与人类表现最公平的比较。
2 GPT-3模型结构
GPT-3基于GPT-2的模型和架构,但在Transformer的每一层中采用了密集和稀疏注意力的交替方式,类似于稀疏Transformer的设计。为了探索模型性能与模型规模之间的关系,OpenAI训练了从1.25亿到1750亿参数不等的8个模型,其中最大的一个就是GPT-3模型。根据先前的研究,当训练数据充足时,验证集损失值服从幂律分布;因此,通过比较不同规模模型的验证集损失值和下游语言任务表现,可以验证这一假设。表4-1列出了8个模型的规模和结构参数。
模型 | 参数量 | 头数 | 层数 | 学习率 |
---|---|---|---|---|
GPT-3 Small | 1.25亿 | 64 | 12 | 6e-4 |
GPT-3 Medium | 3.50亿 | 16 | 24 | 3e-4 |
GPT-3 Large | 7.60亿 | 16 | 24 | 2.5e-4 |
GPT-3 XL | 13亿 | 24 | 24 | 2.5e-4 |
GPT-3 2.7B | 27亿 | 32 | 32 | 1.6e-4 |
GPT-3 6.7B | 67亿 | 32 | 32 | 1.2e-4 |
GPT-3 13B | 130亿 | 40 | 40 | 1.0e-4 |
GPT-3 175B | 1750亿 | 96 | 96 | 0.6e-4 |
3 训练数据
为了训练GPT-3这样的大规模语言模型,OpenAI利用了Common Crawl数据集,这是一个包含近万亿单词的庞大语料库。但是,Common Crawl的原始版本质量不高,需要经过一系列的筛选和清洗。OpenAI 采用了以下三个步骤。
- 第一步,从Common Crawl的不同版本中下载数据,并根据其与若干高质量参考语料库的相似度进行筛选。
- 第二步,对文档进行去重处理,消除数据集内部和跨数据集之间的重复内容。将一些已知的高质量参考语料库加入到训练混合中,提高Common Crawl的多样性和覆盖度。
- 第三步,OpenAI选择了几个高质量的数据集作为补充,包括一个扩充版的WebText数据集,该数据集是通过长期抓取网络链接而得到的,两个从互联网上收集的书籍语料库(Books1和Books2)以及英文维基百科。
表4-2展示了训练时使用的最终混合数据集的情况。Common Crawl包含了2016年至2019年间的网络数据,原始压缩文本大小为45TB,经过筛选后剩余570GB。在训练过程中,Common Crawl和Books2 数据集只被使用一遍(1个epoch),而其他数据集则被重复使用2-3遍(多个epoch)。
数据集 | token数 | 占比 | epoch |
---|---|---|---|
Common Crawl | 410B | 66% | 0.44 |
WebText2 | 19B | 22% | 2.9 |
Books1 | 12B | 8% | 1.9 |
Books2 | 55B | 8% | 0.43 |
Wikipedia | 3B | 3% | 3.4 |
4 训练过程
下图显示了不同模型的计算开销,其中GPT-3 1750亿的计算开销最大。
GPT-3使用了较大的模型和较大的批量大小,但相应地降低了学习率。训练过程和超参数设置的详细信息如下所示。
- 使用Adam优化器,设置参数β1=0.9, β2=0.95, ε=1e-8。
- 将梯度规范化到1.0。
- 使用cosin衰减,将学习率在训练完2600亿个token后衰减到原来的10%,然后继续训练。在前375亿token使用线性的热加载(warmup)。
- 动态调整批量大小,在前40~120亿令牌之间逐渐增加批量大小。
- 在训练期间对数据进行无重复采样,以最小化过拟合。
- 对模型权重使用0.1的正则化