共计 2007 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
BERT(Bidirectional Encoder Representations from Transformers)是 NLP 领域里程碑式的预训练模型,通过双向 Transformer 架构理解上下文语义。初学者常面临三大难点:
1. 不理解如何将文本转化为 BERT 的输入格式
2. 对 Transformer 的自注意力机制感到抽象
3. 不清楚预训练任务(MLM 和 NSP)的实际作用

框架图核心模块解析
输入表示层
BERT 的输入由三部分组成(假设输入句子:”[CLS] how are you [SEP]”):
- Token Embeddings
- 通过 WordPiece 分词器将句子拆分为[“[CLS]”, “how”, “are”, “you”, “[SEP]”]
-
每个 token 转换为 768 维向量(以 BERT-base 为例)
-
Segment Embeddings
- 区分句子 A / B 的标记(单句任务全为 0)
-
例如:[0, 0, 0, 0, 0] 表示单句输入
-
Position Embeddings
- 编码绝对位置信息:[0, 1, 2, 3, 4]
- 最大支持 512 个 token
三者相加形成最终输入矩阵(shape: [seq_len, hidden_size])
Transformer 编码器结构
以 BERT-base 的 12 层 Transformer 为例:
- Self-Attention 层
- 计算每个 token 与其他 token 的关联权重
- 公式:$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$
-
多头机制(12 个 head)允许关注不同子空间
-
Feed Forward Network
- 两层全连接网络(中间层维度 3072)
- 使用 GELU 激活函数:$GELU(x)=xΦ(x)$
每层后接 LayerNorm 和残差连接,防止梯度消失
预训练任务设计
- Masked Language Model (MLM)
- 随机掩盖 15% 的 token(其中 80% 替换为[MASK],10% 随机替换,10% 保持不变)
-
通过上下文预测被掩盖的词
-
Next Sentence Prediction (NSP)
- 判断句子 B 是否是句子 A 的后续
- 正例:从文档连续抽取两句话
- 负例:随机组合两句话
代码实践
from transformers import BertModel, BertTokenizer
import torch
# 初始化模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 输入处理
text = "[CLS] how are you [SEP]"
inputs = tokenizer(text, return_tensors="pt") # 自动添加特殊 token
# 前向传播
with torch.no_grad(): # 关闭梯度计算
outputs = model(**inputs)
# 输出解析
last_hidden_state = outputs.last_hidden_state # [1, seq_len, 768]
pooler_output = outputs.pooler_output # [1, 768] CLS token 的表示
关键参数说明:
– input_ids: token 索引序列
– attention_mask: 区分真实 token 与 padding(1/0)
– token_type_ids: 句子 A / B 标识
常见问题与解决方案
- 输入长度超限
- BERT 最大支持 512token
-
解决方案:
- 截断:
tokenizer(text, truncation=True) - 滑动窗口处理长文本
- 截断:
-
忘记切换 eval 模式
- 预测时需执行
model.eval() -
否则 dropout 等层会继续生效
-
未处理特殊 token
- 手动添加 [CLS]/[SEP] 可能导致重复
- 应使用 tokenizer 自动处理
进阶实践建议
-
可视化注意力权重:
from bertviz import head_view head_view(model, tokenizer, text) -
微调实战步骤:
- 准备领域特定数据
- 继承
BertPreTrainedModel创建自定义模型类 - 添加任务特定层(如分类器)
-
冻结部分底层参数加速训练
-
输出分析技巧:
- 使用 TSNE 降维可视化句向量
- 计算相似度矩阵观察语义捕获能力
学习资源推荐
- 官方论文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
- Hugging Face 文档:https://huggingface.co/docs/transformers/model_doc/bert
- 可视化工具:BertViz, exBERT
通过理解框架图的核心设计,配合代码实操,初学者可以快速跨越 BERT 的理论到实践鸿沟。建议从简单的文本分类任务开始,逐步探索更复杂的应用场景。
