一、引言
谷歌在2018年发布了BERT模型,很多方面超越了OpenAI发布的GPT-1模型,但是,OpenAI并没有放弃GPT的研究路线,甚至没有借鉴BERT的架构,而是继续采用单向transformer向前推进研究,在2019年2月发布了GPT-2,其参数计数和训练数据集大小相对应GPT-1都增加了十倍,并且,采用多任务的模式提高了泛化能力。总体来讲,GPT-2虽然取得了一些突破,但是,相对于GPT-1和GPT-3,只是一个过渡产品,起到了承上启下的作用。
二、相关论文
GPT-2的论文题为《语言模型是无监督的多任务学习者》(“Language Models are Unsupervised Multitask Learners”)。这篇论文介绍了GPT-2模型,它是一种基于Transformer架构的模型,在发布时以其庞大的规模(15亿个参数)而引人注目。该模型在WebText数据集上进行预训练,该数据集包含来自4500万个网站链接的文本。与之前的GPT-1架构相比,GPT-2做了一些修改:将层归一化移动到每个子块的输入处,类似于预激活残差网络,并在最后一个自注意力块之后添加了额外的层归一化。使用了修改过的初始化,该初始化考虑了随着模型深度在残差路径上的累积。残差层的权重在初始化时按1 / N缩放,其中N是残差层的数量。词汇表扩展到50,257。上下文大小从512扩展到1024个标记,并使用更大的批处理大小5122。

三、GPT-2要解决和优化的问题
GPT-2通过优化模型架构和实现,以提高模型的性能,并增加模型的参数数量和训练数据集的大小,以及对模型架构进行一些修改,以提高模型的准确性和效率,在这方面超越了竞争对手BERT。
但是,对于一个顶尖研究机构大的版本发布,只是扩大模型,增加参数等改进,应该是不足够的,因此,GPT-2提出通过无监督学习来解决多种自然语言处理(NLP)任务,如翻译文本、回答问题、总结文章和生成文本输出等,它的目标是通过预训练来提高模型的能力,使其能够更好地执行这些任务。
之前,机器学习系统通过使用大型数据集、高容量模型和监督学习的组合,在训练任务方面表现出色,然而这些系统较为脆弱,对数据分布和任务规范的轻微变化非常敏感,因而使得AI表现更像狭义专家,并非通才。GPT-2则转向更通用的系统,使其可以执行许多任务,最终无需为每个任务手动创建和标记训练数据集。跟传统ML需要专门的标注数据集不同(从而训练出专业AI),多任务模型不采用专门AI手段,而是在海量数据喂养训练的基础上,适配任何任务形式。这样,GPT-2调整优化的目的是为了解决零样本学习问题(zero-shot)。目前许多测试基准都已经提出了该理念,例如GLUE、decaNLP。
GLUE与decaNLP
GLUE 是 General Language Understanding Evaluation 的缩写,它是一个用于训练、评估和分析自然语言理解系统的资源集合。GLUE 包括:一个基于现有数据集建立的九个句子或句子对语言理解任务的基准,旨在涵盖不同的数据集大小、文本类型和难度等级;一个诊断数据集,用于评估和分析模型在处理自然语言中出现的各种语言现象方面的性能;以及一个公共排行榜,用于跟踪基准测试的性能,并提供仪表板可视化模型在诊断集上的性能。GLUE 的最终目标是推动通用且强大的自然语言理解系统的研发。
decaNLP 是 Natural Language Decathlon 的缩写,它是一个新的基准测试,用于研究能够执行多种复杂自然语言任务的通用 NLP 模型。通过要求单个系统执行十个不同的自然语言任务,decaNLP 为多任务、迁移和持续学习提供了一个独特的环境1。decaNLP 涵盖了十项任务:问答、机器翻译、摘要、自然语言推理、情感分析、语义角色标注、零样本关系抽取、面向目标的对话、语义解析和常识代词解析。
GLUE 和 decaNLP 都是用于评估自然语言处理模型的基准测试。它们都要求模型能够执行多种不同的自然语言任务。GLUE 的目标是推动通用且强大的自然语言理解系统的研发,它包括九个句子或句子对语言理解任务,旨在涵盖不同的数据集大小、文本类型和难度等级。而 decaNLP 是一个新的基准测试,它涵盖了十项任务:问答、机器翻译、摘要、自然语言推理、情感分析、语义角色标注、零样本关系抽取、面向目标的对话、语义解析和常识代词解析。总之,GLUE 和 decaNLP 都旨在通过多任务学习来推动自然语言处理模型的发展,但它们所包含的任务和目标略有不同。
Bryan McCann 是一位研究人员,他在自然语言处理领域作出了许多贡献。他参与了多项研究,包括 decaNLP和 SimpleTOD。decaNLP 是一个新的基准测试,它涵盖了十项任务:问答、机器翻译、摘要、自然语言推理、情感分析、语义角色标注、零样本关系抽取、面向目标的对话、语义解析和常识代词解析。它旨在通过多任务学习来推动自然语言处理模型的发展。SimpleTOD 是一个简单的面向任务的对话方法,它使用单个因果语言模型来训练所有子任务,将其重新定义为单个序列预测问题。这使 SimpleTOD 能够充分利用从预训练的开放域因果语言模型(如 GPT-2)中进行迁移学习。
四、GPT-2工作原理
GPT-2是对基于Transformer架构的大型语言模型GPT-1的升级版本,它在大量文本数据上进行预训练,学习了语言的通用模式和结构,这使得GPT-2能够在多种NLP任务上实现良好的表现。
当给定一段文本输入时,GPT-2首先使用字节对编码(Byte Pair Encoding,BPE)方法将文本分割成子词单元。然后,它将每个子词单元映射到一个固定大小的向量,称为嵌入向量。
接下来,这些嵌入向量被输入到模型中,经过多层自注意力和前馈神经网络的处理。在每一层中,模型都会计算每个子词单元与其他子词单元之间的相关性,并根据这些相关性对输入进行加权求和。这使得模型能够捕捉文本中的长期依赖关系。
最后,模型会输出一个概率分布,表示下一个子词单元的预测结果。这个概率分布可以用来生成新的文本,或者用来执行其他NLP任务,如文本分类、摘要和翻译等。
具体来说,在文本生成过程中,模型会根据给定的上下文,逐个生成新的子词单元,直到生成完整的文本。当给定一段初始文本作为上下文时,GPT-2会计算下一个子词单元的概率分布。然后,根据这个概率分布选择一个子词单元作为生成的第一个子词。接下来,模型会将这个新生成的子词添加到上下文中,并再次计算下一个子词单元的概率分布。这个过程会不断重复,直到生成完整的文本。在选择下一个子词单元时,可以使用不同的策略。例如,可以选择概率最大的子词单元,也可以根据概率分布随机选择一个子词单元。此外,还可以使用一些更复杂的策略,如集束搜索和顶级采样等。
五、GPT-2的训练数据集。
GPT-2爬取了Reddit上所有的外部链接,每个链接的karma值至少要有3分。这可以作为一个内容评判指标,用于判断其他用户是否觉得链接内容有趣、有教育意义或仅仅是有趣。这份数据集被称之为WebText,其中包含了4500万条链接,所有用的结果都是用的WebText的初版数据,超过8百万个文档总共40G。GPT-2移除了维基百科的文档,因为WebText中会有一些重复的内容,并且如果训练数据与测试数据重叠过多,可能使分析变得复杂。
六、GPT-2输入表示
GPT-2使用了一种称为字节对编码(Byte Pair Encoding,BPE)的方法来表示输入文本。BPE是一种子词分割方法,它将文本分割成子词单元,而不是单个字符或单词。这种方法能够有效地处理大量未知单词和罕见单词。在使用BPE对文本进行编码后,GPT-2会将每个子词单元映射到一个固定大小的向量,称为嵌入向量。这些嵌入向量被输入到模型中,用于预测下一个子词单元或执行其他NLP任务。
BPE原理
BPE(Byte Pair Encoding)是一种用于数据压缩的算法,它也被用于自然语言处理中的子词划分。BPE 算法通过迭代地将出现频率最高的字节对合并为一个新的字节来压缩数据。在自然语言处理中,BPE 算法被用于将文本划分为子词单元。它通过迭代地将出现频率最高的字符对合并为一个新的子词来实现这一点。这样,模型就可以学习到更多的子词信息,从而更好地处理未见过的词汇。BPE 算法的优点在于它能够有效地处理大型词汇表,并且能够很好地处理未见过的词汇。但是,它也有一些局限性,例如可能会产生一些不合理的子词划分。
BPE 算法的原理例子。
假设我们有以下文本:
首先,我们将每个单词拆分为单个字符,并在每个单词的末尾添加一个特殊符号(例如“</w>”)来表示单词边界:
l o w </w> l o w e r </w> n e w e s t </w> w i d e s t </w>
然后,我们统计所有字符对出现的频率:
(l, o): 2
(o, w): 2
(w, </w>): 1
(w, e): 1
(e, r): 1
(r, </w>): 1
(n, e): 1
(e, w): 1
(e, s): 2
(s, t): 2
(t, </w>): 2
接下来,我们选择出现频率最高的字符对(在这个例子中是 (l,o) 和 (o,w)),并将它们合并为一个新的子词。新的文本变为:
lo w </w> lo wer </w> n e w e s t </w> w i d e s t </w>
然后,我们再次统计所有字符对出现的频率,并重复上述过程。最终,我们可以得到以下子词划分:
low </w> low er </w> newest </w> widest </w>
这就是 BPE 算法的基本原理。它通过迭代地合并出现频率最高的字符对来实现文本划分。
七、GPT-2对模型的改进
在 GPT-2 论文中,作者提到了一种对模型结构的改进。具体来说,他们将每个子块输入的层归一化(layer normalization)移除了,这类似于预激活的残差网络(pre-activation residual network)中的做法。然后,在最后的自注意力(self-attention)模块中添加了层归一化。采用修正的初始化方法,考虑了模型深度对当前层的影响,GPT-2在初始化权重时将剩余层的权值乘以 1/N‾‾√1/N ,其中N是残缺层的数量,词典被扩展到了50257,context的维度从512提高到了1024并且batchsize采用了512。
层归一化是一种常用的归一化技术,它可以帮助模型更快地收敛,并提高模型的性能。在 GPT-2 中,作者通过将层归一化从子块输入移动到自注意力模块中来改进模型结构。
预激活的残差网络是一种常用的深度学习模型结构,它通过在残差连接之前应用激活函数来改进传统的残差网络。在 GPT-2 中,作者通过类似于预激活残差网络中的做法来调整层归一化的位置,从而改进模型结构。
残差网络解释
残差网络(Residual Network,简称 ResNet)是一种深度学习模型,它通过引入残差连接(residual connection)来解决深度神经网络中的梯度消失和梯度爆炸问题。
在传统的深度神经网络中,随着网络层数的增加,梯度在反向传播过程中可能会变得非常小(梯度消失)或非常大(梯度爆炸),这会导致模型难以训练。残差网络通过在每个层之间添加残差连接来解决这个问题。残差连接可以直接将前面层的输出传递到后面的层,从而避免了梯度消失和梯度爆炸问题。
具体来说,残差网络中的每个残差块包括两个或更多的卷积层,以及一个残差连接。残差连接将输入直接传递到输出,然后与卷积层的输出相加。这样,模型就可以学习到输入和输出之间的残差映射,而不是直接学习输入到输出的映射。
残差网络在图像分类、目标检测和语义分割等领域都取得了很好的效果,并且被广泛应用于各种深度学习任务中。
梯度爆炸解释
梯度爆炸(Exploding Gradient)是深度神经网络训练中的一个问题,它指的是在反向传播过程中,梯度的值变得非常大,以至于模型参数的更新变得非常不稳定。
在深度神经网络中,每一层的梯度都是由后一层的梯度乘以当前层的权重矩阵计算得到的。如果权重矩阵的值很大,那么梯度就会在反向传播过程中不断增大,最终导致梯度爆炸。
梯度爆炸会导致模型难以训练,因为模型参数的更新会变得非常不稳定。为了解决这个问题,可以采取一些措施来防止梯度爆炸,例如梯度裁剪(Gradient Clipping)和权重正则化(Weight Regularization)等。
梯度裁剪是一种常用的防止梯度爆炸的方法,它通过设定一个阈值来限制梯度的最大值。如果梯度的值超过了阈值,那么就将其缩放到阈值以内。这样可以防止梯度变得过大,从而避免梯度爆炸问题。
权重正则化是另一种防止梯度爆炸的方法,它通过在损失函数中添加一个正则化项来限制权重矩阵的大小。这样可以防止权重矩阵变得过大,从而避免梯度爆炸问题。
GPT-2训练了4个模型,最小的模型规模和GPT是一样的,第二小的和最大的BERT规模一样,最大的模型叫做GPT-2,其具有比GPT多一个数量级的参数。每个模型的学习率在5%的WebText保留样本上手工调整以获得最佳的值。所有的模型目前在WebText上都还存在欠拟合的情况,如果给更多的时间去训练的话效果还能进一步的提升。

八、GPT-2的零样本任务
零样本学习是指模型能够在没有接触过的新任务上表现良好,而不需要额外的训练数据。GPT-2在这方面表现出色,能够在多种NLP任务上实现零样本学习。这得益于GPT-2的预训练过程,它在大量文本数据上进行预训练,学习了语言的通用模式和结构。这使得GPT-2能够在没有额外训练数据的情况下,直接应用于新任务。例如,GPT-2能够在零样本情况下执行文本分类、摘要、翻译和问答等任务。它能够根据上下文理解新任务的要求,并生成相应的输出。
GPT-2在WebText语言模型跨越了不同的领域与数据集,在零样本的情况下8个数据集测试情况中有7个取得了最好的结果,如果在WiliText-2这样的只有1、2百万训练数据的数据集上微调的话效果会有巨大的提升,对于有长期依赖关系的数据集也有很大的提升。但是GPT-2的模型在One Billion Word Benchmark上效果并不如之前做的好,可能是由于预训练阶段数据集太大,打乱了其long-range的结构。

九、GPT-2的泛化能力
泛化能力是指模型能够在新的、未见过的数据上表现良好的能力。GPT-2在这方面表现出色,能够在多种NLP任务上实现良好的泛化能力。
这得益于GPT-2的预训练过程,它在大量文本数据上进行预训练,学习了语言的通用模式和结构。这使得GPT-2能够在新的数据上应用所学到的知识,从而实现良好的泛化能力。
十、GPT-2的局限
尽管GPT-2在多种NLP任务上表现出色,但它仍然存在一些局限性。以下是一些GPT-2的局限性:
数据偏差:GPT-2是在大量文本数据上进行预训练的,这些数据可能包含偏差和不准确之处。因此,GPT-2生成的文本也可能存在偏差和不准确之处。
长期依赖问题:尽管GPT-2能够处理较长的文本序列,但它仍然可能难以捕捉长期依赖关系。这可能会影响它在某些任务上的表现。
计算成本:GPT-2是一个非常大的模型,具有大量的参数。这意味着它需要大量的计算资源来进行训练和推理。这可能会限制它在某些应用场景中的使用。
不确定性:由于GPT-2是一个生成模型,它生成的文本可能存在不确定性。这意味着它生成的文本可能会有多种解释,有时可能难以理解。
十一、总结
GPT-2相对于GPT-1,将数据量和参数都扩大了10倍,从中可以看到,数据量够大和参数较多的情况下模型的效果是有一定的提升的,这也为今后的语言模型指明了一条可行的道路。另外,GPT-2把多任务学习和非监督学习联系起来,并且实现了语言模型能在没有训练样本(没有任何参数和结构的修改)的情况下执行一些下游任务,并且在零样本的情况下泛化性能更强,在一些任务上也取得了业界最佳的效果。

