BERT——预训练语言模型
BERT 是由 Google 于 2018 年提出的,基于 Transformer 的部分构建,核心创新是采用,彻底改变了自然语言处理(NLP)的范式,成为后续众多大模型的基础框架。简单来说:BERT 像一个 “语言学霸”,先通过海量文本数据进行(学习通用的语言知识,如语义、语法、上下文关联),再通过(在具体任务上适配少量标注数据),就能在各类 NLP 任务(如文本分类、问答、命名实体识别)上达到
BERT(Bidirectional Encoder Representations from Transformers)
BERT 是由 Google 于 2018 年提出的预训练语言模型,基于 Transformer 的编码器部分构建,核心创新是采用双向上下文建模,彻底改变了自然语言处理(NLP)的范式,成为后续众多大模型的基础框架。
简单来说:BERT 像一个 “语言学霸”,先通过海量文本数据进行预训练(学习通用的语言知识,如语义、语法、上下文关联),再通过微调(在具体任务上适配少量标注数据),就能在各类 NLP 任务(如文本分类、问答、命名实体识别)上达到当时的最优效果。
一、BERT 的核心突破
在 BERT 出现前,主流预训练模型(如 ELMo、GPT)存在明显局限:
- ELMo:基于 RNN,双向建模但特征提取能力弱,且训练效率低;
- GPT:基于 Transformer 解码器,仅能做单向上下文建模(从左到右),无法利用右侧上下文信息。
BERT 的核心突破是:首次在预训练阶段实现了真正的双向上下文建模,让模型能同时利用一个词的左侧和右侧上下文信息,更贴合人类理解语言的方式。
二、BERT 的核心原理
1. 模型架构:基于 Transformer Encoder
BERT 完全由 Transformer 的编码器堆叠而成(解码器仅用于生成式任务,BERT 专注于理解式任务),核心组件包括:
- 多头自注意力(Multi-Head Self-Attention):实现双向上下文关联,捕捉不同位置词之间的依赖关系;
- 前馈神经网络(FFN):对注意力输出做非线性变换,提取更复杂的特征;
- 残差连接 + 层归一化:缓解深度网络的梯度消失问题,稳定训练(这也是你之前问的残差连接的经典应用)。
BERT 提供两个基础版本,区别仅在于网络层数和注意力头数:
| 模型版本 | Transformer 层数 | 注意力头数 | 隐藏层维度 | 参数量 |
|---|---|---|---|---|
| BERT-Base | 12 | 12 | 768 | ~110M |
| BERT-Large | 24 | 16 | 1024 | ~340M |
2. 输入表示:统一的文本编码方式
BERT 设计了统一的输入格式,能处理单句和句对(如问答的问题 + 上下文、文本匹配的两个句子)任务,输入由三部分拼接而成,最终输出每个 token 的向量表示:Input Embedding=Token Embedding+Segment Embedding+Position Embedding
- Token Embedding:词 / 子词的向量表示,BERT 采用WordPiece分词(将未登录词拆分为子词,如 “unhappiness”→“un”+“happiness”),解决生僻词问题;
- Segment Embedding:区分句对中的两个句子(如句子 A 标为 0,句子 B 标为 1),单句任务则全部标为 0;
- Position Embedding:位置编码,由于 Transformer 是并行计算,无法感知词的顺序,需手动加入位置信息(BERT 采用可学习的位置编码,而非固定公式)。
特殊 Token:输入开头必须加 token( 클래스),句对之间用 token( 분리)分隔,结尾可加 token(可选),例如:
输入句对:“我爱深度学习。BERT 是经典模型。”分词后:
我 爱 深度 学习 。BERT 是 经典 模型 。
3. 预训练任务:自监督学习的两大核心
BERT 的预训练是自监督学习(无需人工标注),通过两个精心设计的任务,让模型从海量无标注文本中学习语言知识:
(1)掩码语言模型(Masked Language Model, MLM)
核心思想:随机掩盖输入中的部分 token,让模型预测被掩盖的 token,实现双向上下文建模。
- 操作方式:随机选择 15% 的 token,按以下规则处理:
- 80% 替换为
[MASK](如 “我 [MASK] 深度学习”); - 10% 替换为随机 token(如 “我玩深度学习”);
- 10% 保持原 token 不变(如 “我爱深度学习”)。
- 80% 替换为
- 目的:避免模型仅记住
[MASK]与上下文的关联,强制模型学习真正的语言特征。
(2)下一句预测(Next Sentence Prediction, NSP)
核心思想:让模型判断两个句子是否为连续的上下文,学习句间关系。
- 操作方式:
- 50% 的样本选择真实的连续句对(标签为 “正”);
- 50% 的样本选择随机的两个句子(标签为 “负”)。
- 目的:适配问答、文本匹配等需要理解句间关系的任务。
4. 微调(Fine-Tuning):适配具体任务
预训练完成后,BERT 已学到通用的语言表示,针对不同 NLP 任务,只需在 BERT 顶部添加简单的任务头,用少量标注数据微调即可,实现端到端训练。
经典任务的微调方式:
| 任务类型 | 任务示例 | 微调方式 |
|---|---|---|
| 文本分类 | 情感分析、垃圾邮件检测 | 取 token 的输出向量,接全连接层做分类 |
| 句对匹配 | 自然语言推理、语义相似度 | 取 token 的输出向量,接全连接层判断关系 |
| 问答(QA) | SQuAD | 取每个 token 的输出向量,接两个全连接层,分别预测答案的起始和结束位置 |
| 命名实体识别(NER) | 提取人名、地名、机构名 | 取每个 token 的输出向量,接全连接层做序列标注 |
三、BERT 的 PyTorch 实现(极简版)
基于 transformers 库(Hugging Face),可快速实现 BERT 的加载、输入编码和特征提取,这也是实际开发中最常用的方式。
1. 安装依赖
bash
运行
pip install transformers torch
2. 核心代码实现
python
运行
from transformers import BertTokenizer, BertModel
import torch
# 1. 加载预训练的BERT分词器和模型(BERT-Base-Chinese,适用于中文)
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')
# 2. 准备输入文本(单句/句对)
text = "我爱深度学习,BERT是经典的预训练模型。"
# 3. 对输入进行编码(分词、生成输入ID、注意力掩码、段ID)
# return_tensors='pt' 表示返回PyTorch张量
inputs = tokenizer(
text,
return_tensors='pt', # 返回PyTorch张量
padding=True, # 补全到最大长度
truncation=True, # 超过最大长度则截断
max_length=512 # BERT的最大输入长度为512
)
# 输入内容说明:
# input_ids:token的数字编码
# attention_mask:掩码,标记有效token(0表示填充,1表示有效)
# token_type_ids:段ID,单句全为0
print("Input IDs:", inputs['input_ids'])
print("Attention Mask:", inputs['attention_mask'])
print("Token Type IDs:", inputs['token_type_ids'])
# 4. 前向传播,获取BERT的输出
model.eval() # 推理模式,关闭Dropout
with torch.no_grad(): # 禁用梯度计算,节省内存
outputs = model(**inputs)
# 5. 解析输出
# last_hidden_state:最后一层的隐藏状态,形状为 [batch_size, seq_len, hidden_size]
last_hidden_state = outputs.last_hidden_state
# pooler_output:`token` 的输出,经过池化和全连接层,形状为 [batch_size, hidden_size]
pooler_output = outputs.pooler_output
print("最后一层隐藏状态形状:", last_hidden_state.shape) # torch.Size([1, 16, 768])
print("token输出形状:", pooler_output.shape) # torch.Size([1, 768])
四、BERT 的局限性与后续发展
1. 主要局限性
- 生成能力弱:仅基于编码器,无法做文本生成(如机器翻译、摘要),需结合解码器(如 GPT);
- 输入长度限制:最大输入长度为 512 个 token,无法处理长文本(如万字文档);
- 计算成本高:BERT-Large 参数量达 340M,训练和微调需要较高的硬件资源;
- NSP 任务争议:后续研究发现,NSP 任务对部分任务的提升有限,甚至可能带来负面影响,因此后续模型(如 RoBERTa)取消了 NSP。
2. 经典改进模型
BERT 开启了预训练语言模型的时代,后续涌现出大量改进版本,解决其局限性:
- RoBERTa:取消 NSP,增大批次大小,训练更长时间,性能全面超越 BERT;
- ALBERT:通过参数共享和因式分解,大幅减少参数量,提升训练效率;
- SpanBERT:改进 MLM 任务,预测连续的 token 片段,增强对长距离依赖的捕捉;
- Longformer:引入滑动窗口注意力,支持超长文本(千级以上 token);
- ERNIE:百度提出,融入实体、短语等知识,增强中文语义理解能力。
五、BERT 的应用场景
BERT 作为通用的语言理解模型,已广泛应用于各类 NLP 场景:
- 智能问答:如客服机器人、知识库问答(基于 SQuAD 数据集微调);
- 文本分类:情感分析、内容审核、意图识别;
- 信息提取:命名实体识别、关系抽取、事件抽取;
- 机器翻译:结合解码器(如 Transformer),提升翻译质量;
- 推荐系统:融入文本语义特征,提升推荐的精准度(如商品标题、用户评论)。
BERT 模型 完整使用流程
✅ 一、BERT 核心一句话总结
BERT 是基于双向 Transformer 编码器的预训练语言模型,核心能力:结合上下文理解文本语义,输出「动态词向量」,解决了传统词向量(如 Word2Vec)一词多义的问题,NLP 任务(分类 / 匹配 / NER / 问答)通用且效果优异。
✅ 二、BERT 完整使用流程(共 5 步,极简版,所有场景通用)
✔ 核心前提:BERT 的使用遵循【预训练 + 微调】范式,99% 的人只用做「微调」,谷歌已经把最耗时的预训练做好了!
步骤 1:选模型 + 加载预训练权重(现成即用)
不用自己训练,直接用封装好的成熟模型,中文任务首选:bert-base-chinese(110M 参数,平衡速度和效果),这是最常用的版本。
补充:大任务可选
bert-large-chinese(340M 参数),轻量化需求可选蒸馏版distilbert-base-chinese
步骤 2:文本预处理(BERT 专属固定流程)
- 用 BERT 配套的 Tokenizer 分词器 处理文本(自动做分词 + 补位 + 截断);
- 生成 BERT 必须的 3 类输入:
input_ids(分词 id) +token_type_ids(分句标识) +attention_mask(掩码,区分有效文本和填充位); - 固定规则:文本开头加
[CLS],句子结尾 / 分句加[SEP],长度统一截断 / 补到 512。
步骤 3:模型前传(获取文本特征)
把预处理好的输入喂给 BERT 模型,模型会输出所有 token 的上下文语义向量(维度 768),核心取 2 类特征用:
- 文本级任务(分类 / 情感):直接取
[CLS]位置的向量,就是整段文本的「语义总特征」; - 字词级任务(NER / 问答):取 对应 token 位置的向量,就是单个字 / 词的上下文特征。
步骤 4:任务微调(核心!仅这一步是自己训练)
在 BERT 输出的特征上,只加一层简单的全连接层 / 分类层,用自己的少量业务标注数据训练:
- 训练特点:只更新「新增的分类层」权重,BERT 主体权重可以冻结 / 少量更新,训练快、数据少、不易过拟合;
- 适配所有任务:文本分类 / 情感分析 / 相似度匹配 / 命名实体识别 / 问答,仅这一层的结构微调,BERT 主体完全不变。
步骤 5:推理预测(训练完直接用)
把新的待预测文本,按「步骤 2」同样预处理,喂给微调好的完整模型,直接输出结果(分类标签 / 相似度得分 / 实体位置等)。
✅ 三、BERT 核心关键参数(极简必记,最常用)
不用记复杂的,记住这几个最核心、高频用到的参数就够了,全是bert-base-chinese的默认值:
- Encoder 层数:12 层
- 注意力头数:12 头
- 隐藏层维度:768(输出的向量维度固定 768)
- 最大文本长度:512(超过会截断,不足补 0)
- 参数量:≈110M(轻量,普通显卡就能跑)
✅ 四、核心补充(3 个极简知识点,必懂)
- BERT 的核心优势:双向编码,同时看一个词的「左 + 右上下文」,语义理解更准;
- BERT 的输出特点:动态向量,同一个词在不同语境下向量不同(比如 “苹果手机” 和 “吃苹果” 的「苹果」向量不一样);
- 工具选型:99% 用 Hugging Face Transformers 库,一行加载模型 + 分词器,无需手写底层逻辑,新手首选。
✅ 极简总结(一句话流程)
选预训练 BERT 模型 → Tokenizer 处理文本得输入 → 模型出语义特征 → 加简单层微调训练 → 预测新文本。
更多推荐


所有评论(0)