现代自然语言处理 详细概述. 第2部分 GPTs

现代自然语言处理概述 第2部分 GPTs

在该系列文章的第一部分中,我们讨论了Transformer如何结束了自然语言处理和理解的序列到序列建模时代。在本文中,我们将重点关注最强大的生成式自然语言处理工具之一OpenAI的GPT的发展,并且我们还将查看沿途的某些发展。

Transformer之后的NLP领域的演变

在开始之前,让我们来看看在NLP领域取得重大进展的工作的时间表。这将有助于更好地理解先前工作的进展如何影响即将到来的发展,并更好地解决它们之间的相互依赖关系。

年份和发表的工作

生成式预训练Transformer(GPT)

2018年,OpenAI推出了GPT,通过实现预训练、迁移学习和适当的微调,证明了Transformer可以实现最先进的性能。从那以后,OpenAI一直在增加模型的能力和参数,并改善训练数据,产生了现代工具如ChatGPT、InstructGPT和AutoGPT。

但是,问题是,所有这些概念是如何结合在一起的呢?让我们一步一步来看。

半监督序列学习

众所周知,监督学习有一个缺点,就是需要大量的标记数据集进行训练。在NLP领域,要获取大量的数据以便训练模型,以便模型能够获得单词的正确上下文和嵌入,一直是一个挑战。2015年,Google的Andrew M. Dai发表了一篇名为《半监督序列学习》的论文,其中作者提出了一种无监督的方法,用于在不同的文档(如DBPedia摘录、IMDB、Rotten-tomato评论和未发表的手稿)上对模型进行预训练。观察到,这种预训练使模型对单词有了更好的理解,从而得到更好的嵌入。

架构

最后,他们对模型进行了特定任务的微调,这是一个监督任务,发现学习效果更加稳定且收敛更快。因此,总体而言,半监督过程产生了奇迹。

作者使用了基本的LSTM,并使用了剪辑梯度方法进行训练,这被证明对于预测比常规RNN效果更好。接下来,作者使用了两种预训练方法。

  1. 模型接收一个序列并训练以预测下一个单词。这被称为LM-LSTM,或语言建模模型,是这个任务的名称。
  2. 模型接收一个序列,然后创建一个单一向量,模型的解码器使用该向量来重构整个句子。这被称为SA-LSTM,或序列自动编码器模型,因此是由于编码创建任务而命名的。

后来,这些预训练模型在添加微调后被用于情感分析等任务,并发现超过了最先进的性能。其他发现包括:

  1. 预训练增加了学习的稳定性和模型的泛化能力。
  2. 增加更多的数据进一步提高了改进。
  3. 由于SA-LSTM需要查找整个句子更长的上下文,相比之下,LM-LSTM只预测下一个单词,因此它们更加关注较短的上下文,因此SA-LSTM的性能更好。

论文链接:https://arxiv.org/pdf/1511.01432.pdf

重要结论:预训练提升性能。

通过总结长序列生成维基百科

这项工作是由Google的Peter J Liu在2019年发表的。作者们提出,通过仅使用原始Transformer架构的解码器部分,而不是使用整个架构,可以实现类似摘要的生成任务的最先进性能。该架构是一种自回归架构,即模型一次生成一个词,并使用预测的词附加的序列来预测下一个词。基本上,它根据前一个词的上下文预测一个词。

作者们使用多个维基百科文档作为任务的源文档,并使用强大的RNN和Transformer编码器-解码器基线模型验证了提出的架构的性能。

由于使用了多个源文档,存在重复的情况,导致了一个庞大的数据集,由于缺乏计算能力,无法对模型进行训练。因此,作者们采用了一个类似人类的两阶段过程。

第一步:从不同的文章中提取要点,形成一组有用的信息。为了实现这一点,使用了提取式摘要方法,如tf-idf和text-rank算法。作者们使用了5种提取方法,并选择了最佳表现者。

第二步:最后一步是使用抽象摘要方法或深度学习方法(在本例中是Transformer的解码器)真正地总结第1步中选择的要点。

该架构与我们在真正的Transformer中看到的架构相同,包含一个Masked Attention块,后面是一个自注意力块,最后是一个全连接层,只是省略了编码器块。句子及其结果被连接成一个单一的向量,并传入模型进行训练。解码器层创建了一个隐藏向量,该向量传入一个softmax层,用于词预测。

架构

论文链接:https://arxiv.org/pdf/1801.10198.pdf

重要结论:对于生成任务,解码器已经足够。

通用语言模型微调用于文本分类:UlmFit

这项工作由Fast AI的Jeremy Howard于2018年发表,成为了这个领域的一项主要发展,为我们今天看到的所有NLP模型提供了动力。作者们在自然语言处理、理解和推理领域引入了迁移学习的概念。

熟悉计算机视觉领域的人对迁移学习这个概念应该有所了解,所以我们需要稍微转向计算机视觉领域来理解其重要性和寻找相当的原因。

由于在图像处理中,监督学习需要大量的数据集来训练超深层模型,数据的稀缺性成为一个问题。在这一点上,像ImageNet和MS-COCO这样的数据集带来了大量的数据,足以训练这些模型。一旦模型训练完成,发现模型对于对象边界检测、颜色和梯度检测有一个很好的普遍概念。因此,尽管这些模型是在不同的源任务上训练的,我们可以使用这些训练好的模型,并更改最终的分类层,轻松地对其进行微调以适应其他任务。这些通用模型有助于在数据不足的任务中取得出色的结果。

现在,回到NLP领域,模型主要是针对特定任务进行训练的,所以如果数据很少,就没有办法。出现了对泛化的需求。这并不是说,之前没有尝试过迁移学习的概念,但它们从未成功过,然后出现了救世主。作者们为所谓的“下游任务”找到了一个解决方案,这些任务的数据可用性较少,需要根据预训练模型进行相应的微调。

作者们提到了失败的原因,即对如何进行微调模型的缺乏了解,同时承认使用像语言模型这样的目标来初始化模型的预训练权重的好处。作者们提到,先前的工作需要太多的标记数据来进行微调,这严重影响了可用性。当研究人员试图使用较小的数据集进行训练时,由于缺乏数据,导致过拟合数据集,并引入了模型中的遗忘特征或泛化丧失,最终导致发散。

作者们提出了一种三步方法来训练和微调预训练模型以发挥最佳性能。为了证明这一观点,作者们使用了一个普通的3层LSTM模型,并使用了一个包含100个标记的IMDB评论的短数据集进行微调,以证明其样本效率。

Ulmfit的学习步骤

让我们来看看这个步骤:

  1. LM预训练:语言模型的预训练在Wikitext-103(Merity等人,2017b)上进行,包括28595个经过处理的维基百科文章和1.03亿个单词。作者建议,从规模上来说,这是一个可与ImageNet相媲美的数据集,并足以创建一个好的预训练模型。
  2. LM微调:作者提到,尽管预训练是找到良好的初始化权重和广义词义的好方法,但要处理特定领域的任务,模型首先需要在该领域的词汇上进行微调,因为在一般领域和目标任务特定领域的单词分布可能不同。现在,请记住,在这个阶段我们并没有使用所需的分类器层来微调模型,我们只是在进行相同的语言建模任务,只是数据集是特定于领域的,仅仅是为了正确地调整单词的分布。但是这里有一个问题,我们不能简单地微调模型,因为存在过拟合的风险。a. 判别式微调:已经发现模型的不同层捕捉到了不同级别的数据。如果我们尝试以相同的学习率训练模型的所有层,会导致过拟合。相反,作者建议以不同的速率训练模型的不同层。对于使用SGD的正常反向传播,方程式如下:

θt = θ(t−1) − η · ∇θJ(θ)

其中,θ表示模型权重,η是学习率,t是时间步。作者将模型的层分为0到L级,并将模型参数θl和ηl定义为训练第l层的学习率。新的方程式变为

通常,(l-1)层的学习率是l层学习率除以2.6。

b. 倾斜三角形学习率:观察到层的恒定学习率会影响学习收敛。为了解决这个问题,作者提出了倾斜三角形学习率。这意味着模型的特定层应该不以恒定学习率进行训练,而是应该在所有训练周期中逐渐增加,达到最高值,然后逐渐减少。

倾斜学习率曲线

在这种情况下,学习率是迭代次数的函数。

3. 分类器微调:这是最后一步,我们将增强的模型添加一个分类器,根据我们的目标任务进行训练。作者借鉴了计算机视觉的做法,在模型中添加了一层批量归一化和softmax。作者使用了两种方法来提高性能:

a. 连接池化:观察到在分类任务中,我们主要使用一些具有最大影响的单词;例如,在情感分析中,像”best”和”good”这样的词几乎可以确定它传达了积极的情感。现在,这些单词可以出现在文档的任何位置,因此也可以出现在隐藏状态表示中的任何位置。为了专注于有影响力的单词,作者同时添加了最大池化和均值池化。最终的隐藏层输出是隐藏层输出、最大池化版本和均值池化版本的串联。层输出表示防止信息丢失,而池化版本专注于有影响力的单词。

b. 渐进解冻:作者观察到,如果从一开始就解冻所有层并一起训练,会引入灾难性遗忘行为,因为可能最后的层次最适合具有更广泛的理解。为了解决这个问题,引入了渐进解冻。首先解冻并训练最后一层,然后在固定的训练轮数后解冻前面的层,以此类推,直到对所有层进行微调。

论文链接:https://arxiv.org/pdf/1801.06146.pdf

重要结论:即使在不同的训练任务上训练,模型也可以针对目标任务进行微调。

最后,

通过生成预训练来提高语言理解

GPT,即Generative Pre-trained Transformer,是由OpenAI的Alec Radford于2018年发表的。这项工作非常巧妙地和优化地利用了先前开发的所有发现,并将它们与大规模参数化模型和经过精心筛选的训练数据相结合,以实现巨大的性能提升。

GPT的目标是学习一种通用表示,可以在很少适应的情况下转移到各种任务中。它是另一种基于Transformer解码器的自回归模型,使用了两步方法进行训练。第一步是无监督的预训练阶段,然后是特定任务的微调。作者使用了ULMFit建议的方法来微调模型以获得更好的性能。

  1. 预训练:

作者将预训练文档序列分解为长的单向量序列,并使用语言建模目标进行预训练。在处理能力允许的情况下,最大化序列的长度,作者声称使用更长的序列可以训练模型处理长期依赖关系。此外,作者还在预训练期间添加了一些辅助目标,如POS标记、块划分和命名实体识别,这有助于改进监督模型的泛化能力并加速收敛。

2. 微调:

对于微调,作者使用了遍历模型,意味着他们将输入和输出附加在单个向量上;对于需要生成的任务以及类似的任务,通过唯一的分隔符字符将两个句子的对称连接在一起。

在GPT上测试的目标任务类型

文本蕴含:对于蕴含任务,我们将前提p和假设h的标记序列连接起来,中间用分隔符标记($)分隔。

相似性:对于相似性任务,两个被比较的句子没有固有的顺序。为了反映这一点,我们修改了输入序列,包含两种可能的句子排序(之间用分隔符分隔),并分别处理每个序列以产生hml的两个序列表示,然后将它们在输入线性层之前进行元素相加。

问答和常识推理:对于这些任务,我们给定一个上下文文档z,一个问题q和一组可能的答案{ak}。我们将文档上下文和问题与每个可能的答案连接起来,中间添加一个分隔符标记,以获得[z; q; $; ak]。这些序列中的每一个都会经过我们的模型独立处理,然后通过softmax层进行归一化,以产生可能答案的输出分布。

这是微调的排列方式。

模型规格和数据:为了使用语言建模预训练模型,作者使用了BooksCorpus数据集来训练语言模型。该数据集包含来自各种流派(包括冒险、奇幻和浪漫)的超过7,000本未发表的图书。

我们训练了一个12层的仅解码器Transformer模型,使用了掩蔽自注意力头(768维状态和12个注意力头)。对于位置级的前馈网络,我们使用了3072维的内部状态。我们使用了Adam优化方案[27],最大学习率为2.5e-4。

本节描述了模型架构。我直接引用论文中的内容,以避免出现差异,并且具备了理解真正的Transformer架构的知识,这非常简单。

链接: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf

多年来的改进

至今我们已经讨论了第一代GPT模型的工作原理。自那时以来,OpenAI一直在努力提高性能,进行多次微调,并利用大数据领域的改进。

语言模型是无监督的多任务学习器

这篇论文由OpenAI于2019年发布,揭示了GPT-2作为GPT的继任模型的基本版本。OpenAI发布了一篇论文和一个比实际模型更小的模型,他们没有发布实际模型,因为他们预计人们会滥用该模型的能力。

OpenAI表示,这个模型的唯一目标是提高其生成能力,即可以最优地预测下一个词。作者们观察到,所有最先进的模型都遵循半监督学习方法,但对目标任务非常脆弱和敏感,也就是说,如果训练来完成不同的目标任务,它们会发散。为了减轻这个问题,作者们希望有一种更通用的方法。作者们基本上想为下游任务建立一个零样本学习环境,这意味着不需要额外的数据集来进行微调,完全无监督。

多任务学习或元学习似乎成为实现这一目标的稳定框架。在这个领域的研究已经在10个数据集的结合中,在17个任务上取得了不错的性能。作者们意识到,特定任务学习和多任务学习之间的区别主要在于模型预测的概率,特定任务学习是P(output/input),而多任务学习是P(output/input, task),因为它可能会有所不同。从不同的任务条件工作中(即将单个目标任务表示为不同目标任务链,并测试模型在它们上的表现),观察到如果无监督预训练任务的全局最小值(即语言建模)与微调的监督任务的全局最小值重合,模型表现最佳,因此最终目标是优化无监督任务并找到最佳全局最小值。从实验证明,只要有足够大的数据集,就可以实现这一目标。

数据集:作者们利用一个名为Common Crawler的网络爬虫用于类似的工作,并自己设计了一个爬虫来创建一个名为WebText的数据集,其中包含这4500万个链接的文本子集,800万个文本文件,总计40GB的数据。作者们还使用了BPE或字节对编码,它在词级和字符级编码之间划定了一个界限,使得该模型可以对任何类型的数据进行训练。

模型改进:作者们稍微修改了Transformer解码器块,在块之前添加了一个归一化层作为一种预激活,以及在最后的自注意层之后添加了另一个归一化层和残差连接。该模型总共包含15亿个参数,是GPT-1模型的十倍。

发现:通过将这个庞大模型预训练在大量的通用数据(如维基百科摘录)上,研究人员发现生成模型在没有任何微调的情况下工作得相当好。这引发了称为零样本学习的概念,因为这些模型不需要任何标记的数据集来训练,仍然能够提供性能。

论文链接: https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf

结论

近年来,OpenAI通过多任务学习等多种概念开发了GPT3等更多模型,这是另一个要讲述的故事,因为已经太长了。在本文中,我们看到了NLP世界发展到GPT-2的演变。我们将在系列文章的下一篇中看到更多的发展。

愉快阅读!