BERT模型学习笔记

📅 2026/7/8 12:28:56
BERT模型学习笔记
论文BERT基本信息论文标题BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding作者Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina ToutanovaGoogle AI Language发表会议NAACL-HLT 2019核心贡献首次提出深度双向 Transformer 预训练框架通过掩码语言模型与下一句预测两个自监督任务在 11 项 NLP 基准任务上刷新当时最优记录奠定了预训练语言模型的主流范式。一、研究背景与动机1.1 预训练语言表示的两大范式在 BERT 出现之前预训练语言表示主要分为两条技术路线基于特征Feature-based代表为 ELMo使用双向 LSTM 提取上下文特征将预训练得到的嵌入作为额外特征输入到任务特定模型中。其双向性是 浅层拼接—— 分别训练正向和反向 LSTM再将结果拼接并非真正的深度双向。基于微调Fine-tuning代表为 OpenAI GPT使用 Transformer 解码器结构仅需在预训练模型上添加输出层即可端到端微调。但 GPT 是单向语言模型只能利用左侧上下文对需要双向理解的任务如问答、完形填空存在天然缺陷。1.2 核心问题标准语言模型只能从左到右或从右到左单向训练无法同时利用左右两侧的上下文信息限制了模型对深层语义的理解能力。BERT 的核心目标设计一种能够在所有层同时利用左右上下文的深度双向预训练模型并保持微调范式的简洁性。二、模型方法详细2.1 整体架构BERT 的主体是多层 Transformer 编码器完全沿用《Attention is All You Need》中提出的编码器结构仅在层数、隐藏维度等超参数上做了缩放。整体框架分为两个阶段预训练Pre-training在大规模无标注语料上通过两个自监督任务MLM NSP联合训练学习通用语言表示。微调Fine-tuning针对具体下游任务在预训练模型基础上添加少量任务特定输出层端到端微调全部参数。2.2 输入表示BERT 的输入可以是单个句子或句子对每个输入 token 的嵌入由三部分相加得到三种嵌入向量逐元素相加Token Embedding使用 WordPiece 分词词表大小 30,000。将每个子词映射为对应维度的向量。Segment Embedding区分两个句子。句子 A 的所有 token 使用向量EA​句子 B 的所有 token 使用向量EB​。单句输入时全部使用EA​。Position Embedding可学习的位置编码最大支持序列长度 512。与 Transformer 原论文的正弦位置编码不同BERT 直接让模型从数据中学习位置信息。两个特殊 Token 的设计[CLS]置于序列开头其最终隐藏状态作为整句 / 句子对的聚合表示用于分类任务。[SEP]分隔符用于分隔两个句子同时放在序列末尾。输入示例句子对plaintext[CLS] 我 爱 自然 语言 处理 [SEP] BERT 很 强大 [SEP]2.3 预训练任务一掩码语言模型Masked LM, MLMMLM 是实现深度双向的核心机制也是 BERT 最关键的创新。基本思想随机遮蔽输入序列中的部分 token让模型根据上下文预测被遮蔽的原始单词。由于被遮蔽的位置可以同时看到左右所有上下文模型被迫学习双向语义表示。具体策略随机选择输入序列中15% 的 token作为预测目标对这些被选中的 token 按以下三种方式处理80% 概率替换为特殊标记[MASK]例my dog is hairy→my dog is [MASK]10% 概率替换为词表中一个随机单词例my dog is hairy→my dog is apple10% 概率保持原单词不变例my dog is hairy→my dog is hairy设计意图80% 替换为 [MASK]制造预测任务迫使模型利用上下文推理。10% 替换为随机词增加任务难度迫使模型更深入地理解语义而非简单记忆。10% 保持不变缓解预训练与微调的分布差异 —— 微调阶段输入中不存在[MASK]标记保持一定比例的原词能让模型学到更鲁棒的表示。损失计算仅在被遮蔽的 15% token 位置计算交叉熵损失其余 85% 的 token 只提供上下文信息不参与损失计算。这区别于去噪自编码器需要重构全部输入训练效率更高。2.4 预训练任务二下一句预测Next Sentence Prediction, NSP设计动机许多下游任务如问答、自然语言推理需要理解两个句子之间的关系而标准语言模型只建模单句内部的序列依赖。NSP 任务让模型学习句子级别的连贯性判断。具体实现构造句子对 (A, B) 作为输入正样本50%B 是 A 在原文中的真实下一句标签为IsNext负样本50%B 是从语料库中随机抽取的无关句子标签为NotNext使用[CLS]位置的最终隐藏状态输入二分类器预测两个句子是否连续。示例plaintext正样本 A: 我今天去图书馆看书 B: 借了三本关于深度学习的书 标签: IsNext 负样本 A: 我今天去图书馆看书 B: 明天的气温会下降五度 标签: NotNext2.5 预训练过程细节训练语料BooksCorpus8 亿词 英文维基百科25 亿词共约 33 亿词。序列长度预训练时最大序列长度为 12890% 步数和 51210% 步数。先训练短序列加速收敛再训练长序列学习位置信息。优化器Adam学习率 1e-4β₁0.9β₂0.999权重衰减 0.01。训练步数BERT-base 训练 100 万步batch size256。激活函数GELU高斯误差线性单元而非 ReLU。2.6 两种标准模型配置表格模型层数 (L)隐藏维度 (H)注意力头数 (A)参数总量BERT-base1276812110MBERT-large24102416340MBERT-base 的参数量与 GPT 相当便于公平对比BERT-large 用于追求最优性能。三、微调方法BERT 的微调极其简洁针对不同下游任务只需修改输入格式和输出层模型主体完全复用。3.1 单句分类任务输入[CLS] 句子 [SEP]输出[CLS]位置的向量接入全连接层 softmax输出类别概率代表任务情感分析、主题分类3.2 句子对分类 / 推理任务输入[CLS] 句子A [SEP] 句子B [SEP]输出[CLS]位置向量做分类代表任务自然语言推理MNLI、释义判断MRPC3.3 抽取式问答任务输入[CLS] 问题 [SEP] 段落 [SEP]输出在段落 token 上预测答案的起始位置和结束位置两个概率分布代表任务SQuAD3.4 序列标注任务输入[CLS] 句子 [SEP]输出每个 token 位置的隐藏状态分别接入分类器预测对应标签代表任务命名实体识别NER四、主要实验结果BERT 在 11 项 NLP 任务上全面刷新当时的 SOTAGLUE 基准综合得分 80.5%相对提升 7.7 个百分点MultiNLI准确率 86.7%相对提升 4.6 个百分点SQuAD v1.1测试集 F193.2超越人类表现SQuAD v2.0测试集 F183.1SWAG准确率 86.3%核心结论模型规模增大持续带来性能提升即使参数达到 3.4 亿性能仍未饱和。这为后续更大规模模型的探索提供了实证依据。五、关键消融实验5.1 预训练任务的影响表格配置MLMNSPMNLI 准确率BERT-base✓✓84.4%无 NSP✓✗83.7%左到右 LM类似 GPT✗✓77.5%结论MLM 带来的双向性是性能提升的主要来源比单向 LM 高出近 7 个点。NSP 也有一定贡献0.7%但后续研究如 RoBERTa发现 NSP 的作用有限甚至可能有害。5.2 模型深度的影响随着层数从 2 层增加到 24 层各项任务性能持续单调提升证明深层 Transformer 在语言理解任务上的有效性。5.3 基于特征 vs 微调即使将 BERT 作为特征提取器使用冻结参数只取某层输出作为特征性能也显著优于 ELMo说明 BERT 学到的表示本身质量极高。六、总结与思考核心贡献证明了深度双向预训练的巨大价值彻底改变了 NLP 领域的技术路线。统一了预训练 - 微调范式大幅降低了下游任务的适配成本无需针对每个任务设计复杂架构。实证了模型缩放的有效性为后续大语言模型的发展奠定了基础。局限性预训练与微调的分布差异[MASK]标记只在预训练出现微调时不存在尽管有 10%/10% 策略缓解仍存在分布鸿沟。NSP 任务设计粗糙后续研究表明随机抽取负样本过于简单模型可能仅靠主题匹配就能完成任务并未真正学到推理能力。MLM 训练效率较低每步只有 15% 的 token 被预测收敛速度慢于自回归语言模型。历史地位BERT 是 NLP 领域的里程碑式工作它标志着 NLP 正式进入 预训练大模型 微调 的新时代。后续的 RoBERTa、ALBERT、ERNIE、GPT-2/3 等工作均在不同维度上延续和改进了 BERT 的框架。