BERT架构详解

发布于:2025-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

BERT架构详解

BERT(Bidirectional Encoder Representations from Transformers)是由Google提出的一种基于Transformer编码器的预训练语言模型,其强大的双向上下文建模能力,使它成为理解类NLP任务中的核心模型。


BERT架构适合哪些任务?

BERT 在以下任务中表现尤为出色:

  • 文本分类任务:如情感分析、舆情判断、垃圾信息识别等,BERT 能够通过 [CLS] token 提取整段文本的语义表示,适配分类头。
  • 问答任务:如 SQuAD 数据集中的抽取式问答,BERT 可以精确预测答案的起始和结束位置。
  • 句子对建模任务:如自然语言推理(NLI)、语义匹配、对话系统响应选择,BERT 的 [CLS] 句子1 [SEP] 句子2 输入格式和 token_type_ids 机制,使得它非常适合建模句间关系。
  • 序列标注任务:如命名实体识别(NER)、词性标注、依存句法分析,每个 token 的输出都包含上下文信息。

但 BERT 并不适合生成类任务(如文本生成、翻译、摘要),因为它没有解码器结构和自回归机制。此类任务通常更适合 GPT、T5 等模型。


BERT整体架构

在这里插入图片描述

从上面的架构图中可以看到, 宏观上BERT分三个主要模块.:

  1. 最底层黄色标记的Embedding模块
  2. 中间层蓝色标记的Transformer编码器模块
  3. 最上层绿色标记的预微调模块(任务特定的输出头)

Embedding模块详解

在这里插入图片描述

由以下三部分组成:

  • Token Embeddings:即词嵌入,包含 [CLS], [SEP] 等特殊标记。
  • Segment Embeddings:标记句子对任务中不同句子的边界。
  • Position Embeddings:用于保留词语的顺序信息。与原始Transformer中使用不可学习的位置编码不同,BERT中的位置编码是可学习的。

这种设计使得BERT在处理句子对任务时更加有效。


BERT vs Transformer 架构比较

项目 Transformer原版 BERT
架构 Encoder + Decoder 仅Encoder堆叠
注意力方向 单向/掩码注意力 双向注意力
位置编码 固定的三角函数 可学习的编码
应用方向 翻译、生成 句子对相关 NLP 任务(如文本对分类、自然语言推理 )

补充:
BERT 可以参与机器翻译和文本生成任务,不过有一定限制,并非传统端到端的直接做法。BERT 本身是仅编码器的架构(侧重理解文本),传统机器翻译是编码器 - 解码器架构(如 Transformer 完整架构 )。但可基于 BERT 做适配,比如将其作为编码器提取源语言文本特征,再搭配自定义解码器(如用 Transformer 解码器 ),通过微调让模型学习从源语言特征生成目标语言,实现翻译,并非 BERT 原生直接做翻译,而是作为部分模块助力。


关于自然语言推理(NLI)

自然语言推理(Natural Language Inference,简称NLI),其目标是判断两个句子之间的逻辑关系。

任务目标:判断前提句(Premise)与假设句(Hypothesis)之间的逻辑关系:

  1. 蕴含(Entailment)
  2. 矛盾(Contradiction)
  3. 中立(Neutral)

举例说明

前提句:一个男人在打篮球

  • 假设1:一个人在运动。→ ✅ 蕴含
  • 假设2:一个女人在打篮球。→ ❌ 矛盾
  • 假设3:一个人在喝水。→ ⚖ 中立

为什么BERT适合NLI?

  • 输入格式适配: [CLS] 前提 [SEP] 假设 [SEP]
  • NSP任务预训练增强句子间理解
  • 双向上下文建模捕捉微妙语义

自然语言推理(NLI)更多是一个“中间能力”或“语义理解模块”,其核心作用是为更复杂的下游任务提供语义关系判断支持,它本身不直接产生终端业务需要的“可用输出”。

就好像:

  • 机器翻译、文本生成 是你输入原料,直接产出产品,比如输入中文,输出英文,客户就能用;
  • NLI 更像质检员或判断员,它告诉你两个说法是一样的、矛盾的,还是没关系——但它不产出“产品”本身。

NLI的实际应用场景

场景 NLI 的作用
问答系统 判断用户问题是否等价于知识库中的问法
事实核查 判断新闻内容是否与事实矛盾
多轮对话 判断上下文一致性
搜索推荐 匹配用户意图与商品描述
合同审查 判断条款是否有逻辑冲突

NLI是语义理解模块,不直接产出结果,而是为复杂系统提供中间判断能力。所以你看到的“蕴含/矛盾/中立”不是最终结果,但它是判断正确性、相关性、合理性的一步关键判断逻辑。


Transformer编码器模块

BERT中只使用了经典Transformer架构中的Encoder部分, 完全舍弃了Decoder部分. 而两大预训练任务也集中体现在训练Transformer模块中。

Input (Token Embedding + Position Embedding + Segment Embedding)
↓
Transformer Layer × 12(Base)或 24(Large)
↓
[CLS] 输出 + 其他 Token 表示

BERT 使用了原始 Transformer 的 Encoder 堆叠结构:

  • 每层包含多头自注意力 + 前馈神经网络
  • 加入残差连接和 LayerNorm
  • 支持双向上下文建模(无掩码)

与Transformer的对比,不同点:

比较项 Transformer BERT
输入格式 源语+目标语 [CLS] 句子A [SEP] 句子B [SEP]
注意力机制 前向/掩码 无掩码的双向自注意力
输出类型 序列生成 分类、句对建模、Token预测

BERT结构的进一步解释:

Input Embedding(词向量 + 位置编码 + 句子编码)
↓
Transformer Layer 1
↓
Transformer Layer 2
↓
…
↓
Transformer Layer 12(BERT-base)或 Layer 24(BERT-large)
↓
输出(如 [CLS] 向量或全部 token 表示)

每一层都是一个 标准 Transformer Encoder 层;
层与层之间是串联堆叠(stacked),而不是两个并行结构;
所以是一个“由 N 层编码器组成的整体堆叠”。

补充:
1、 在原始 Transformer架构中,Encoder 中的多头自注意力层是不加遮蔽(mask)的,因此它自然就是双向自注意力。
2、 BERT 的每层注意力机制都是多头的。
3、 BERT 并不是在“多头注意力”和“双向注意力”之间选一个,而是双向 + 多头并存,结构等价于:

# 每一层都执行这个结构:
output = LayerNorm(x + FeedForward(LayerNorm(x + MultiHeadSelfAttention(x))))

其中 MultiHeadSelfAttention 的每个 Head 都可以关注整个序列(即双向),所以最终可以从多个角度组合信息。


预微调模块(Fine-tuning)

BERT 模型的主体部分是由多个 Transformer 层组成的编码器(Encoder stack),它的任务是提取输入文本的“深层语义表示”。但它本身不带“分类头”或“任务输出层”。
经过中间层Transformer的处理后, BERT的最后一层根据任务的不同需求而做不同的调整即可。

例如:对于文本分类任务,我们就加一层全连接层 + softmax,用来输出类别。

举例:文本情感分类

我们对这句话进行 BERT 预处理:

[CLS] 这家餐厅的菜品很好吃 [SEP]

经过 BERT 编码器(即 Transformer 堆叠)之后,你会得到每个 token 的隐藏表示:

[output_cls, output_token1, output_token2, ..., output_sep]

其中:

  • [CLS] 是 BERT 特有的起始标记
  • output_cls 是它在最后一层的隐藏状态(称为 final hidden state of [CLS])

你取出 output_cls 这个向量,它等于一个句子的整体语义表达,然后:

logits = Linear(output_cls)     # 全连接层(比如输出3个类别的logits)
probs = Softmax(logits)         # 分类概率

就可以作为最终分类结果了。
为什么用 [CLS] 表示整个句子?

  • 在 BERT 的预训练任务(如 Next Sentence Prediction)中,模型被训练为利用 [CLS] token 的输出向量来表达“全局句子对信息”。所以 [CLS] 的最终表示其实就可以看作是“整个输入序列的压缩语义向量”
  • 这就是 BERT 用于 sequence-level 任务(句子级别任务)的标准做法。

所以所谓微调,是指在已经预训练好的模型基础上,针对特定任务进行再训练的过程 。
具体来说,对于像BERT这样的预训练模型,它在大规模数据集上学习到了丰富的语言表示(例如,词汇之间的关系、语法结构等)。然后,我们将这个预训练模型应用于具体的下游任务(如文本分类、命名实体识别、问答等),并在这个任务的训练数据上进行再次训练,但通常 微调的训练时间比从头开始训练要短得多。

常见任务对应微调结构

在这里插入图片描述

任务类型 使用的输出 添加层 输出形式
句对分类 [CLS] FC + Softmax 标签
单句分类 [CLS] FC + Softmax 标签
问答任务 所有token 线性层x2 起始/结束位置
序列标注 每个token 分类器 每个Token的标签

这些微调方式共同点是:BERT主体参数继续训练,任务层单独添加并训练,体现了BERT作为通用语言编码器的迁移学习能力。

且从上图中可以发现, 在面对特定任务时, 只需要对预微调层进行微调, 就可以利用Transformer强大的注意力机制来模拟很多下游任务, 并得到SOTA的结果. (句子对关系判断, 单文本主题分类, 问答任务(QA), 单句贴标签(NER))。

微调建议超参数

  • Batch size: 16 或 32
  • Learning rate: 2e-5 ~ 5e-5
  • Epoch: 3 或 4

BERT的预训练任务

BERT 在预训练阶段(也就是刚开始训练模型的时候)使用了两种任务目标来“联合训练”这个模型。

在BERT的设计中,训练分为两个阶段,一个是上述所说的预训练,第二个阶段是微调(fine-tune)。
微调,是用具体任务的数据再训练一小段,目的是为了适配你的应用场景(分类、问答等)。

在上述的说明中,提到预训练使用大规模无监督语料加上特定任务来训练模型,特定任务包含比如MLM,NSP,下面详细介绍一下这两个预训练任务。

1. MLM:Masked Language Modeling

随机遮盖输入句子中的某些词,让模型预测它们。

原句:这个地方的饭菜很好吃
输入:这个 [MASK] 的饭菜很好吃
目标:预测 [MASK] 是“地方”

此任务增强了模型的上下文理解能力。

2. NSP:Next Sentence Prediction

这个任务是为了让BERT能学会理解“句子之间的逻辑关系”,尤其对句子对任务(如问答、NLI)非常重要。任务形式:给模型两个句子A和B,让它判断:
B是不是A的下一句话?

A B 标签
她走进了餐厅。 她点了牛排。 True
她走进了餐厅。 我喜欢足球。 False

训练时:
50%的样本 B 是 A 的下一句(正样本)
50%是随机采样的句子(负样本)

小结一下,BERT的预训练阶段,就是同时进行这两个任务的联合训练,它的损失函数是两个任务的加权总和:
在这里插入图片描述
通过这两个任务:

  • MLM让模型学会词的上下文理解;
  • NSP让模型学会句子之间的关系判断;

这样子预训练完的BERT,就具备了强大的语义理解能力,可以迁移到各种NLP下游任务中。


小结

BERT 通过强大的双向Transformer编码器架构和精心设计的预训练任务(MLM+NSP),使其具备了出色的语义理解能力,能够在多种NLP任务中达到 SOTA 水平。其“预训练+微调”范式也极大推动了自然语言处理领域的发展。



网站公告

今日签到

点亮在社区的每一天
去签到