BERT 预训练任务 - MLM 和 NSP 介绍
1 课程概览
本课介绍 BERT 的两个预训练任务:MLM(Masked Language Model,掩码语言模型)和 NSP(Next Sentence Prediction,下一句预测)。MLM 让 BERT 理解单个词的含义,NSP 让 BERT 理解句子之间的关系。两者组合使 BERT 功能强大。MLM 采用 15% 的 811 规则。
2 核心概念与定义
- 预训练(Pre-training):在超大规模语料上训练,学习语法和基础知识。
- 微调(Fine-tuning):利用预训练模型定制化训练某些任务。
- 下游任务(Downstream Task):基于预训练模型的具体任务。
- MLM(Masked Language Model):掩码语言模型,类似完形填空加纠错。
- NSP(Next Sentence Prediction):下一句预测,判断句子关系。
- 15% 的 811 规则:MLM 的掩码规则。
3 模型与算法详解
预训练 vs 微调
类比学习过程。
| 概念 | 类比 | 说明 |
|---|---|---|
| 预训练 | 小学一年级到大四 | 学习基础知识 |
| 微调 | 黑马培训 | 定制化训练 |
MLM(Masked Language Model)
掩码语言模型,让 BERT 理解单个词的含义。
- 类似完形填空加纠错
- 深度双向表达模型
- 采用 mask 来做训练
15% 的 811 规则
MLM 的掩码规则。
假设数据共 100 条,取 15%(15 条)做掩码,这 15 条又分 811:
| 比例 | 数量 | 操作 |
|---|---|---|
| 80% | 12 条 | 用 [MASK] 替换 |
| 10% | 1.5 条 | 用随机单词替换 |
| 10% | 1.5 条 | token 不变 |
为什么要 811 规则
倒逼模型做推理。
- 80% 用 [MASK] 替换:标准掩码
- 10% 用随机单词替换:纠错能力
- 10% 不变:保持原始信息
NSP(Next Sentence Prediction)
下一句预测,让 BERT 理解句子之间的关系。
- 输入:两句话
- 输出:是否是下一句(二分类)
- 让 BERT 理解句子关系
两个任务的组合
MLM + NSP = 强大的 BERT。
| 任务 | 作用 |
|---|---|
| MLM | 理解单个词的含义 |
| NSP | 理解句子之间的关系 |
4 数学原理与推导
MLM
$$P(\text{mask} | \text{context}) = \text{softmax}(\text{BERT}(\text{context}))$$
其中:
- $\text{mask}$ 是被掩码的词
- $\text{context}$ 是上下文
15% 的 811 规则
$$\text{mask_count} = \text{total} \times 15%$$
$$\text{mask_count} = \text{mask_count} \times 80% + \text{mask_count} \times 10% + \text{mask_count} \times 10%$$
NSP
$$P(\text{is_next} | \text{sentence}_1, \text{sentence}_2) = \text{softmax}(\text{BERT}(\text{sentence}_1, \text{sentence}_2))$$
5 代码示例
from transformers import BertTokenizer, BertForMaskedLM, BertForNextSentencePrediction
import torch
# 加载 BERT 预训练模型
model_name = "bert-base-chinese"
my_tokenizer = BertTokenizer.from_pretrained(model_name)
# === MLM 任务 ===
print("=== MLM 任务 ===")
mlm_model = BertForMaskedLM.from_pretrained(model_name)
# 输入文本(带 [MASK])
text = "床前[MASK]光,疑是地上霜。"
inputs = my_tokenizer(text, return_tensors='pt')
# 预测
with torch.no_grad():
outputs = mlm_model(**inputs)
predictions = outputs.logits
# 获取 [MASK] 位置的预测
mask_token_index = torch.where(inputs['input_ids'][0] == my_tokenizer.mask_token_id)[0]
predicted_token_id = predictions[0, mask_token_index].argmax(dim=-1)
predicted_token = my_tokenizer.convert_ids_to_tokens(predicted_token_id)
print(f"MLM 预测: {predicted_token}")
# === NSP 任务 ===
print("\n=== NSP 任务 ===")
nsp_model = BertForNextSentencePrediction.from_pretrained(model_name)
# 输入两句话
sentence1 = "床前明月光"
sentence2 = "疑是地上霜"
inputs = my_tokenizer(sentence1, sentence2, return_tensors='pt')
# 预测
with torch.no_grad():
outputs = nsp_model(**inputs)
predictions = outputs.logits
# 获取预测结果
predicted_label = predictions.argmax(dim=-1).item()
print(f"NSP 预测: {'是下一句' if predicted_label == 0 else '不是下一句'}")
代码说明
| 代码 | 说明 |
|---|---|
BertForMaskedLM | MLM 任务模型 |
BertForNextSentencePrediction | NSP 任务模型 |
my_tokenizer.mask_token_id | [MASK] 的 id |
argmax(dim=-1) | 获取预测结果 |
6 重难点与易错提醒
- ❗重点:BERT 有两个预训练任务:MLM 和 NSP。
- ❗重点:MLM 采用 15% 的 811 规则。
- ❗重点:MLM 让 BERT 理解单个词的含义,NSP 让 BERT 理解句子关系。
- ❗重点:预训练在超大规模语料上训练,微调是定制化训练。
- ⚠️易错:15% 中的 811 是 80%、10%、10%。
7 课堂问答精选
Q1:BERT 的两个预训练任务是什么?
A:BERT 的两个预训练任务是 MLM(Masked Language Model,掩码语言模型)和 NSP(Next Sentence Prediction,下一句预测)。
Q2:MLM 的 15% 的 811 规则是什么?
A:取 15% 的数据做掩码,这 15% 又分:80% 用 [MASK] 替换,10% 用随机单词替换,10% 不变。
Q3:MLM 和 NSP 的作用是什么?
A:MLM 让 BERT 理解单个词的含义,NSP 让 BERT 理解句子之间的关系。两者组合使 BERT 功能强大。
Q4:预训练和微调的区别?
A:预训练是在超大规模语料上训练,学习基础知识(类比小学到大四);微调是利用预训练模型定制化训练某些任务(类比黑马培训)。
8 本课小结
- BERT 有两个预训练任务:MLM 和 NSP。
- MLM 采用 15% 的 811 规则(80% [MASK],10% 随机,10% 不变)。
- MLM 让 BERT 理解单个词的含义,NSP 让 BERT 理解句子关系。
- 预训练学习基础知识,微调定制化训练。
9 延伸思考
- GLUE 和 CLUE 是什么?
- 如何在公共数据集上测试模型?