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,按以下规则处理:
    1. 80% 替换为 [MASK] (如 “我 [MASK] 深度学习”);
    2. 10% 替换为随机 token(如 “我玩深度学习”);
    3. 10% 保持原 token 不变(如 “我爱深度学习”)。
  • 目的:避免模型仅记住 [MASK] 与上下文的关联,强制模型学习真正的语言特征。
(2)下一句预测(Next Sentence Prediction, NSP)

核心思想:让模型判断两个句子是否为连续的上下文,学习句间关系。

  • 操作方式:
    1. 50% 的样本选择真实的连续句对(标签为 “正”);
    2. 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 场景:

  1. 智能问答:如客服机器人、知识库问答(基于 SQuAD 数据集微调);
  2. 文本分类:情感分析、内容审核、意图识别;
  3. 信息提取:命名实体识别、关系抽取、事件抽取;
  4. 机器翻译:结合解码器(如 Transformer),提升翻译质量;
  5. 推荐系统:融入文本语义特征,提升推荐的精准度(如商品标题、用户评论)。

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 专属固定流程)

  1. 用 BERT 配套的 Tokenizer 分词器 处理文本(自动做分词 + 补位 + 截断);
  2. 生成 BERT 必须的 3 类输入:input_ids(分词 id) + token_type_ids(分句标识) + attention_mask(掩码,区分有效文本和填充位);
  3. 固定规则:文本开头加[CLS],句子结尾 / 分句加[SEP],长度统一截断 / 补到 512。

步骤 3:模型前传(获取文本特征)

把预处理好的输入喂给 BERT 模型,模型会输出所有 token 的上下文语义向量(维度 768),核心取 2 类特征用:

  • 文本级任务(分类 / 情感):直接取 [CLS]位置的向量,就是整段文本的「语义总特征」;
  • 字词级任务(NER / 问答):取 对应 token 位置的向量,就是单个字 / 词的上下文特征。

步骤 4:任务微调(核心!仅这一步是自己训练)

在 BERT 输出的特征上,只加一层简单的全连接层 / 分类层,用自己的少量业务标注数据训练:

  • 训练特点:只更新「新增的分类层」权重,BERT 主体权重可以冻结 / 少量更新,训练快、数据少、不易过拟合
  • 适配所有任务:文本分类 / 情感分析 / 相似度匹配 / 命名实体识别 / 问答,仅这一层的结构微调,BERT 主体完全不变。

步骤 5:推理预测(训练完直接用)

把新的待预测文本,按「步骤 2」同样预处理,喂给微调好的完整模型,直接输出结果(分类标签 / 相似度得分 / 实体位置等)。


✅ 三、BERT 核心关键参数(极简必记,最常用)

不用记复杂的,记住这几个最核心、高频用到的参数就够了,全是bert-base-chinese的默认值:

  1. Encoder 层数:12 层
  2. 注意力头数:12 头
  3. 隐藏层维度:768(输出的向量维度固定 768)
  4. 最大文本长度:512(超过会截断,不足补 0)
  5. 参数量:≈110M(轻量,普通显卡就能跑)

✅ 四、核心补充(3 个极简知识点,必懂)

  1. BERT 的核心优势:双向编码,同时看一个词的「左 + 右上下文」,语义理解更准;
  2. BERT 的输出特点:动态向量,同一个词在不同语境下向量不同(比如 “苹果手机” 和 “吃苹果” 的「苹果」向量不一样);
  3. 工具选型:99% 用 Hugging Face Transformers 库,一行加载模型 + 分词器,无需手写底层逻辑,新手首选。

✅ 极简总结(一句话流程)

选预训练 BERT 模型 → Tokenizer 处理文本得输入 → 模型出语义特征 → 加简单层微调训练 → 预测新文本。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐