BERT(NLP模型)

246 阅读15分钟

BERT(Bidirectional Encoder Representations from Transformers)自 2018 年由谷歌提出以来,便在自然语言处理(NLP)领域掀起了一场革命。它凭借独特的架构与训练方式,成为了众多 NLP 任务的首选模型,深刻改变了我们理解和应用语言的方式。

BERT基于transformer encoder部分,包含词嵌入,多层编码器,以及特定任务的输出层

一、BERT 重要意义

(一)突破传统语言模型局限 在 BERT 出现之前,语言模型大多基于单向的序列处理方式,如循环神经网络(RNN)及其变体长短期记忆网络(LSTM)和门控循环单元(GRU),它们只能从前向后或从后向前理解文本,无法同时捕捉单词的左右上下文信息。而 BERT 采用双向 Transformer 架构,能够同时考虑句子中每个单词的前后文,极大地丰富了语义理解的深度和广度。例如,在理解“银行”一词时,单向模型可能因缺乏完整上下文而将其误解为金融机构,而 BERT 可根据前后文判断其指代的是河岸还是金融机构,从而更精准地把握语义。

(二)预训练与微调范式的创新 BERT 开创了“预训练 + 微调”的新范式,为 NLP 任务的高效解决提供了通用框架。它先在海量无监督文本数据上进行预训练,学习通用的语言知识和语义模式,然后针对具体任务进行微调,只需少量标注数据即可实现任务特定的优化。这种范式大大减少了对大规模标注数据的依赖,降低了任务开发成本,同时提升了模型在不同任务上的泛化能力。以情感分析为例,以往需要大量标注的情感文本进行训练,现在只需在预训练好的 BERT 模型基础上微调,即可快速构建高精度的情感分析模型。

(三)推动 NLP 领域的快速发展 BERT 的出现为 NLP 领域带来了质的飞跃,它在多项基准测试中取得了前所未有的成绩,如在 GLUE(General Language Understanding Evaluation)基准测试中刷新了多项任务的最高分,几乎在所有任务上都超越了以往的最佳模型。其成功激发了学术界和工业界对预训练语言模型的深入研究和广泛应用,促使更多基于 BERT 的变体和改进模型不断涌现,如 RoBERTa、ALBERT 等,进一步推动了 NLP 技术的创新和发展,使机器对语言的理解和生成能力迈向了新的高度。

二、BERT 的整体架构

BERT 采用了 Transformer 的编码器部分,由多个 Transformer 块堆叠而成。每个 Transformer 块主要包含两个子层:多头注意力子层(Multi-Head Attention Sub - layer)和前馈神经网络子层(Feed - Forward Neural Network Sub - layer)。

在多头注意力子层中,输入被分成多个头,每个头分别计算注意力权重,然后将结果拼接起来。这种方式可以让模型从不同的角度捕捉输入序列中的语义信息,从而提高模型的表达能力。

前馈神经网络子层则对多头注意力子层的输出进行进一步的处理,它由两个全连接层组成,中间使用 ReLU 激活函数。这个子层主要负责对语义信息进行非线性变换,增强模型的学习能力。

通过多个 Transformer 块的堆叠,BERT 能够不断地对输入文本进行深度语义编码,从而学习到丰富的语义表示。

四、BERT两种预训练模型结构unsetunset

BERT 主要有两种预训练模型结构:BERT - BASE 和 BERT - LARGE。

(一)BERT-Base BERT - BASE 包含 12 个 Transformer 块,隐藏层维度为 768,注意力头数为 12,总参数数量约为 1.17 亿。这种结构在模型大小和性能之间取得了较好的平衡,适用于大多数场景,在计算资源有限的情况下也能够快速部署和应用。

(二)BERT-Large BERT-Large 是 BERT 的高级版本,具有 24 层编码器、16 个注意力头和 340M 参数。它在计算资源允许的情况下,能够学习更复杂的语义模式,从而在许多 NLP 任务上取得更高的性能。例如,在一些复杂的问答任务或文本分类任务中,BERT-Large 能够更好地捕捉文本中的细微语义差异,提供更准确的预测结果。不过,其庞大的规模也使得训练和推理过程更加耗时,对硬件设备的要求也更高。

五、BERT 的输入

5.1 Input

BERT 的输入是一个由单词或子词组成的序列,这些单词或子词首先被分词器(Tokenizer)转换为对应的 Token ID 序列。分词器会根据预训练模型的词汇表,将输入文本拆分为模型能够理解的基本单元。例如,对于英文文本,分词器会将单词拆分为子词,如“playing”会被拆分为“play”和“##ing”;对于中文文本,分词器会将句子拆分为单个汉字或常见的词组。此外,BERT 的输入还需要在序列的开头添加一个特殊的 Token(如 ),用于表示整个序列的分类信息;在句子之间添加分隔符 Token(如 ),用于区分不同的句子。

5.2 Token Embedding Token Embedding 是将 Token ID 映射为固定维度的向量表示的过程。BERT 使用预训练的词嵌入矩阵,将每个 Token ID 转换为对应的向量。这些向量包含了单词或子词的基本语义信息,是模型后续处理的基础。例如,单词“apple”和“orange”在 Token Embedding 中的向量表示会比较接近,因为它们在语义上有一定的相似性。Token Embedding 的维度通常是固定的,如 BERT-Base 的 Token Embedding 维度为 768,BERT-Large 的 Token Embedding 维度为 1024。

5.3 Segment Embedding Segment Embedding 用于区分输入序列中的不同句子。在处理句子对任务(如问答或句子关系判断)时,BERT 需要明确哪些 Token 属于第一句,哪些 Token 属于第二句。为此,BERT 为每个 Token 添加了一个 Segment Embedding,通常用一个二进制向量表示。例如,第一句中的所有 Token 的 Segment Embedding 为 [0],第二句中的所有 Token 的 Segment Embedding 为 [1]。通过这种方式,模型能够清楚地识别句子的边界,更好地理解句子之间的关系。

5.4 Position Embedding Position Embedding 用于表示 Token 在序列中的位置信息。尽管 Transformer 架构本身不依赖于序列的位置信息,但为了使模型能够更好地捕捉单词的顺序关系,BERT 引入了 Position Embedding。每个 Token 的 Position Embedding 是根据其在序列中的位置预先计算好的固定向量,与 Token Embedding 和 Segment Embedding 一起相加,形成最终的输入嵌入向量。例如,第一个 Token 的 Position Embedding 可能是 ,第二个 Token 的 Position Embedding 可能是,依此类推。通过这种方式,BERT 能够在处理文本时充分考虑单词的顺序,从而更好地理解句子的结构和语义。

六、BERT 的预训练

BERT 的强大性能离不开其有效的预训练策略。BERT 主要通过两个任务进行预训练:Masked LM 和 Next Sentence Prediction。

6.1 Masked LM Masked LM 是 BERT 预训练阶段的核心任务之一。在训练过程中,BERT 会随机选择输入序列中的部分 Token(通常为 15%),并将它们替换为特殊的 [MASK] Token。然后,模型的任务是根据上下文预测这些被掩盖的 Token 的原始值。例如,在句子 “The cat sat on the [MASK]” 中,BERT 需要预测 [MASK] 的位置应该是 “mat”。通过这种方式,BERT 能够学习到单词之间的语义关系和上下文信息,从而生成更准确的语义表示。Masked LM 的训练目标是使模型能够最大化预测正确 Token 的概率,这有助于模型在后续的微调阶段更好地理解文本的语义。

6.2 Next Sentence Prediction Next Sentence Prediction 是 BERT 预训练阶段的另一个重要任务。它的目的是训练模型判断两个句子是否是连续的文本。在训练时,BERT 会将两个句子拼接在一起,并在它们之间添加一个 [SEP] Token。然后,模型需要预测第二个句子是否是第一个句子的下一句。例如,对于句子对 “The cat sat on the mat.” 和 “It was very comfortable.”,模型需要判断这两句话是否是连续的文本。通过这种方式,BERT 能够学习到句子之间的逻辑关系和语义连贯性,从而在处理句子对任务(如问答或句子关系判断)时表现出色。Next Sentence Prediction 的训练目标是使模型能够最大化正确判断句子关系的概率,这有助于模型在后续的微调阶段更好地处理句子对任务。

6.3 前向传播示意图

在 BERT 的预训练过程中,输入序列首先经过 Token Embedding、Segment Embedding 和 Position Embedding 的组合,形成初始的输入嵌入向量。然后,这些向量通过多层 Transformer 编码器进行前向传播。每一层编码器都包含多头自注意力机制和前馈神经网络,用于提取和整合输入序列的语义信息。在最后一层编码器的输出基础上,BERT 分别进行 Masked LM 和 Next Sentence Prediction 任务的预测。Masked LM 任务通过一个分类层预测被掩盖 Token 的原始值,Next Sentence Prediction 任务通过一个二分类层判断两个句子是否是连续的文本。通过这种方式,BERT 在预训练阶段能够同时学习到单词级别的语义关系和句子级别的逻辑关系,从而为后续的微调阶段打下坚实的基础。

七、GPT、BERT 和 Transformer 的对比

(一)架构对比 Transformer:Transformer 是一种通用的序列建模架构,包含编码器(Encoder)和解码器(Decoder)两部分。编码器用于处理输入序列,生成上下文嵌入表示;解码器用于基于上下文表示生成输出序列。Transformer 的核心是自注意力机制(Self-Attention),能够捕捉序列中的长距离依赖关系。

BERT:BERT 是基于 Transformer 编码器的预训练语言模型,它仅使用 Transformer 的编码器部分,去掉了解码器。BERT 的双向架构使其能够同时考虑单词的左右上下文信息,从而生成更准确的语义表示。BERT 的主要特点是其预训练任务(Masked LM 和 Next Sentence Prediction)和微调策略,使其在语言理解任务中表现出色。

GPT:GPT(Generative Pre-trained Transformer)是基于 Transformer 解码器的预训练语言模型,它仅使用 Transformer 的解码器部分。GPT 采用单向自回归的方式,根据前面的上下文预测下一个单词,从而生成连贯的文本。GPT 的主要特点是其强大的文本生成能力,能够生成各种类型的文本,如新闻、故事、诗歌等。

(二)对标注数据的需求对比 Transformer:由于 Transformer 本身不进行预训练,而是直接应用于具体任务,因此对标注数据的需求量较大。例如,在机器翻译任务中,需要大量的双语平行语料来训练模型;在文本分类任务中,需要大量的标注文本及其对应的类别标签。这种对标注数据的高需求限制了 Transformer 在一些标注数据稀缺的任务中的应用。

BERT:BERT 采用预训练 + 微调的范式,预训练阶段使用大量的无监督文本数据,学习通用的语言知识和语义模式。在微调阶段,仅需要少量标注数据即可针对具体任务进行优化。例如,在情感分析任务中,预训练好的 BERT 模型可以在少量标注的评论文本上进行微调,快速达到较高的准确率。这种范式大大减少了对标注数据的依赖,使得 BERT 能够在许多标注数据稀缺的任务中表现出色。

GPT:GPT 也采用预训练 + 微调的范式,但其预训练任务主要是生成式任务,如文本生成。在微调阶段,GPT 可以用于生成式任务(如文本续写、故事生成等),也可以通过一些技巧用于理解式任务(如问答、文本分类等)。与 BERT 类似,GPT 在预训练阶段也需要大量的无监督文本数据,但在微调阶段对标注数据的需求相对较少,不过在理解式任务中,其性能可能不如经过专门微调的 BERT 模型。

(三)应用场景对比 Transformer:由于其强大的序列建模能力,Transformer 广泛应用于各种自然语言处理任务,如机器翻译、文本生成、文本分类、问答系统等。它能够捕捉序列中的长距离依赖关系,生成高质量的文本输出。例如,在机器翻译任务中,Transformer 的编码器 - 解码器架构能够将源语言文本编码为上下文表示,然后解码为目标语言文本,取得了显著的翻译效果提升。

BERT:BERT 在语言理解任务中表现出色,如文本分类、问答系统、命名实体识别等。其双向编码器架构能够充分利用上下文信息,生成准确的语义表示。例如,在问答任务中,BERT 可以根据问题和上下文文本,准确判断答案的位置,提供高质量的答案。此外,BERT 还可以用于一些文本生成任务,如文本续写,但生成效果可能不如专门的生成式模型。

GPT:GPT 在文本生成任务中具有显著优势,如文本续写、故事生成、新闻生成等。其单向自回归的解码器架构能够生成连贯、自然的文本,具有很强的生成能力。例如,给定一个开头句子,GPT 可以生成后续的文本内容,形成一个完整的故事或文章。此外,GPT 也可以通过微调用于一些语言理解任务,但在这些任务上通常不如 BERT 表现好。

(四)性能对比 Transformer:Transformer 的性能在很大程度上取决于其架构和训练数据的质量。在机器翻译任务中,Transformer 取得了显著的性能提升,BLEU 分数(一种衡量翻译质量的指标)大幅提高。然而,在语言理解任务中,由于其单向的编码器 - 解码器架构,可能无法充分利用上下文信息,导致性能不如双向编码器模型。

BERT:BERT 在多项语言理解任务中取得了优异的性能,如在 GLUE 基准测试中刷新了多项任务的最高分。其双向编码器架构能够充分利用上下文信息,生成准确的语义表示,从而在文本分类、问答系统、命名实体识别等任务上表现出色。然而,BERT 的性能也受到其预训练数据质量和微调策略的影响。例如,使用更大规模的预训练数据和更优化的微调参数,可以进一步提升 BERT 的性能。

GPT:GPT 在文本生成任务中表现出色,生成的文本连贯性高、自然流畅。其单向自回归的解码器架构能够根据前面的上下文生成下一个单词,从而生成高质量的文本。然而,在语言理解任务中,GPT 的性能可能不如 BERT,因为其单向架构无法充分利用上下文信息。不过,通过一些改进和微调策略,GPT 也可以在一些理解式任务中取得较好的效果。

(五)模型大小与计算资源对比 Transformer:Transformer 的模型大小和计算资源需求取决于其架构和层数。例如,一个标准的 Transformer 模型可能包含 6 层编码器和 6 层解码器,每层有 8 个注意力头,模型参数量约为 1.5 亿。训练和推理过程中需要大量的计算资源,尤其是在处理长文本序列时,计算复杂度较高。不过,通过一些优化技术,如稀疏注意力机制、模型压缩等,可以降低 Transformer 的计算资源需求。

BERT:BERT 的模型大小和计算资源需求也取决于其架构和层数。BERT-Base 包含 12 层编码器、12 个注意力头,参数量约为 1.1 亿;BERT-Large 包含 24 层编码器、16 个注意力头,参数量约为 3.4 亿。BERT 的预训练过程需要大量的计算资源,通常需要使用多台高性能 GPU 或 TPU。在微调阶段,虽然计算资源需求相对较低,但仍然需要一定的硬件支持。此外,BERT 的模型大小较大,推理速度相对较慢,尤其是在处理长文本序列时。

GPT:GPT 的模型大小和计算资源需求也较大。例如,GPT-2 包含 48 层解码器、32 个注意力头,参数量约为 15 亿;GPT-3 的参数量更是达到了 1750 亿。GPT 的预训练过程需要海量的计算资源,通常需要使用大规模的分布式计算集群。在推理阶段,GPT 的计算复杂度较高,生成长文本的速度相对较慢。不过,GPT 的生成能力强大,能够在一定程度上弥补其计算资源需求高的缺点。

原文链接:blog.csdn.net/Z4400840/ar…

深度解析: blog.csdn.net/2401_853736…