作者的话 :在前面的文章中,我们学习了Transformer架构。2018年,Google发布了BERT(Bidirectional Encoder Representations from Transformers),开启了预训练语言模型的新时代。BERT通过双向编码器和创新的预训练任务,在多项NLP任务上取得了突破性进展。本文将深入讲解BERT的原理、预训练、微调和应用,帮助你理解这一里程碑式的模型!
一、BERT概述
1.1 什么是BERT?
BERT是Google在2018年10月提出的预训练语言模型,全称为Bidirectional Encoder Representations from Transformers。
核心特点:
| 特点 | 说明 | 优势 |
|---|---|---|
| 双向编码 | 同时考虑左右上下文 | 理解更全面 |
| Transformer架构 | 使用多层Transformer Encoder | 并行计算,长距离依赖 |
| 预训练+微调 | 先在大规模语料预训练,再针对任务微调 | 迁移学习能力强 |
| 无监督预训练 | 无需人工标注数据 | 可利用海量文本 |
| 上下文相关 | 同一词在不同上下文有不同表示 | 语义理解更准确 |
1.2 BERT的里程碑意义
时间线:
| 时间 | 模型 | 核心贡献 |
|---|---|---|
| 2018年10月 | BERT Base/Large发布 | 11项NLP任务SOTA,开启预训练时代 |
| 2019年 | RoBERTa | 优化训练策略,移除NSP任务 |
| 2019年 | ALBERT | 参数共享+矩阵分解,大幅减少参数量 |
| 2019年 | DistilBERT | 知识蒸馏,模型压缩40% |
| 2019年 | ELECTRA | 判别式预训练,样本效率更高 |
| 2019年 | SpanBERT | span-level mask,问答任务提升 |
| 2020年 | TinyBERT | 更极致的蒸馏,6层BERT仅4%大小 |
| 2021年 | DeBERTa | 解耦注意力机制,SuperGLUE超越人类 |
1.3 模型对比
| 特性 | Word2Vec | ELMo | GPT | BERT |
|---|---|---|---|---|
| 架构 | 浅层神经网络 | 双向LSTM | Transformer Decoder | Transformer Encoder |
| 上下文 | 静态 | 动态但独立 | 单向(左到右) | 双向(左右同时) |
| 层数 | 1-2层 | 2层BiLSTM | 12层 | 12/24层 |
| 参数量 | 数亿 | 9400万 | 1.17亿 | 1.1亿/3.4亿 |
| 主要应用 | 词嵌入 | 特征提取 | 文本生成 | 文本理解 |
二、BERT架构详解
2.1 模型规模
| 参数 | BERT-Base | BERT-Large |
|---|---|---|
| 层数(L) | 12 | 24 |
| 隐藏层维度(H) | 768 | 1024 |
| 注意力头数(A) | 12 | 16 |
| 参数量 | 1.1亿 | 3.4亿 |
| 词汇表大小 | 30,522 | 30,522 |
| 最大序列长度 | 512 | 512 |
2.2 输入表示
BERT的输入由三部分组成:Token Embeddings + Segment Embeddings + Position Embeddings
| 特殊标记 | 符号 | 作用 |
|---|---|---|
| [CLS] | 101 | 分类标记,用于句子级任务 |
| [SEP] | 102 | 分隔标记,分隔句子或标记结尾 |
| [MASK] | 103 | 掩码标记,用于MLM任务 |
| [PAD] | 0 | 填充标记,用于补齐序列 |
三、预训练任务
3.1 Masked Language Model(MLM)
随机mask输入序列中的部分token,让模型预测被mask的token。
| 策略 | 概率 | 目的 |
|---|---|---|
| 替换为[MASK] | 80% | 主要训练目标 |
| 替换为随机词 | 10% | 防止模型只学习[MASK] |
| 保持不变 | 10% | 微调时保持一致 |
3.2 Next Sentence Prediction(NSP)
| 标签 | 概率 | 构造方式 |
|---|---|---|
| IsNext | 50% | 真实的连续句子 |
| NotNext | 50% | 随机采样句子 |
四、微调方法
4.1 不同任务的输入输出
| 任务类型 | 输入格式 | 输出 | 示例 |
|---|---|---|---|
| 文本分类 | [CLS] 文本 [SEP] | [CLS]的表示 | 情感分析 |
| 句子对分类 | [CLS] A [SEP] B [SEP] | [CLS]的表示 | 语义相似度 |
| 问答 | [CLS] 问题 [SEP] 段落 [SEP] | 开始/结束位置 | SQuAD |
| 序列标注 | [CLS] 文本 [SEP] | 每个token的标签 | NER |
五、BERT变体
| 模型 | 改进点 | 特点 |
|---|---|---|
| RoBERTa | 训练策略优化 | 动态mask,更大batch |
| ALBERT | 参数共享 | 减少参数量 |
| DistilBERT | 知识蒸馏 | 保留97%性能,减少40%参数 |
| ELECTRA | 判别式预训练 | 替换token检测 |
| SpanBERT | span-level mask | 更适合问答任务 |
六、代码实现
使用Hugging Face的transformers库可以快速加载和使用BERT。
from transformers import BertTokenizer, BertModel
# 加载分词器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 输入文本
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors='pt')
# 前向传播
outputs = model(**inputs)
七、应用场景
| 任务 | 数据集 | BERT效果 |
|---|---|---|
| 情感分析 | SST-2 | 93.5% |
| 自然语言推理 | MNLI | 86.7% |
| 问答 | SQuAD 1.1 | F1: 93.2 |
| 命名实体识别 | CoNLL-2003 | F1: 92.8 |
八、总结与学习建议
8.1 核心要点
- BERT使用双向Transformer Encoder
- MLM和NSP两个预训练任务
- 预训练+微调的范式
- 在多项NLP任务上取得SOTA
8.2 学习路径
Transformer → BERT → RoBERTa → 领域专用模型
下一篇预告:【第25篇】GPT模型详解:生成式预训练的语言模型
本文为系列第24篇,详细讲解了BERT模型。有任何问题欢迎在评论区交流!
标签:BERT、预训练模型、Transformer、自然语言处理、深度学习、NLP、人工智能