Skip to content

BERT 与 Encoder-only 模型

BERT(Bidirectional Encoder Representations from Transformers)是 Google 于 2018 年发布的仅编码器(Encoder-only)预训练语言模型,开创了”双向理解”的预训练范式,深刻影响了文本分类、信息检索、命名实体识别等理解类任务。与 GPT 系列的”生成”路线互补,BERT 代表的是”理解”路线。到 2025 年,尽管大语言模型(LLM)席卷了整个 NLP 领域,Encoder-only 架构并没有被淘汰——它依然是嵌入向量生成(embedding)、语义检索、文本分类等任务最高效、最经济的选择,并在 ModernBERT 等新一代模型中迎来了全面现代化升级。前置阅读:Transformer 架构、注意力机制。

BERT = 读完整个句子的完形填空高手。

想象你在做英语完形填空题:你要看空格前后的所有词才能猜出答案。GPT 像一个只能从左往右逐字阅读的人(看到当前词时,后面的词还没看到);而 BERT 像一个能把整句话尽收眼底的人——它一次性看到所有词,因此能充分利用上下文。

  • 双向注意力:每个词都能同时”看到”左边和右边的词,理解更完整。这是 Encoder-only 架构最根本的特性,也是它与 GPT 单向注意力的分水岭。
  • 完形填空预训练(MLM):随机遮住一部分词,让模型猜原词——这就是 BERT 学”理解”的方式。MLM(Masked Language Modeling,掩码语言模型)迫使模型理解词与词之间的关系,而不只是学习”接龙”。
  • CLS token:在句子开头插入一个特殊标记 [CLS](classification,分类标记),经过编码器后,它的向量代表整句话的含义,可直接用于分类。这一设计让 BERT 能很自然地对接下游分类任务。
  • 理解优于生成:BERT 天生不擅长”逐字生成新文本”(它是双向的,生成时无法参考”未来”),但极擅长分类、抽取、匹配等理解任务。
  • 在 LLM 时代仍然重要:即使你用的是 GPT-4 级别的 LLM,你的搜索、推荐、RAG 系统里几乎一定有 Encoder-only 模型在做向量编码——因为对于”把文本变成向量”这件事,编码器模型比生成式 LLM 快十倍以上、便宜十倍以上,效果却足够好。

Transformer 编码器的核心是自注意力(Self-Attention)机制:对输入序列中每个词,计算它与其他所有词的相关性,加权求和得到上下文表示。注意力权重的计算公式为:

Attention(Q,K,V)=softmax ⁣(QKTd)⋅V\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d}}\right) \cdot V

其中 Q(Query,查询)、K(Key,键)、V(Value,值)分别由输入向量乘以三组不同的权重矩阵得到,dd 为 Key 向量的维度(开平方 d\sqrt{d} 是为了防止内积值过大导致 softmax 梯度消失)。直观理解:Q 是”我在找什么”,K 是”我能提供什么”,V 是”我携带的实际信息”。详见注意力机制。

关键在于——编码器中每个位置可以无限制地注意到所有位置(包括右侧的”未来”词),这与 GPT 的因果掩码(causal mask,只能看左侧已出现的内容)形成根本区别。这个差异决定了 BERT 擅长理解已有文本、GPT 擅长逐字生成新文本。

MLM 是 BERT 的核心预训练任务,本质就是深度学习版的完形填空:

  1. 从输入中随机选择 15% 的 token 作为待遮蔽目标。
  2. 其中 80% 替换为 [MASK] 标记,10% 替换为随机词,10% 保持不变。
  3. 模型根据完整上下文预测这些位置的原词。

之所以不只替换为 [MASK](即 80% 而非 100%),是因为微调(fine-tuning,在预训练模型基础上针对特定任务继续训练)阶段的真实数据中没有 [MASK] 标记,混合保留一部分原始词和随机词能让预训练与微调之间的数据分布更接近,减少迁移落差。

MLM vs 自回归预训练的训练效率:MLM 每次只预测 15% 的 token,而 GPT 的自回归方式预测 100% 的 token(每个位置都在预测下一个词)。这意味着同样一条文本,GPT 获得的训练信号比 BERT 多。这也是后续 ELECTRA 等模型改进的方向——它们用”替换词检测”让每个 token 都参与训练,大幅提升了训练效率。

BERT 的原始预训练还包含 NSP(Next Sentence Prediction)任务:给两个句子,判断是否是原文中相邻的句子。[CLS] 的最终表示用于这个二分类。不过后续研究(尤其是 RoBERTa)发现 NSP 作用有限甚至有害,后来大多被移除。现代 Encoder-only 模型已基本不用 NSP。

BERT 在每个输入序列开头插入一个特殊的 [CLS](classification)token。经过多层编码器后,[CLS] 位置的隐藏向量聚合了整句话的信息,可直接接一个分类头(一个线性层加 softmax)来做情感分析、文本分类等任务。对于双句任务(如问答匹配),用 [SEP](separator,分隔符)标记分隔两个句子。

但需注意:直接使用 CLS 向量做语义相似度效果并不理想(详见下方实践要点)。现代做法通常对所有 token 向量做平均池化(mean pooling),或使用经过对比学习(contrastive learning,通过拉近相似样本、推远不同样本来学习表示)训练的专用句向量模型。

BERT 原版使用可学习位置嵌入(learnable positional embedding)——为每个位置训练一个固定向量加到 token 嵌入上。这种方式的最大局限是序列长度固定:BERT-base 最大只能处理 512 个 token,超出就需要截断。

2024 年发布的 ModernBERT 等新一代编码器改用了 RoPE(Rotary Position Embedding,旋转位置编码)——通过对 Q、K 向量做旋转变换来编码相对位置关系。RoPE 的优势在于天然支持长度外推(训练在短序列上,推理时可以处理更长的序列),这使得现代编码器可以处理 8192 甚至更长的 token 序列,远超 BERT 原版的 512 上限。这也是 Encoder-only 架构跟上了 LLM 时代需求的重要标志。

BERT 之后涌现了一批改进版,沿着不同方向优化:

模型发布核心改进
RoBERTaFacebook 2019移除 NSP、动态掩码、更大数据量、更大批量——证明 BERT 欠训练
ALBERTGoogle 2019因式分解嵌入参数 + 跨层参数共享,大幅减少参数量
ELECTRAGoogle 2020用”替换词检测”替代 MLM,生成器-判别器架构,训练效率提升约 10 倍
DeBERTaMicrosoft 2021解耦注意力(分离内容和位置编码)+ 增强型掩码解码器
DeBERTa-v3Microsoft 2021引入 ELECTRA 式的替换词检测 + 新型梯度离散 softmax,效果进一步提升
RoBERTa-wwm哈工大 2019全词掩码(Whole Word Masking),中文场景效果更好
ModernBERTAnswer.AI + HuggingFace 2024全面现代化:RoPE 位置编码、Flash Attention 2、Unpadding、8192 token 上下文、代码训练数据
Nomic-EmbedNomic AI 2024超长上下文(8192 token)+ 对比学习训练的高质量嵌入模型

ModernBERT 的意义:2024 年底发布的 ModernBERT 是 Encoder-only 架构近五年来最大的一次现代化升级。它将 LLM 时代积累的几乎所有效率技术——Flash Attention 2(一种优化注意力计算速度的 GPU 算法)、RoPE、Unpadding(将不同长度的序列紧凑排列以避免浪费算力在 padding 上)、分组查询注意力(GQA)——全部集成到 Encoder-only 架构中,使得新一代编码器在保持理解类任务优势的同时,推理速度和上下文长度都达到了现代标准。

维度BERT(编码器)GPT(解码器)
注意力方向双向,看所有词单向,只看左侧
预训练任务掩码语言模型(完形填空)自回归语言模型(接龙生成)
擅长任务分类、抽取、匹配、检索、嵌入向量生成、对话、续写
生成能力弱(非自回归设计)强(天生自回归)
推理速度快(一次前向传播即输出全部向量)慢(需逐 token 自回归生成)
典型参数量110M~440M(轻量级)7B~千亿级(重量级)
使用成本极低(CPU 可推理)高(需要 GPU 集群)

为什么 LLM 时代还需要 Encoder-only? 当你用 ChatGPT 对话时,背后的系统需要在海量文档中找到相关内容——这个检索步骤几乎不会用 LLM 本身来做(太慢太贵),而是用 Encoder-only 模型把文档和查询都编码成向量,再用向量相似度快速检索。这就是 RAG 系统的标准架构,也是 Encoder-only 模型在 LLM 时代的核心生态位。

基础:BERT 完形填空与句向量提取

Section titled “基础:BERT 完形填空与句向量提取”
from transformers import pipeline, AutoModel, AutoTokenizer
import torch
# 一、BERT 招牌能力:完形填空(掩码语言模型 MLM)
fill = pipeline("fill-mask", model="bert-base-chinese")
for r in fill("巴黎是[MASK]国的首都。"):
print(f"{r['token_str']}: {r['score']:.3f}") # 预测"法"
# 二、提取 CLS 向量作为整句表示(可用于分类/检索)
tok = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModel.from_pretrained("bert-base-chinese")
inputs = tok("深度学习改变了人工智能", return_tensors="pt")
with torch.no_grad():
out = model(**inputs)
# 位置 0 即 CLS,其向量代表整句话
cls_vec = out.last_hidden_state[0, 0]
print("CLS 向量维度:", cls_vec.shape) # torch.Size([768])
# 三、平均池化(mean pooling)——通常比 CLS 效果更好
import torch
token_embeddings = out.last_hidden_state # (1, seq_len, 768)
mask = inputs["attention_mask"].unsqueeze(-1) # (1, seq_len, 1)
sum_vec = torch.sum(token_embeddings * mask, dim=1) # 对非 padding 位置求和
count = torch.clamp(mask.sum(dim=1), min=1e-9) # 有效 token 数量
mean_vec = sum_vec / count # (1, 768)
print("平均池化向量维度:", mean_vec.shape)

进阶:文本分类微调(fine-tuning)

Section titled “进阶:文本分类微调(fine-tuning)”
import torch
from torch.utils.data import DataLoader
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from torch.optim import AdamW
# 用 BERT 做情感分类的典型流程
model_name = "bert-base-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# num_labels=2:正面/负面二分类
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
optimizer = AdamW(model.parameters(), lr=2e-5) # 微调学习率要小(2e-5 ~ 5e-5)
# 训练循环(简化版)
texts = ["这部电影太好看了!", "垃圾产品,千万别买。"]
labels = torch.tensor([1, 0]) # 1=正面, 0=负面
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
model.train()
for epoch in range(3):
outputs = model(**inputs, labels=labels)
loss = outputs.loss
loss.backward()
optimizer.step()
optimizer.zero_grad()
print(f"Epoch {epoch}: loss = {loss.item():.4f}")

现代:用 sentence-transformers 做高质量语义检索

Section titled “现代:用 sentence-transformers 做高质量语义检索”
from sentence_transformers import SentenceTransformer
import numpy as np
# 2024-2025 推荐的嵌入模型(比原始 BERT 检索效果大幅提升)
model = SentenceTransformer("BAAI/bge-small-zh-v1.5") # 智源 BGE 系列,中文检索效果好
# 把文本编码为语义向量(embedding:把文本映射为固定维度的高维向量,使语义相近的文本向量也相近)
documents = [
"BERT 是双向编码器预训练模型",
"GPT 采用自回归方式逐 token 生成文本",
"今天天气真不错,适合出门散步",
]
doc_vectors = model.encode(documents) # (3, 512)
# 查询检索
query = "什么是编码器模型?"
query_vec = model.encode([query]) # (1, 512)
# 用余弦相似度找最相关的文档
similarities = model.similarity(query_vec, doc_vectors)[0] # (3,)
best_idx = np.argmax(similarities)
print(f"最相关文档:{documents[best_idx]}") # 预期命中第 0 条
print(f"相似度分数:{similarities[best_idx]:.4f}")
  • 理解类任务首选 BERT 系列:文本分类、命名实体识别(NER,从文本中识别人名、地名、机构名等实体)、问答、语义相似度等任务,BERT 系列至今仍是强基线,尤其在小数据场景下远优于从零训练。
  • 中文任务注意分词:bert-base-chinese 基于字级别(character-level)切分,每个汉字是一个 token;而 bert-wwm 等全词掩码变体在词级别效果更好,需根据任务选择。
  • CLS 不一定是最优的句向量:直接用 CLS 向量做语义检索效果一般,更好的做法是对所有 token 向量做平均池化(mean pooling),或使用经过对比学习训练的句向量模型(如 SimCSE、BGE、GTE)。
  • ELECTRA 训练效率更高:如果算力有限需要从头预训练自定义模型,ELECTRA 在同等效果下所需算力约为 BERT 的十分之一,是性价比之选。
  • 生成任务别用 BERT:BERT 不是为自回归生成设计的;需要文本生成请用 GPT、LLaMA 等 decoder-only 模型。详见语言模型演进。
  • 长文本处理:BERT 原版上限 512 token。处理长文本可以用滑动窗口(sliding window)分段编码后拼接,或直接选用支持长上下文的新一代编码器(如 ModernBERT、Nomic-Embed 支持 8192 token)。
  • 量化部署降本:生产环境中,可以用 INT8 或 FP8 量化(quantization:降低模型参数精度以减少显存和加速推理)将 BERT 模型压缩 4 倍,几乎不损失精度。配合 ONNX Runtime 或 TensorRT 可以获得极低的推理延迟(毫秒级)。
  • 选模型的经验法则:如果只需要做文本分类或 NER,DeBERTa-v3-base 或 RoBERTa-wwm 是可靠选择;如果需要语义检索/嵌入向量,选 BGE、GTE、E5 等专门训练过的嵌入模型;如果需要长文本或追求极致效率,考虑 ModernBERT。
  • 嵌入模型的维度选择:现代嵌入模型如 BGE-M3 支持 Matryoshka Representation Learning(MRL,套娃表示学习)——模型输出的高维向量可以安全截断为低维(如从 1024 维截断到 256 维)而不大幅损失精度,这在存储海量文档向量时能显著节省成本。
  • 搜索引擎语义匹配:Google 搜索在 2019 年引入 BERT 改进搜索结果的相关性理解,让搜索从”关键词匹配”走向”语义匹配”。到 2025 年,几乎所有主流搜索引擎都使用 Encoder-only 模型做查询理解。
  • 文本审核与情感分析:电商平台用 BERT 分类评论情感倾向、检测违规内容,比传统机器学习方法准确率显著提升,且推理成本低到可以在普通服务器上实时处理。
  • 信息抽取与命名实体识别:医疗、法律等领域用 BERT 从非结构化文本中抽取实体和关系,构建知识图谱(knowledge graph,以图结构存储实体及其关系的数据库)。
  • 语义检索与 RAG:基于 BERT 的编码器(如 DPR、SimCSE、BGE)是嵌入模型和RAG 检索增强生成的核心组件。这是 2025 年 Encoder-only 模型最重要的应用场景——没有编码器模型做高效检索,RAG 系统的延迟和成本将不可接受。
  • 推荐系统特征提取:用 BERT 编码用户评论、商品描述等文本特征,作为推荐模型的输入。
  • 抄袭检测与文本相似度:学术界和教育领域用 BERT 向量计算文档间相似度,检测抄袭或重复内容。
  • 意图分类(Intent Classification):对话系统中,用 BERT 分类用户输入的意图(如”订机票” vs “查天气”),再路由到不同处理模块。相比用 LLM 做分类,BERT 方案延迟更低、成本更可控。
类库语言说明
transformersPythonHuggingFace 出品,提供 BERT/RoBERTa/DeBERTa/ModernBERT 等全系模型的预训练权重与推理接口
sentence-transformersPython专为句向量设计,基于 BERT 等模型生成高质量句子嵌入(sentence embedding,把整句话编码为一个向量),支持语义搜索
FlagEmbeddingPython智源 BGE 系列嵌入模型,中文检索效果领先的 BERT 变体,支持 MRL 套娃维度截断
paddlenlpPython百度飞桨 NLP 工具包,提供 ERNIE 等中文优化的 BERT 变体
HanLPJava/Python哈工大 NLP 工具包,集成了 wwm 等中文 BERT 变体
ONNX RuntimePython/C++跨平台推理引擎,可把 BERT 导出为 ONNX 格式后获得 2-5 倍推理加速
OptimumPythonHuggingFace 的推理优化库,一行代码即可将 transformers 模型转为 ONNX/TensorRT/OpenVINO 格式加速
术语英文解释
掩码语言模型MLM, Masked Language Modeling随机遮蔽部分 token 让模型预测原词,BERT 的核心预训练任务
双向注意力Bidirectional Attention每个位置可同时关注序列中所有位置(含右侧未来词)
CLS 标记CLS Token句首特殊标记,其最终隐藏向量用于聚合整句信息做分类
SEP 标记SEP Token句子分隔标记,用于区分输入中的两个句子
下一句预测NSP, Next Sentence Prediction判断两句话是否原文相邻的二分类预训练任务
全词掩码Whole Word Masking以整词为单位遮蔽而非以字为单位,避免信息泄漏
解耦注意力Disentangled AttentionDeBERTa 的创新:将内容与位置编码分离计算注意力
编码器EncoderTransformer 中负责双向编码输入表示的部分(对应解码器 Decoder)
平均池化Mean Pooling对所有 token 的隐藏向量取平均,作为整句表示,通常比 CLS 效果更好
嵌入向量Embedding将文本映射为固定维度的高维向量,使语义相近的文本向量距离也近
对比学习Contrastive Learning通过拉近相似样本、推远不同样本来学习表示的训练方法
旋转位置编码RoPE, Rotary Position Embedding通过旋转变换编码相对位置,支持长度外推,现代编码器标配
套娃表示学习MRL, Matryoshka Representation Learning训练使高维向量可安全截断为低维,兼顾精度与存储成本
分组查询注意力GQA, Grouped-Query Attention多个查询头共享一组 KV 头,减少推理时的 KV cache 显存占用
UnpaddingUnpacking / Unpadding将不同长度序列紧凑排列以消除 padding 浪费的优化技术
  • Devlin et al.,「BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding」(NAACL 2019):BERT 原始论文,提出 MLM + NSP 预训练范式,是 NLP 预训练的里程碑。
  • Liu et al.,「RoBERTa: A Robustly Optimized BERT Pretraining Approach」(2019):Facebook 论文,证明 BERT 欠训练后通过更大数据和批量大幅刷新纪录。
  • Clark et al.,「ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators」(ICLR 2020):提出替换词检测任务,训练效率大幅提升。
  • He et al.,「DeBERTa: Decoding-enhanced BERT with Disentangled Attention」(ICLR 2021):微软提出的解耦注意力机制,在多项基准上超越 RoBERTa。
  • Gao et al.,「SimCSE: Simple Contrastive Learning of Sentence Embeddings」(EMNLP 2021):用对比学习大幅提升 BERT 句向量质量,是语义检索的重要工作。
  • Warner et al.,「Smarter, Better, Faster, Longer: A Modern Bidirectional Encoder for Fast, Memory-Efficient, and Long Context Inference」(2024):ModernBERT 论文,将 RoPE、Flash Attention 2、GQA、Unpadding 等现代技术集成到 Encoder-only 架构,标志着编码器模型的全面现代化。
  • Chen et al.,「BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings Through Self-Knowledge Distillation」(2024):智源 BGE-M3 嵌入模型,同时支持多语言、多种检索功能(稠密/稀疏/多向量)和多粒度(最大 8192 token),是 2024-2025 年 RAG 系统的热门选择。
  • Kusupati et al.,「Matryoshka Representation Learning」(NeurIPS 2022):提出套娃表示学习,使嵌入向量可在不同维度灵活截断,已被 BGE-M3、Nomic-Embed 等主流嵌入模型采纳。