共计 1790 个字符,预计需要花费 5 分钟才能阅读完成。
1. BERT 基本原理与预训练目标
BERT(Bidirectional Encoder Representations from Transformers)的核心创新在于双向上下文理解。传统语言模型(如 GPT)只能从左到右或从右到左单向建模,而 BERT 通过以下两种任务实现双向训练:

-
Masked Language Model (MLM):随机遮盖输入文本中 15% 的词汇,让模型预测这些被遮盖的词。例如:
原始句子:"人工智能正在改变世界" 遮盖后:"人工 [MASK] 正在 [MASK] 变世界" -
Next Sentence Prediction (NSP):判断两个句子是否是连续的上下文关系。正样本来自原文连续句子,负样本随机组合不相关句子。
2. 数据准备全流程
2.1 文本清洗
- 去除 HTML 标签、特殊字符
- 统一全角 / 半角标点
- 处理繁体转简体(中文场景)
2.2 分词处理
使用 BERT 专属的 WordPiece 分词器:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
text = "自然语言处理真有趣"
tokens = tokenizer.tokenize(text) # ['自', '然', '语', '言', '处', '理', '真', '有', '趣']
2.3 数据格式转换
需要生成以下两种文件:
- 训练文本文件:每行一个句子或段落
- TFRecord 文件:Google 官方推荐的二进制格式,提升读取效率
3. PyTorch 实现核心代码
3.1 MLM 任务实现
import torch
from transformers import BertForMaskedLM
# 初始化模型
model = BertForMaskedLM.from_pretrained('bert-base-chinese')
# 模拟输入(已遮盖)input_ids = torch.tensor([[101, 100, 104, 100, 102]]) # [CLS], 词 1, [MASK], 词 3, [SEP]
labels = torch.tensor([[-1, 100, 104, 100, -1]]) # 仅计算被遮盖位置的 loss
outputs = model(input_ids, labels=labels)
loss = outputs.loss
3.2 NSP 任务实现
from transformers import BertForNextSentencePrediction
model = BertForNextSentencePrediction.from_pretrained('bert-base-chinese')
# 输入格式: [CLS]句子 A[SEP]句子 B[SEP]
input_ids = torch.tensor([[101, 2054, 2003, 1996, 4248, 102, 2054, 2003, 1996, 8612, 102]])
labels = torch.tensor([1]) # 1 表示是下一句,0 表示不是
outputs = model(input_ids, labels=labels)
4. 关键超参数设置
- Batch Size:根据显存调整,通常 32-256 之间
- Learning Rate:建议 2e- 5 到 5e-5
- Warmup Steps:前 10% 训练步数线性增大学习率
- Max Sequence Length:中文建议 512,英文 128
5. 避坑指南
5.1 显存不足问题
- 使用梯度累积(accumulate_grad_batches=4)
- 启用混合精度训练(fp16=True)
- 减少 max_seq_length
5.2 训练不稳定
- 添加梯度裁剪(max_grad_norm=1.0)
- 适当增大 warmup 比例
- 检查数据中是否存在异常样本
6. 模型评估与微调
6.1 评估指标
- MLM 准确率:预测被遮盖词的 top-1/top- 5 准确率
- NSP 准确率:下一句预测任务准确率
6.2 微调策略
- 领域适应:在专业语料(如医疗、法律)上继续预训练
- 任务微调:修改输出层结构适配具体任务
7. 思考题
- 为什么 BERT 的 MLM 任务只遮盖 15% 的词汇?遮盖比例过高或过低会怎样?
- 如何设计实验验证 NSP 任务对下游任务的实际帮助?
- 在小样本场景下,有哪些提升 BERT 预训练效率的方法?
延伸阅读
- BERT 原论文
- Hugging Face Transformers 文档
- 《自然语言处理入门》第 8 章
正文完
