BERT(Bidirectional Encoder Representations from Transformers)的诞生,是自然语言处理领域一座真正的分水岭。在它之前,模型如Word2Vec或GPT理解词语的方式,就像是在玩只能看到过去、无法预见未来的拼图。而BERT的双向编码机制,让它能够同时审视词语的左右上下文,从而捕捉到语言中微妙的全貌。自2018年由谷歌提出以来,它迅速成为无数NLP任务的基石,深刻影响了从搜索引擎到智能客服的方方面面。下面,我们将从架构的视角,一步步拆解这个强大的模型。

1. 核心思想:深度双向的上下文理解

BERT的设计哲学可以概括为 “完形填空”式的学习

在它之前,许多模型(如早期的GPT)是单向的,只能从左到右或从右到左阅读文本,这意味着一个词的理解只能依赖它前面的词。而BERT通过其核心的预训练任务——掩码语言模型(Masked Language Model, MLM),实现了真正的双向理解。

这个任务很简单:在训练时,随机遮蔽(mask)输入句子中15%的词,然后让模型根据没有被遮蔽的、左右两侧的所有上下文,来预测被遮蔽的词是什么。这迫使模型必须融合整个句子的信息来做出判断。为了确保预训练和后续微调任务的一致性,这15%的被选中词并非全部用特殊的 [MASK] 标记替换,而是采用了以下策略:

  • 80% 的概率,替换为 [MASK] 标记。

  • 10% 的概率,替换为一个随机的其他词。

  • 10% 的概率,保持不变。

除了MLM,原始的BERT还引入了下一句预测(Next Sentence Prediction, NSP)任务,用于理解两个句子之间的关系。模型需要判断给定的句子B是否是句子A的下一句。不过,后续研究(如RoBERTa)发现NSP并非总是必要,有时移除它反而能提升性能。

2. 模型架构:Transformer编码器的堆叠

BERT的骨架是 Transformer的编码器(Encoder) 部分。它抛弃了传统的循环或卷积神经网络,完全依赖自注意力机制来捕捉词语间的依赖关系。

Google官方发布了两个主要版本,以适应不同的计算资源和性能需求:

  • BERT-Base:由 12层 Transformer编码器堆叠而成,隐藏层维度为 768, 12个 注意力头,总参数量约 1.1亿

  • BERT-Large:一个更深更宽的版本,由 24层 Transformer编码器堆叠,隐藏层维度为 1024, 16个 注意力头,总参数量高达 3.4亿

每一层Transformer编码器内部都包含两个核心子层:多头自注意力机制(Multi-Head Self-Attention) 让模型关注序列中不同位置的信息,而前馈神经网络(Feed-Forward Network)则对注意力机制的输出进行非线性变换。每个子层周围都使用了残差连接(Residual Connection)层归一化(Layer Normalization),以确保深层网络训练的稳定性。

3. 数据流动:精细的输入与输出表征

要让BERT理解文本,首先需要将文本转换成它能够处理的数字形式。BERT的输入表示是一个精巧的和,由三种嵌入向量逐元素相加而成。

  • 词嵌入(Token Embeddings):将每个词或子词(sub-word)映射到一个固定维度的向量。BERT使用 WordPiece 分词算法,它能有效地将单词拆分成更常见的子词单元,从而优雅地处理未登录词(OOV)问题。例如,"playing" 可能被拆分成 "play" 和 "##ing"。

  • 段嵌入(Segment Embeddings):用于区分输入中的不同句子。当输入是句子对(如问答中的问题和段落)时,属于第一个句子的token的段嵌入为0,第二个句子的为1。如果是单句输入,则所有token的段嵌入都为0。

  • 位置嵌入(Position Embeddings):由于自注意力机制本身无法感知词语的顺序,需要显式地加入位置信息。与原始Transformer使用固定的三角函数不同,BERT采用可学习的位置嵌入,让模型在训练中自己调整每个位置的表征。

此外,输入序列的开头和句子之间还会插入特殊的标记:

  • [CLS]:始终位于序列最开头。它对应的最终输出向量可以被视为整个序列的聚合表示,特别适合用于分类任务。

  • [SEP]:用于分隔不同的句子。

经过BERT的多层编码器处理后,每个输入token都会对应一个输出向量(维度与隐藏层维度相同,如768或1024)。这些输出向量蕴含了丰富的、上下文相关的语义信息,是连接下游任务的桥梁。

4. 应用范式:预训练 + 微调

BERT的成功不仅在于其强大的架构,更在于它确立了一种高效的NLP问题解决范式:先在海量通用语料(如维基百科+BooksCorpus)上进行预训练,学习通用的语言知识;再针对特定任务,用少量标注数据进行微调(Fine-tuning)

微调的过程非常灵活,通常只需在BERT之上添加一个简单的任务层,然后用任务数据对整个模型进行端到端的、小学习率的训练。这种“一点就通”的能力,使得它能够轻松适配各类任务:

  1. 句子级别任务:如情感分析文本分类。将 [CLS] 标记的最终输出向量,输入到一个新加的线性分类层中进行预测。

  2. Token级别任务:如命名实体识别(NER)词性标注。将每个token对应的输出向量,分别输入到一个分类层中进行独立预测。

  3. 问答任务:如 SQuAD(斯坦福问答数据集)。将问题和包含答案的段落拼接后输入BERT,然后训练两个新的向量来分别预测答案片段的起始位置结束位置

  4. 句对任务:如自然语言推理(NLI)。将两个句子通过 [SEP] 连接后输入,使用 [CLS] 的输出进行分类,判断两句话的关系(如蕴涵、矛盾、中立)。

5. BERT知识全景总结框图

为了帮助你更直观地构建BERT的知识体系,以下是一张基于上述内容的思维导图,梳理了从核心思想到实际应用的关键脉络。

总而言之,BERT通过其双向的视野和精巧的“预训练-微调”设计,赋予了机器更深层次的语言理解能力。它不仅在当时刷新了11项NLP任务的纪录,更深刻地影响了后续几乎所有大型语言模型的发展路径。直到今天,理解BERT依然是探索更复杂、更强大AI模型的坚实起点。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐