BERT相关知识自测
✅ 1. BERT 分为哪两种预训练任务?各自的作用是什么?
BERT 在预训练阶段使用两个无监督任务:
Masked Language Model (MLM) —— 掩码语言模型
- 做法:随机选择输入序列中 15% 的 token,要求模型根据上下文预测这些位置的原始 token。
- 其中 80% 替换为
[MASK]
- 10% 替换为随机 token
- 10% 保持不变
- 其中 80% 替换为
- 作用:实现双向上下文建模,让模型学习词汇级别的语义表示。
- 做法:随机选择输入序列中 15% 的 token,要求模型根据上下文预测这些位置的原始 token。
Next Sentence Prediction (NSP) —— 下一句预测
- 做法:输入两个句子 A 和 B,判断 B 是否是 A 的下一句(50% 是,50% 否)。
- 作用:学习句子间关系(如连贯性、逻辑),提升问答、自然语言推理等任务表现。
⚠️ 注:后续研究(如 RoBERTa)发现 NSP 效果有限,许多改进模型已移除。
✅ 2. 在计算 MLM 预训练任务的损失函数时,参与计算的 Tokens 有哪些?是全部的 15% 的词汇,还是其中真正被 [MASK]
的那些 tokens?
答案:是被选中用于 MLM 任务的全部 15% 的 tokens,无论它们在输入中是否显示为 [MASK]
。
详细说明:
- BERT 随机选择 15% 的 token 作为 MLM 的预测目标。
- 对这 15% 的 token,输入可能被替换为
[MASK]
、随机 token,或保持不变。 - 但模型的目标是:预测这些位置的原始 token。
- 因此,这 15% 的 token 全部参与损失计算。
✅ 关键:参与损失的是“被选中用于预测的 token”,不是“输入中为
[MASK]
的 token”。
✅ 3. 在实现损失函数的时候,怎么确保没有被选中用于 MLM 的 token 不参与到损失计算中去?
通过 labels
张量中的 ignore_index
机制 实现。
实现方式:
- 构造一个
labels
张量,形状与模型输入相同。 - 对于未被选中用于 MLM 的 token,将其 label 设为
-100
。 - 对于被选中用于 MLM 的 15% 的 token,保留其原始 token ID。
- 使用
nn.CrossEntropyLoss(ignore_index=-100)
,PyTorch 会自动忽略-100
位置的损失。
代码示例:
Python
编辑
loss_fn = nn.CrossEntropyLoss(ignore_index=-100)
loss = loss_fn(logits.view(-1, vocab_size), labels.view(-1)) # 只计算 15% 的损失
✅ 这样确保只有那 15% 的预测目标参与反向传播。
✅ 4. BERT 的三个 Embedding 为什么可以直接相加?(Token + Segment + Position)
因为:
- 维度一致:三者都是 �_modeld_model 维向量(如 768),可以直接相加。
- 线性可分性:Transformer 的自注意力机制能够从相加后的向量中“解耦”出不同信息。
- 位置编码的传统:Transformer 原始论文使用可学习或正弦位置编码,均采用相加方式。
- 实验有效:相比拼接(concat),相加更简洁、参数更少,且效果不差。
- 模型可学习:后续的 Attention 和 FFN 层会自动学习如何利用这些融合信息。
✅ 本质上:相加是一种高效、可学习的多源信息融合方式。
✅ 5. BERT 的优缺点分别是什么?
✅ 优点:
- 双向上下文建模:通过 MLM 实现真正的双向编码。
- 上下文相关表示:同一词在不同语境下有不同表示。
- 预训练 + 微调范式:适用于多种 NLP 任务,无需复杂特征工程。
- 强大的迁移能力:在多项任务上取得 SOTA。
- 结构简洁:纯 Transformer Encoder,易于扩展。
❌ 缺点:
- NSP 任务无效:RoBERTa 发现 NSP 对性能帮助不大。
- 静态 masking(早期):预训练时 masking 固定,缺乏多样性(可通过动态 masking 解决)。
- [MASK] 标记不一致:预训练用
[MASK]
,微调时没有,导致分布偏移(通过 10% 不替换缓解)。 - 计算资源消耗大:尤其是 BERT-Large。
- 不擅长生成:是 Encoder-only 模型,无法自回归生成。
✅ 6. 你知道有哪些针对 BERT 的缺点做优化的模型?
模型 | 针对的缺点 | 改进点 |
---|---|---|
RoBERTa | NSP 无效、静态 masking、训练不足 | 去掉 NSP、动态 masking、更大 batch、更多数据 |
ALBERT | 参数量大、内存消耗高 | 参数共享、嵌入分解、支持更大模型 |
DistilBERT | 模型大、推理慢 | 知识蒸馏,6 层小模型,速度快,性能高 |
SpanBERT | 无法建模短语/片段 | 引入 span masking,更好恢复名词短语 |
ELECTRA | MLM 效率低(只预测 15%) | 使用“替换检测”任务,判别式训练,更高效 |
DeBERTa | 未充分利用 token 和位置 | 分解 attention,显式建模 token 和位置关系 |
✅ 7. BERT 怎么用在生成模型中?
BERT 本身是 Encoder-only 模型,不能直接用于自回归生成(如 GPT 那样逐词生成),但可通过以下方式用于生成任务:
作为 Encoder + 外接 Decoder
- 例如:在问答、摘要任务中,用 BERT 编码输入,接一个 Transformer Decoder 生成答案。
- 类似 BART、T5 的思想。
提供上下文表示
- 在生成模型中,将 BERT 的输出作为额外特征输入到生成器中,提升生成质量。
完形填空式生成
- 用于短文本补全,如
The capital of France is [MASK].
→ 生成Paris
。 - 但这不是真正的长文本生成。
- 用于短文本补全,如
统一建模架构(如 UniLM)
- 修改注意力掩码,让 BERT 支持单向生成,实现“统一语言模型”。
✅ 总结:BERT 本身不生成,但可作为强大编码器服务于生成系统。
🎯 总结:术语统一与逻辑一致性
易混淆术语 | 正确定义 |
---|---|
“被 mask” | 在损失计算中,指“被选中用于 MLM 预测的 15% 的 token”,不是“输入中为 [MASK] 的 token” |
参与损失的 token | 是那 15% 的预测目标,其余 85% 通过 ignore_index=-100 忽略 |
MLM 目标 | 预测原始 token,无论输入中是 [MASK] 、随机词,还是原词 |