GPT
- 前言
- 一、GPT模型
- 1.1 为什么采用Decoder模块?
- 1.2 为什么不使用Encoder模块?
- 二、 模型训练
- 2.1 预训练阶段
- 2.2 半监督微调
- 总结
前言
在之前的章节中,深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进行预训练,ELMo模型成功地为预训练模型时代的开启奠定了基础。继ELMo之后,OpenAI基于transformer架构发布了GPT(Generative Pre-training Transformer)模型,该模型同样采用预训练策略,进一步推动了自然语言处理领域的语言模型发展。在本章节,以GPT模型为起点,初步的学习ChatGPT等基于对话的AI模型背后的原理与技术演化。这将为读者深入理解当前模型在理解和生成自然语言方面的先进能力提供重要视角。鉴于Bert模型也是在GPT之后推出,为了保持学习的连贯性和理论发展的时间线顺序,本章节将优先探讨GPT模型。
一、GPT模型
按照惯例,首先对GPT下一个直白的定义。
GPT(Generative Pre-training Transformer)是由移除了交叉注意力(cross-attention)层的多层Transformer decoder构成的。
下图通过Transformer的整体架构图直观的展示GPT具体采用的区域,图中红色矩形表示GPT具体采用的部分,为Transformer decoder模块并且删除了模型了cross-attention层。
1.1 为什么采用Decoder模块?
要理解为何GPT采用decoder结构,首先需要了解其在预训练阶段的核心任务。GPT在本质上执行的是一个序列生成任务,类似于经典的文本接龙游戏(或称为语言模型预测任务),其目标是基于给定文本序列之前的部分,预测接下来可能出现的文本内容。换而言之,这个任务要求模型使用已知的输入信息(即前文),来预测当前可能出现的单词,这与循环神经网络(RNN)处理序列数据的方式相似。当前例子参考Lee老师针对GPT的讲解。
使用transformer架构decoder的作用是可以实现模型的并行化处理(主要是Transformer优于RNN的原因),这得益于自注意力机制的能力,从而不在像传统的RNN一样,并能更好地捕捉复杂的模式和依赖关系。这样的设计使得 GPT 不仅能模仿 RNN 文本生成的自回归特性,还能摆脱RNN在处理长序列时可能遇到的梯度消失等问题,从而在自然语言生成任务中实现更佳的性能。对这部分有疑问的同学可以参考当前专栏Transformer部分的内容
1.2 为什么不使用Encoder模块?
上文中讨论了预训练阶段的核心任务。GPT在本质上执行的是一个序列生成任务,自注意力带来的并行化优势选择了Transformer架构。因此采用了Decoder结构,那为什么不使用Encoder呢?
关键在于生成任务所需的Masked机制。正如上图所展示的,一个没有交叉注意力层的Decoder与Encoder的主要区别在于Masked机制。如果在生成任务中不应用Masked机制,模型就将直接“窥视”到正确答案,这显然违背了序列生成所需的自回归性质。因此,GPT设计中采纳了Decoder结构。本身模型不具备Encoder部分所以也不存在需要编码器指导输出,故此摒弃掉cross-attention层。
这样的设计选择体现了模型结构与任务目标的紧密配合,确保了模型能够有效且高效地处理序列生成任务,为其在各类自然语言处理应用中的成功奠定了基础。
二、 模型训练
在ELMo模型中,双向LSTM的参数在预训练阶段被学习并固定下来。当ELMo被用于下游任务(如文本分类、问答系统等)的fine-tuning阶段时,双向LSTM生成的上下文依赖表示(即深层语言特征)是不变的。变化的是对这些深层特征的使用方式,即通过调整特定于任务的缩放参数(S参数)和全局调整参数(gamma)来优化ELMo嵌入对于特定任务的表现。具体有疑问的同学可以参考当前专栏ELMo的文章
简而言之,在ELMo模型的应用过程中,双向LSTM的参数保持不变,变化的是如何利用ELMo生成的上下文特征来最佳地适应特定下游任务的需求。和ELMo类似,GPT(Generative Pretraining Transformer)模型也包含了两个主要阶段:预训练(pretraining)阶段和微调(fine-tuning)阶段。
2.1 预训练阶段
在这个阶段,它通过Transformer中修改的Decodr模块和自回归语言建模目标进行训练,以此捕捉文本中的长期依赖性和复杂的语言模式。这个阶段不专注于任何特定的下游任务,而是旨在学习一个通用的语言模型。
GPT模型利用了庞大的未标注文本数据集,包括维基百科和各种网页内容。此阶段的训练目标是通过调整模型参数来最大化数据集上的对数似然(log-likelihood)。从下图中原论文中对预训练阶段的描述可以看出,模型的结构在这一阶段保持相对简化,主要通过滑动窗口方法来构建语言模型,这与连续词袋模型(CBOW)有相似之处。目的是通过最小化损失函数,引导模型逐步迭代更新参数,以精炼其内部表示,从而更好地预测文本中单词的上下文关系。
下图中,通过观察论文中的细节可以看到模型的具体架构,就是一个多层堆叠的没有交叉注意力的Decoder:
尽管模型的调整似乎较为微小,但存在一个细节尤其值得关注:模型放弃了Transformer架构中对位置编码的常规处理方式,转而采用了一种可学习的参数矩阵 w p w_p wp 来处理位置信息。与此同时, W e W_e We 作为嵌入矩阵,其实质与Transformer架构中的处理方式并没有显著差异。这个矩阵可以是通过word2vec、GloVe或其他预训练模型生成的,用于将单词从稀疏的One-hot编码转换为密集的向量表示形式。以赋予模型一个良好的起点和对词汇之间语义相似性的基础理解,但是在后续的训练过程中,这个矩阵往往会随着损失函数的反向传播而被适当地调整。
2.2 半监督微调
在这个阶段,GPT对特定的下游任务进行微调。通常,模型会继承预训练阶段学到的参数,然后在目标任务的数据集上进行进一步训练。在微调阶段,可以对整个模型进行调整,或者只调整特定的层。此时,模型的目标是最大限度地提高在特定任务上的性能。论文中直观的给出了一个和微调相关的例子:
假设有一个标注数据集 C C C ,其中每个实例由一系列输入令牌 x 1 , . . . , x m x_1,...,x_m x1,...,xm 以及一个标签 y y y 组成。输入通过我们预训练的模型传递,以获得最终的Transformer块的激活 h m l h_m^l hml,然后这个激活被送入一个新增的线性输出层(带有参数 W y W_y Wy)来预测 y y y:
P ( y ∣ x 1 , . . . , x m ) = softmax ( h m l W y ) . P(y|x_1,...,x_m) = \text{softmax}(h_m^l W_y). P(y∣x1,...,xm)=softmax(hmlWy).
以下要最大化的目标:
L 2 ( C ) = ∑ ( x , y ) log P ( y ∣ x 1 , . . . , x m ) . L_2(C) = \sum_{(x,y)}\log P(y|x_1,...,x_m). L2(C)=(x,y)∑logP(y∣x1,...,xm).
上文的例子揭示了在微调阶段,GPT模型会利用带有标签的数据集 ( x , y ) (x, y) (x,y) 进行训练,并通过引入一个新的可学习的权重矩阵 W y W_y Wy 来适配具体的任务需求。这一做法表明,在面对不同任务时,GPT模型能够灵活地加入特定任务相关的可学习参数,以便对模型进行针对性的微调。通过这种方式,GPT不仅能够保留在大规模无标注数据上预训练所学到的通用语言表示能力,还能够通过额外参数的引入与调整,有效地适应并优化特定的下游任务表现。这种策略大大增强了GPT等预训练模型在多种自然语言处理任务中的应用灵活性和效果。
会不会出现模型为了当前任务的准确性而去修改动经过大量无监督训练得到的学习语意内容的参数呢?这样会不会影响模型的语义理解能力?GPT给出解决方式如下
微调阶段确实采用了两部分损失函数来进行模型参数的优化,具体目标如下(带有权重 λ \lambda λ):
L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_3(C) = L_2(C) + \lambda \ast L_1(C) L3(C)=L2(C)+λ∗L1(C)
采用两个损失函数的目的,正是为了在使用有标签数据进行微调时,仍然能够保持与在无标签数据上训练时相同的模型架构。这种设计使模型在接受通过梯度下降法进行参数更新的同时,也面临着一个挑战——如何在适应新任务的需求中,不丢失先前在广泛语境下学到的语义信息。
具体而言,第一个损失 L 1 ( C ) L_1(C) L1(C)关注于维持模型对大量无标签文本数据的理解,即保留在预训练阶段获得的语义知识;而第二个损失 L 2 ( C ) L_2(C) L2(C)则针对模型在有标签数据集上的表现,旨在提升模型对特定任务的适应性和准确度。通过将这两个损失组合为一个总体目标 L 3 ( C ) L_3(C) L3(C),模型被引导在学习新任务的同时,也不过度偏离其原有的语言模型基础。
这种权衡策略,旨在防止模型过度拟合新任务而损失其通用的语义理解能力。 通过在自由接龙和目标任务之间建立平衡,确保了模型不仅能够高效地适应新任务,同时也维护了其作为一个强大通用语言模型的核心价值。这种做法体现了对模型灵活性和泛化能力的重视,同时也展示了如何通过精心设计的训练策略来优化模型性能。
论文中展示了四种针对微调任务的监督学习方式,旨在尽量减少对模型整体架构的修改以完成各项任务。如上图所示,左侧是我们提到的多层堆叠的解码器部分,该模型架构保持不变。而右侧则根据不同任务的需求,简单地添加了略有不同形式的线性层,这种设计使模型能够灵活适应多种任务,同时保持核心架构的稳定性。
总结
尽管论文的篇幅并不庞大,但GPT模型所带来的显著性能提升无疑充分体现了"大力出奇迹"的理念。目前的GPT已经在能力上取得了巨大的飞跃,现代大模型时代不仅验证了Transformer架构的卓越性能,也预示着一个更加关注参数规模的时代正式到来。随着越来越多技术细节的隐藏,可见技术上的突破越来愈多,对计算资源的依赖与日俱增,一定程度上表明强大算力在推动自然语言处理进步中重要地位。后续将会迎来本专栏的收尾工作总结Bert模型,期望能够使读者对这部分的内容有一个深层的认识,从而更好的开展科研工作。