Appearance
BERT架构
BERT(Bidirectional Encoder Representations from Transforms)= 只取 Transformer 的编码器,用「完形填空」的方式做大规模自监督预训练。它是 Encoder-only 范式的代表,主攻「理解」。
1. 整体形态
输入: [CLS] 我 喜欢 深度 学习 [SEP]
│ (WordPiece 子词 + 段嵌入 + 位置嵌入)
▼
┌─────────────────────┐
│ Transformer Encoder │ × 12(base) / 24(large)
│ 双向自注意力 + FFN │ d_model=768/1024, h=12/16
└─────────┬───────────┘
▼
每个位置得到一个富含上下文的向量
│
▼
[CLS] 向量 → 分类; 各位置向量 → 序列标注 / 抽取 / 检索- base:12 层、768 维、12 头、约 110M 参数。
- large:24 层、1024 维、16 头、约 340M 参数。
2. 输入 = 三种嵌入相加
BERT 的输入表示是三张嵌入表逐元素相加:
Token 嵌入(WordPiece 子词)
+ 段嵌入(Segment, 区分句子A/B)
+ 位置嵌入(可学习, 上限 512)
───────────────────────────
= 送入 Encoder 的最终向量两个特殊符号:
[CLS]:句首聚合符号,它的最终向量常被用作整句表示(分类任务)。[SEP]:分隔符,分隔句子、标记结尾。
3. 预训练任务一:MLM(掩码语言模型)
这就是「完形填空」:随机遮住 15% 的词,让模型根据双向上下文预测被遮住的是什么。
原句: 我 喜欢 深度 学习
遮住: 我 [MASK] 深度 学习 → 让模型还原"喜欢"细节(并非全用 [MASK]):被选中的 token 中
- 80% → 替换成
[MASK] - 10% → 替换成随机词
- 10% → 保持原词
这样做是为了缓解「预训练见到 [MASK]、微调/推理见不到」的分布不一致。
为什么 MLM 必须用双向 Encoder? 还原一个词需要同时利用左右文,这正是编码器的强项,也是解码器(单向)做不到的。
4. 预训练任务二:NSP(下一句预测)
给两个句子,判断「B 是不是 A 的下一句」(二分类)。目的是让 [CLS] 向量学到句子间关系。(后续 RoBERTa 等工作发现 NSP 收益有限,常被去掉,这里了解即可。)
5. 下游怎么用:预训练 + 微调
预训练好的 BERT(通用语言理解)
│ 在头部加一个很小的任务网络, 全模型端到端微调
▼
┌───────────────┬────────────────┬───────────────┬──────────────┐
│ 句子分类 │ 句对分类/相似度 │ 序列标注(NER) │ 抽取式问答(SQuAD)│
│ 用 [CLS] 向量 │ 用 [CLS] 向量 │ 用每个词向量 │ 预测答案起止位置 │
└───────────────┴────────────────┴───────────────┴──────────────┘python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tok = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese", num_labels=2)
enc = tok("这部电影太精彩了!", return_tensors="pt")
logits = model(**enc).logits # [1, 2] 情感二分类6. BERT 的强项与局限
| 强项 | 局限 |
|---|---|
| 理解类任务登顶(分类、NER、问答抽取、检索) | 不擅长自由生成(它没学过逐词续写) |
| 双向上下文,表示质量高 | 输入最长 512,长文受限 |
| 一个预训练模型适配众多下游 | 微调会改动全部权重,多任务成本高(→ 催生日后 PEFT/LoRA) |
7. 家族成员速览
- RoBERTa:更大语料、去掉 NSP、更久训练。
- DistilBERT:知识蒸馏,更小更快。
- ALBERT:参数共享,省内存。
- 中文:
bert-base-chinese、hfl/系列(MacBERT、RoBERTa-wwm)。
小结
- BERT = Transformer Encoder + MLM/NSP 自监督预训练。
- 输入是 token + 段 + 位置三嵌入相加,
[CLS]/[SEP]打头尾。 - 双向注意力让它极擅长「理解」,靠预训练+微调适配下游。
- 不擅长生成——那是下一页 GPT 的主场。
下一步
看 Decoder-only 如何靠「续写」统一天下 → GPT架构。