Bert⚓︎
约 1785 个字 1 张图片 预计阅读时间 6 分钟 总阅读量 次
BERT 的出现可以说是 NLP 领域进入“大模型时代”的开端,它提出的思想深刻地影响了后续所有的预训练模型。
下面我们来系统地梳理 BERT (arxiv)。
1. BERT 的模型网络架构⚓︎
一言以蔽之:BERT 的网络架构就是原始 Transformer 的编码器 (Encoder) 部分的堆叠。
是的,就是这么简单。BERT 摒弃了 Transformer 的解码器 (Decoder) 部分,只使用其 Encoder。一个典型的 BERT-Base 模型会堆叠12个 Encoder 层,而 BERT-Large 则会堆叠24个。
让我们回顾一下 Transformer Encoder 的单层结构:
输入 -> 多头自注意力 (Multi-Head Self-Attention) -> Add & Norm -> 前馈神经网络 (Feed-Forward Network) -> Add & Norm -> 输出
BERT 就是把这个结构重复N次。
2. 相比原始 Transformer 的改进⚓︎
虽然核心组件没变,但 BERT 在如何使用这些组件,以及训练目标上做出了革命性的改进。这正是它的精髓所在。
方面 | 原始 Transformer | BERT |
---|---|---|
模型结构 | Encoder + Decoder (用于Seq2Seq任务) | 仅 Encoder (用于语言理解) |
核心思想 | 一种通用的序列到序列转换架构 | 通过深度双向预训练,生成通用的语言表示 |
信息流 | Encoder是双向的,Decoder是单向(自回归)的 | 完全双向,模型在处理一个词时,能同时看到其左右两边的所有上下文 |
预训练任务 | 无(原始论文中没有预训练概念) | Masked Language Model (MLM) + Next Sentence Prediction (NSP) |
位置编码 | Sinusoidal (三角函数) | Learned Positional Encoding (可学习的位置编码),与词嵌入一起训练 |
输入表示 | Token Emb + Positional Emb |
Token Emb + **Segment Emb** + Positional Emb |
最重要的改进:BERT 重新定义了模型的“目标”。原始 Transformer 是为了“翻译”等特定任务服务的。而 BERT 的目标是,通过两大创新的预训练任务,让自己成为一个通用的、深刻理解自然语言的“语言理解专家”。
3. BERT 的“杀手锏”:预训练任务⚓︎
为了实现真正的双向理解,BERT 设计了两个预训练任务。
1) Masked Language Model (MLM) - 掩码语言模型⚓︎
这是 BERT 的核心创新。传统的语言模型为了预测下一个词,只能看左边的信息(单向)。如果允许它看到右边的词,那预测就变成了“作弊”。
BERT 的做法是:故意遮住(Mask)句子中的一些词,然后让模型去预测这些被遮住的词是什么。
这就像做“完形填空”题。为了填对空,你必须深刻理解整个句子的上下文,包括空格前后的信息。
- 具体流程:
- 随机选择输入句子中 15% 的 Token。
- 对于这 15% 的 Token:
- 80% 的概率,用一个特殊的
[MASK]
标记替换掉它。我爱学习 -> 我爱 [MASK]习
- 10% 的概率,用一个随机的词替换它。
我爱学习 -> 我爱 [苹]习
(这能增强模型的纠错能力,迫使其更依赖上下文) - 10% 的概率,保持原样。
我爱学习 -> 我爱学习
(这为了减轻[MASK]
标记带来的预训练-微调阶段不匹配问题)
- 80% 的概率,用一个特殊的
- 模型的训练目标就是准确预测出这些被修改位置的原始单词。
通过MLM,BERT 被迫学习到了词级别的深度双向语境表示。
2) Next Sentence Prediction (NSP) - 下一句预测⚓︎
MLM 关注于词级别的理解,而 NSP 则让 BERT 理解句子与句子之间的关系。这对于问答(QA)、自然语言推断(NLI)等任务至关重要。
-
具体流程:
- 构造训练样本时,输入两个句子 A 和 B。
- 50% 的概率,句子 B 是句子 A 在原始语料中的真实下一句 (标签为
IsNext
)。 - 50% 的概率,句子 B 是从语料库中随机抽取的一个句子 (标签为
NotNext
)。 - BERT 需要预测 B 是否是 A 的下一句。这个预测任务通常是利用一个特殊的
[CLS]
标记的输出来完成的。
-
后续发展:后来的研究(如 RoBERTa)发现 NSP 任务可能过于简单,甚至会损害模型性能,因此许多后续模型放弃了 NSP。但它在 BERT 原始设计中是重要一环。
4. BERT 的架构和流程梳理⚓︎
整个 BERT 的生命周期分为两个阶段:
阶段一:预训练 (Pre-training)
- 输入:海量的无标签文本(如维基百科、书籍)。
- 输入格式:每个输入样本包含一到两个句子,并加入了特殊标记:
[CLS]
:加在整个输入的开头,其对应的最终输出向量被用作整个序列的聚合表示,用于分类任务。[SEP]
:加在句子之间,以及整个输入的末尾,用于分隔句子。- Segment Embedding: 为每个 Token 额外增加一个段落嵌入,用于区分它是属于句子A还是句子B。
- 流程:
- 将输入文本处理成
Token Embedding + Segment Embedding + Position Embedding
的总和。 - 将处理后的向量序列喂入 N 层的 Transformer Encoder。
- 使用最终的输出向量,同时计算 MLM 损失和 NSP 损失。
- 根据总损失,反向传播更新模型所有参数。
- 将输入文本处理成
- 产出:一个预训练好的、包含了丰富语言知识的 BERT 模型。这个阶段极其耗费计算资源。
阶段二:微调 (Fine-tuning)
- 输入:针对特定下游任务的少量有标签数据(如情感分类、命名实体识别)。
- 流程:
- 加载预训练好的 BERT 模型。
- 根据具体任务,在 BERT 的输出层之上增加一个简单的、未训练的分类层(比如一个全连接层+Softmax)。
- 用任务相关的标注数据,对整个模型(或主要只对顶部的分类层)进行训练。由于 BERT 已有很好的语言理解基础,这个过程通常很快,需要的数据也少。
- 产出:一个在特定任务上表现优异的“专家”模型。
5. BERT 在哪些任务上有改进?它的特点是什么?⚓︎
-
改进的任务:BERT 在几乎所有的自然语言理解 (NLU) 任务上都取得了当时 SOTA (State-of-the-art) 的效果,血洗了 GLUE、SQuAD 等权威榜单。这些任务包括:
- 句子级分类:情感分析、文本分类。
- 词级分类:命名实体识别 (NER)。
- 句子对分类:自然语言推断 (NLI)、句子相似度判断。
- 问答:抽取式问答 (Extractive QA),如 SQuAD。
-
核心特点总结:
- 真正的双向性:通过 MLM 机制,是第一个真正实现了深度双向上下文表示的模型。
- 预训练-微调范式:奠定了现代 NLP 大模型“大规模预训练 + 少量数据微调”的黄金范式。
- 通用性:同一个预训练模型,只需微调即可适配大量不同的下游任务,实现了极大的模型复用。
- 非生成式:BERT 是一个强大的理解模型,而不是像 GPT 那样的生成模型。它的架构不适合做长文本生成。
希望这个详细的梳理能帮助你彻底理解 BERT 的精髓!