共计 1957 个字符,预计需要花费 5 分钟才能阅读完成。
1. BERT 预训练背景与 MLM 基本原理
BERT(Bidirectional Encoder Representations from Transformers)是 2018 年由 Google 提出的革命性预训练语言模型。其核心创新在于双向 Transformer 架构和两个预训练任务:

- 掩码语言模型(MLM):随机遮盖输入文本的部分 token,让模型预测被遮盖的内容
- 下一句预测(NSP):判断两个句子是否连续出现
MLM 之所以关键,是因为它迫使模型通过上下文理解单词的深层语义。传统的语言模型(如 GPT)只能从左到右预测,而 BERT 的 MLM 允许同时利用左右上下文信息。
2. 15% Token 处理策略详解
2.1 基本策略分配
对于被选中的 15% token,BERT 采用如下分配方式:
- 80% 概率替换为
[MASK] - 10% 概率替换为随机 token
- 10% 概率保持原 token 不变
数学表达为:
P(处理方式 | 被选中) = {[MASK]: 0.8,
random: 0.1,
original: 0.1
}
2.2 设计原理
这种看似复杂的策略实际解决了几个关键问题:
- 防止模型过度依赖
[MASK]:如果总是遮盖,模型可能只在见到[MASK]时才学习 - 增强鲁棒性:随机替换模拟真实场景中的拼写错误或同义词替换
- 保留部分原始信息:帮助模型建立 token 与上下文的真实关联
3. PyTorch 实现示例
import torch
import random
def mlm_mask_tokens(inputs, tokenizer, mlm_prob=0.15):
"""
inputs: 输入 token id 张量 [batch_size, seq_len]
tokenizer: 用于获取 vocab_size 和特殊 token
mlm_prob: 默认 15% 的 mask 概率
"""
labels = inputs.clone()
prob_matrix = torch.full(labels.shape, mlm_prob)
masked_indices = torch.bernoulli(prob_matrix).bool()
# 80% 替换为[MASK]
mask_token = tokenizer.mask_token_id
indices_replaced = torch.bernoulli(torch.full(labels.shape, 0.8)).bool() & masked_indices
inputs[indices_replaced] = mask_token
# 10% 随机替换
vocab_size = len(tokenizer.vocab)
indices_random = torch.bernoulli(torch.full(labels.shape, 0.5)).bool() & masked_indices & ~indices_replaced
random_words = torch.randint(vocab_size, labels.shape, dtype=torch.long)
inputs[indices_random] = random_words[indices_random]
# 剩下 10% 保持原样
return inputs, labels
4. 策略性能影响分析
优势
- 在下游任务微调时表现更稳定(因为模型见过各种 token 变化)
- 相比纯
[MASK]策略,在 GLUE 基准上提升约 2 - 3 个点 - 对 OOV(未登录词)处理更鲁棒
训练效率
- 增加约 15% 的计算开销(需要处理三种情况)
- 可能需要多训练 1 - 2 个 epoch 达到相同效果
5. 实践建议
- 领域适应调整:
- 医疗文本可降低随机替换比例(专业术语不宜随意替换)
-
社交媒体文本可提高随机比例(模拟网络用语变化)
-
batch size 权衡:
- 小 batch(<32)时建议保持原策略
-
大 batch 时可尝试调整比例(如 70-15-15)
-
学习率配合:
- 改变 mask 策略后建议用学习率 warmup
- AdamW 的 epsilon 可设为 1e-6(默认 1e- 8 可能太小)
6. 与其他模型的对比
| 策略 | BERT | RoBERTa | ALBERT |
|---|---|---|---|
| Mask 比例 | 15% | 动态调整(最高 20%) | 同 BERT |
| 随机替换 | 10% | 取消 | 同 BERT |
| 保持原样 | 10% | 取消 | 同 BERT |
RoBERTa 的改进表明:
– 更大 batch 和更多数据时,简单 [MASK] 可能足够
– 但小数据场景仍需要 BERT 的保守策略
开放思考题
- 如果对中文采用不同的比例(如 90-5-5),会有什么影响?
- 如何设计实验验证 10% 随机替换的最优性?
- 在低资源语言中,这种策略是否需要调整?如何调整?
结语
BERT 的 MLM 策略展现了巧妙的工程平衡——既不能让模型走捷径,又不能让它学习噪声。理解这些设计细节,能帮助我们在实际项目中更灵活地调整预训练策略。当你在自己的语料上微调 BERT 时,不妨尝试记录不同 mask 策略的效果差异,这往往能带来意想不到的发现。
正文完
