2.3_基于Encoder-only架构的大语言模型

2.3 基于 Encoder-only 架构的大语言模型

Encoder-only架构凭借着其独特的双向编码模型在自然语言处理任务中表现出色,尤其是在各类需要深入理解输入文本的任务中。本章将对双向编码模型以及几种较为典型的Encoder-only架构模型进行介绍。

2.3.1 Encoder-only 架构

Encoder-only 架构的核心在于能够覆盖输入所有内容的双向编码模型(Bidirectional Encoder Model)。在处理输入序列时,双向编码模型融合了从左往右的正向注意力以及从右往左的反向注意力,能够充分捕捉每个 Token 的上下文信息,因此也被称为具有全面的注意力机制。得益于其上下文感知能力和动态表示的优势,双向编码器显著提升了自然语言处理任务的性能。

不同于先前常用的Word2Vec和GloVe此类,为每个词提供一个固定向量表示的静态编码方式,双向编码器为每个词生成动态的上下文嵌入(Contextual Embedding),这种嵌入依赖于输入序列的具体上下文,使得模型能够更加精准地理解词与词之间的依赖性和语义信息,有效处理词语的多义性问题。这种动态表示使得双向编码器在句子级别的任务上表现出色,显著超过了静态词嵌入方法的性能[20]。

Encoder-only 架构基于双向编码模型,选用了 Transformer 架构中的编码器部分。虽然 Encoder-only 模型不直接生成文本,但其生成的上下文嵌入对于深入理

解输入文本的结构和含义至关重要。这些模型在需要深度理解和复杂推理的自然语言处理任务中展现出卓越的能力,成为了自然语言处理领域的宝贵工具。当前,BERT[11]及其变体,如RoBERTa[23]、ALBERT[17]等,都是基于Encoder-only架构的主流大语言模型。接下来将对这些模型进行介绍。

2.3.2 BERT语言模型

BERT(Bidirectional Encoder Representations from Transformers)是一种基于Encoder-only架构的预训练语言模型,由Google AI团队于2018年10月提出。作为早期Encoder-only架构的代表,BERT在自然语言处理领域带来了突破性的改进。其核心创新在于通过双向编码模型深入挖掘文本的上下文信息,从而为各种下游任务提供优秀的上下文嵌入。本节将对BERT模型的结构、预训练方式以及下游任务进行介绍。

1. BERT模型结构

BERT模型的结构与Transformer中的编码器几乎一致,都是由多个编码模块堆叠而成,每个编码模块包含一个多头自注意力模块和一个全连接前馈模块。根据参数量的不同,BERT模型共有BERT-Base和BERT-Large两个版本。其中BERT-Base由12个编码模块堆叠而成,隐藏层维度为768,自注意力头的数量为12,总参数数量为1.1亿;BERT-Large由24个编码模块堆叠而成,隐藏层维度为1024,自注意力头的数量为16,总参数数量约为3.4亿。

2. BERT预训练方式

BERT使用小说数据集BookCorpus[46](包含约8亿个Token)和英语维基百科数据集6(包含约25亿个Token)进行预训练,总计约33亿个Token,总数据量达到了15GB左右。在预训练任务上,BERT开创性地提出了掩码语言建模(Masked

Language Model, MLM)和下文预测(Next Sentence Prediction, NSP)两种任务来学习生成上下文嵌入。其完整的预训练流程如图2.7所示。


图2.7:BERT预训练任务。

具体而言,BERT先基于给定的原始文本构造多个样本序列,每个样本序列由原始文本中的两个句子组成,这两个句子有 50%50\% 的概率是来自原文的连续句子,另外 50%50\% 的概率是随机挑选的两个句子。随后,对构造出来的样本序列进行分词,并在序列的开头添加特殊标签[CLS],在每个句子的结尾添加特殊标签[SEP]。其中[CLS]标签用于聚合整个序列的信息,而[SEP]标签则明确句子之间的界限。

接着,BERT利用处理后的序列进行下文预测任务,利用模型判断样本序列中的两个句子是否为连续的。这一任务训练BERT识别和理解句子之间的关系,捕捉句子层面的语义特征。这对于理解文本的逻辑流、句子之间的关联性有很大帮助,特别是在问答和自然语言推理等需要理解文档层次结构的自然语言处理(NLP)任务中。

最后,BERT随机选择样本序列中大约 15%15\% 的Token进行遮掩,将其替换为特殊标签[MASK]或者随机单词。模型需要预测这些被替换的Token的原始内容。这

个过程类似于完型填空,要求模型根据周围的上下文信息来推断缺失的 Token。预测过程使用的交叉熵损失函数驱动了 BERT 模型中参数的优化,使其能够学习到文本的双向上下文表示。值得注意的是,在 MLM 任务的训练过程中,BERT 仅针对那些被随机替换的 Token 进行学习,即只计算这些 Token 的预测损失来更新模型参数。

通过这两种预训练任务的结合,使BERT在理解语言的深度和广度上都有显著提升。BERT不仅能够捕捉到Token的细粒度特征,还能够把握长距离的依赖关系和句子间的复杂联系,为各种下游任务提供了坚实的语言理解基础。

3. BERT下游任务

BERT可以应用于各种自然语言处理任务,包括但不限于文本分类(如情感分析)、问答系统、文本匹配(如自然语言推断)和语义相似度计算等。然而,由于BERT的输出是输入中所有Token的向量表示,因此总长度不固定,无法直接应用于各类下游任务。为了解决这一问题,BERT设计了[CLS]标签来提取整个输入序列的聚合表示。[CLS]标签是专门为分类和汇总任务设计的特殊标记。其全称是“Classification Token”,即分类标记。通过注意力机制,[CLS]标签汇总整个输入序列的信息,生成一个固定长度的向量表示,从而实现对所有Token序列信息的概括,便于处理各种下游任务。

在文本分类任务中,可以将输出中 [CLS] 标签对应的向量提取出来,传递给一个全连接层,从而用于分类,例如判断整个句子的情绪是积极、消极或是中立的。在问答系统任务中,需要输入问题以及一段相关的文本,即“[CLS] 问题 [SEP] 文本 [SEP]”。最终同样提取出 [CLS] 标签的对应向量,并传递给两个全连接层,用于判断答案是否存在于相关文本中。如果存在,这两个全连接层分别用于输出答案的起始和结束位置。通过这种方式,BERT 能够从提供的段落中准确提取出问题的答案。在语义相似度任务中,需要计算两段或者多段文本之间的语义相似度。在

这一任务中,可以通过构造“[CLS] 文本 1 [SEP] 文本 2 [SEP]”的方式,结合一个线性层来直接输出两个文本之间的相似度;也可以不添加额外的组件,直接提取[CLS]标签对应的向量,再利用额外的相似度度量方法(例如余弦相似度)来计算多段文本之间的相似度。

BERT通过双向编码以及特定的预训练任务,显著提升了自然语言处理任务的性能。其在多种任务中的应用都展示了强大的泛化能力和实用性,不仅为学术研究提供了新的基准,还在实际应用中得到广泛采用,极大推动了自然语言处理技术的发展。

2.3.3 BERT衍生语言模型

BERT的突破性成功还催生了一系列相关衍生模型,这些模型继承了BERT双向编码的核心特性,并在其基础上进行了改进和优化,以提高模型性能或者模型效率,在特定任务和应用场景中展现出了卓越的性能。较为代表性的衍生模型为RoBERTa[23]、ALBERT[17]以及ELECTRA[9]等,接下来将对这三种模型分别展开介绍。

1. RoBERTa 语言模型

RoBERTa(Robustly Optimized BERT Pretraining Approach)由Facebook AI(现更名Meta)研究院于2019年7月提出,旨在解决BERT在训练程度上不充分这一问题,以提升预训练语言模型的性能。RoBERTa在BERT的基础上采用了更大的数据集(包括更多的英文书籍、维基百科和其他网页数据)、更长的训练时间(包括更大的批次大小和更多的训练步数)以及更细致的超参数调整(包括学习率、训练步数等的设置)来优化预训练的过程,从而提高模型在各种自然语言处理任务上的性能和鲁棒性。接下来将对RoBERTa模型的结构、预训练方式以及下游任务进行介绍。

(1) RoBERTa 模型结构

RoBERTa在结构上与BERT基本一致,基于多层堆叠的编码模块,每个编码模块包含多头自注意力模块和全连接前馈模块。RoBERTa同样有两个版本,分别是RoBERTa-Base和RoBERTa-Large。其中RoBERTa-Base与BERT-Base对标,由12个编码模块堆叠而成,其中隐藏层维度为768,自注意力头的数量为12,总参数数量约为1.2亿;RoBERTa-Large则与BERT-Large对标,由24个编码模块堆叠而成,其中隐藏层维度为1024,自注意力头的数量为16,总参数数量约为3.5亿。

(2) RoBERTa 预训练方式

在预训练语料库的选择上,RoBERTa 在 BERT 原有的小说数据集 BookCorpus[46](包含约 8 亿个 Token)以及英语维基百科数据集7(包含约 25 亿个 Token)的基础上,添加了新闻数据集 CC-News8(包含约 76GB 的新闻文章)、网页开放数据集 OpenWebText9(包含约 38GB 的网页文本内容)以及故事数据集 Stories[41](包含约 31GB 的故事文本),总数据量达到约 160GB。

至于具体的预训练任务,RoBERTa移除了BERT中的下文预测任务,并将BERT原生的静态掩码语言建模任务更改为动态掩码语言建模。具体而言,BERT在数据预处理期间对句子进行掩码,随后在每个训练epoch中,掩码位置不再变化。而RoBERTa则将训练数据复制成10个副本,分别进行掩码。在同样训练40个epoch的前提下,BERT在其静态掩码后的文本上训练了40次,而RoBERTa将10个不同掩码后的副本分别训练了4次,从而增加模型训练的多样性,有助于模型学习到更丰富的上下文信息。

这些改进使得RoBERTa在理解上下文和处理长文本方面表现出色,尤其是在捕捉细微的语义差异和上下文依赖性方面。

2. ALBERT 语言模型

ALBERT(A Lite BERT)是由 Google Research 团队于 2019 年 9 月提出的轻量级 BERT 模型,旨在通过参数共享和嵌入分解技术来减少模型的参数量和内存占用,从而提高训练和推理效率。BERT-Base 模型有着 1.1 亿个参数,而 BERT-Large 更是有着 3.4 亿个参数,这使得 BERT 不仅难以训练,推理时间也较长。ALBERT 在设计过程通过参数因子分解技术和跨层参数共享技术显著减少了参数的数量。接下来将对 ALBERT 模型的结构、预训练方式以及下游任务进行介绍。

(1) ALBERT 模型结构

ALBERT的结构与BERT以及RoBERTa都类似,由多层堆叠的编码模块组成。但是ALBERT通过参数因子分解以及跨层参数共享,在相同的模型架构下,显著减少了模型的参数量。下面将参数因子分解和跨层参数共享分别展开介绍。

参数因子分解

在BERT中,Embedding层的输出向量维度 EE 与隐藏层的向量维度 HH 是一致的,这意味着Embedding层的输出直接用作后续编码模块的输入。具体来说,BERT-Base模型对应的词表大小 VV 为3,0000左右,并且其隐藏层的向量维度 HH 设置为768。因此,BERT的Embedding层需要的参数数量是 V×HV \times H ,大约为2,304万。

相比之下,ALBERT将Embedding层的矩阵先进行分解,将词表对应的独热编码向量通过一个低维的投影层下投影至维度 EE ,再将其上投影回隐藏状态的维度 HH 。具体来说,ALBERT选择了一个较小的Embedding层维度,例如128,并将参数数量拆解为 V×E+E×HV\times E + E\times H 。按照这个设计,ALBERT的Embedding层大约需要394万个参数,大约是BERT参数数量的六分之一。对于具有更大隐藏层向量维度 HH 的Large版本,ALBERT节省参数空间的优势更加明显,能够将参数量压缩至BERT的八分之一左右。

跨层参数共享

以经典的BERT-Base模型为例,模型中共有12层相同架构的编码模块,所有Transformer块的参数都是独立训练的。ALBERT为了降低模型的参数量,提出了跨层参数共享机制,只学习第一层编码模块的参数,并将其直接共享给其他所有层。该机制在一定程度上牺牲了模型性能,但显著提升了参数存储空间的压缩比,从而实现了更高效的资源利用。

基于参数因子分解和跨层参数共享,ALBERT共提出了四个版本的模型,分别是ALBERT-Base、ALBERT-Large、ALBERT-XLarge以及ALBERT-XXLarge。其中ALBERT-Base与BERT-Base对标,由12个编码模块堆叠而成,中间嵌入分解维度为128,隐藏层维度为768,自注意力头的数量为12,总参数数量约为0.12亿;ALBERT Large与BERT-Large对标,由24个编码模块堆叠而成,中间嵌入分解维度为128,隐藏层维度为1024,自注意力头的数量为16,总参数数量约为0.18亿;ALBERT X-Large由12个编码模块堆叠而成,中间嵌入分解维度为128,隐藏层维度为2048,自注意力头的数量为16,总参数数量约为0.6亿;ALBERT XX-Large由12个编码模块堆叠而成,中间嵌入分解维度为128,隐藏层维度为4096,自注意力头的数量为64,总参数数量约为2.2亿。

(2) ALBERT 预训练方式

ALBERT 使用与 BERT 完全一致的数据集来进行预训练,即小说数据集 BookCorpus[46](包含约 8 亿个 Token)以及英语维基百科数据集10(包含约 25 亿个 Token),总计 33 亿个 Token,约 15GB 数据量。另外,在预训练任务的选择上,ALBERT 保留了 BERT 中的掩码语言建模任务,并将下文预测任务替换为句序预测(Sentence Order Prediction, SOP),如图2.8所示。具体而言,ALBERT 从文本中选择连续的两个句子,将这两个句子直接拼接起来,或是先将这两个句子的顺序


图2.8:ALBERT句序预测任务。

翻转后再进行拼接,并将拼接后的内容作为输入样本,而模型需要预测该样本中的两个句子是正序还是反序。

与BERT相比,ALBERT通过创新的参数共享和参数因子分解技术,在较好地保持原有性能的同时显著减少了模型的参数数量,这使得它在资源受限的环境中更加实用,处理大规模数据集和复杂任务时更高效,并降低了模型部署和维护的成本。

3. ELECTRA 语言模型

ELECTRA(Efficiently Learning an Encoder that Classifies Token Replacements Accurately)[9]是由Google Brain和斯坦福大学的研究人员于2020年3月提出的另一种BERT变体,旨在解决大规模预训练语言模型中的效率和可扩展性问题。通过使用生成器-判别器架构,ELECTRA能够更高效地利用预训练数据,提高了模型在下游任务中的表现。

(1) ELECTRA 预训练方式

在模型结构上,ELECTRA 在 BERT 原有的掩码语言建模基础上结合了生成对抗网络(Generative Adversarial Network, GAN)的思想,采用了一种生成器-判别器结构。具体来说,ELECTRA 模型包含一个生成器和一个判别器,其中生成器(Generator)是一个能进行掩码预测的模型(例如 BERT 模型),负责将掩码后的文本恢复原状。而判别器(Discriminator)则使用替换词检测(Replaced Token Detection, RTD)预训练任务,负责检测生成器输出的内容中的每个 Token 是否是原文中的内容。其完整的流程如图2.9所示。


图2.9:ELECTRA预训练任务。

(2) ELECTRA 模型结构

根据生成器与判别器的不同规模,ELECTRA共提出了三个版本的模型,分别是ELECTRA-Small、ELECTRA-Base以及ELECTRA-Large。其中ELECTRA-Small中的生成器与判别器都由12个编码模块堆叠而成,隐藏层维度为256,自注意力头数量为4,因此生成器与判别器的参数量均为0.14亿左右,总参数数量约为0.28亿;ELECTRA-Base中的生成器与判别器都由12个编码模块堆叠而成,隐藏层维度为768,自注意力头数量为12,因此生成器与判别器的参数量均为1.1亿左右,总参数数量约为2.2亿;ELECTRA-Large中的生成器与判别器都由24个编码模块堆叠而成,隐藏层维度为1024,自注意力头数量为16,因此生成器与判别器的参数量均为3.3亿左右,总参数数量约为6.6亿。

其中,ELECTRA-Small 和 ELECTRA-Base 使用与 BERT 一致的数据集来进行预训练,共包含 33 亿个 Token。而 ELECTRA-Large 则使用了更多样化的训练数据,包括大规模网页数据集 ClueWeb11、CommonCrawl12以及大型新闻文本数据集

Gigaword 13^{13} , 最终将数据量扩充到了 330 亿个 Token, 从而帮助模型学习更广泛的语言表示。

另外,在BERT中,只有 15%15\% 的固定比例Token被掩码,模型训练的内容也仅限于这 15%15\% 的Token。但是在ELECTRA中,判别器会判断生成器输出的所有Token是否被替换过,因此能够更好地学习文本的上下文嵌入。

不同于 RoBERTa 和 ALBERT 主要在模型结构以及预训练数据规模上进行优化,ELECTRA 在 BERT 的基础上引入了新的生成器-判别器架构,通过替换语言模型任务,显著提升了训练效率和效果,同时提高了模型在下游任务中的表现。

上述基于Encoder-only架构的大语言模型在文本分类、情感分析等多个自然语言处理任务中取得了良好效果。表2.1从模型参数量及预训练语料等方面对上述模型进行总结。可以看出这些经典模型参数大小止步于6.6亿,预训练任务也主要服务于自然语言理解。这些模型没有继续寻求参数量上的突破,并且通常只专注于判别任务,难以应对生成式任务,因此在当前愈发热门的生成式人工智能领域中可以发挥的作用相对有限。

表 2.1: Encoder-only 架构代表模型参数和语料大小表。