BERT 模型架构介绍
1 课程概览
本课介绍 BERT 模型架构。BERT 的输入由三个张量组成:Token Embedding(词嵌入张量)、Segment Embedding(句子分段张量)、Position Embedding(位置编码张量)。三个张量相加得到最终输入。BERT 只使用 Transformer 的编码器,是双向的。
2 核心概念与定义
- Token Embedding:词嵌入张量。
- Segment Embedding:句子分段张量。
- Position Embedding:位置编码张量。
- 双向 Transformer:可以往左走,也可以往右走。
- [CLS]:开头标记。
- [SEP]:结束标记。
3 模型与算法详解
BERT 输入表示
三个张量相加。
| 张量 | 名称 | 说明 |
|---|---|---|
| Token Embedding | 词嵌入张量 | 处理开头 |
| Segment Embedding | 句子分段张量 | 句子划分 |
| Position Embedding | 位置编码张量 | 位置信息 |
三个张量相加
最终输入 = Token Embedding + Segment Embedding + Position Embedding
$$\text{input} = \text{Token} + \text{Segment} + \text{Position}$$
- 三个张量维度:[batch_size, max_len, 768]
- 相加后维度:[batch_size, max_len, 768]
特殊符号
| 符号 | 含义 |
|---|---|
| [CLS] | 开头标记 |
| [SEP] | 结束标记 |
句子分段
使用 token_type_ids 标记句子划分。
- 0 表示第一句话
- 1 表示第二句话
双向 Transformer
BERT 是双向的,可以往左走,也可以往右走。
- 左方向:看前面的词
- 右方向:看后面的词
- 深度双向表达模型
BERT 只用编码器
BERT 只使用 Transformer 的编码器,不用解码器。
Transformer = 编码器 + 解码器
BERT = 编码器(只用这部分)
位置编码
传统位置编码使用正弦和余弦。
- 正弦余弦位置编码
- 旋转位置编码(RoPE)
- 阿里系列、DeepSeek 系列使用
- 大模型常用
BERT 的四项任务
BERT 可以做四项任务。
| 任务 | 说明 |
|---|---|
| 句子对分类任务 | 判断两个句子的关系 |
| 单句子分类任务 | 文本分类 |
| 问答任务 | 阅读理解 |
| 单句子标注任务 | NER |
4 数学原理与推导
输入表示
$$\text{input} = \text{Token_Embedding} + \text{Segment_Embedding} + \text{Position_Embedding}$$
其中:
- $\text{Token_Embedding}$ 是词嵌入张量
- $\text{Segment_Embedding}$ 是句子分段张量
- $\text{Position_Embedding}$ 是位置编码张量
维度
$$\text{shape} = [\text{batch_size}, \text{max_len}, 768]$$
双向 Transformer
$$\text{BERT}(x) = \text{Transformer_Encoder}(x)$$
5 代码示例
from transformers import BertModel, BertTokenizer
import torch
# 加载 BERT 预训练模型
model_name = "bert-base-chinese"
my_tokenizer = BertTokenizer.from_pretrained(model_name)
my_bert_model = BertModel.from_pretrained(model_name)
# 输入文本
text = "床前明月光,疑是地上霜。"
# 编码
inputs = my_tokenizer(
text,
return_tensors='pt',
truncation=True,
max_length=32,
padding='max_length'
)
print(f"input_ids: {inputs['input_ids'].shape}")
print(f"attention_mask: {inputs['attention_mask'].shape}")
print(f"token_type_ids: {inputs['token_type_ids'].shape}")
# 前向传播
with torch.no_grad():
outputs = my_bert_model(**inputs)
print(f"last_hidden_state: {outputs.last_hidden_state.shape}")
# last_hidden_state: [1, 32, 768]
# 三个张量相加
# Token Embedding + Segment Embedding + Position Embedding
代码说明
| 代码 | 说明 |
|---|---|
input_ids | 词嵌入张量 |
token_type_ids | 句子分段张量 |
attention_mask | 注意力掩码 |
last_hidden_state | 最后一个隐藏层(768 维) |
6 重难点与易错提醒
- ❗重点:BERT 输入由三个张量相加:Token + Segment + Position。
- ❗重点:BERT 是双向的,可以往左走,也可以往右走。
- ❗重点:BERT 只用 Transformer 的编码器,不用解码器。
- ❗重点:[CLS] 是开头标记,[SEP] 是结束标记。
- 💡技巧:旋转位置编码是大模型的发展方向。
7 课堂问答精选
Q1:BERT 的输入由哪几个张量组成?
A:BERT 的输入由三个张量相加:Token Embedding(词嵌入张量)、Segment Embedding(句子分段张量)、Position Embedding(位置编码张量)。
Q2:BERT 是单向还是双向的?
A:BERT 是双向的,可以往左走,也可以往右走,是深度双向表达模型。
Q3:BERT 用 Transformer 的哪部分?
A:BERT 只用 Transformer 的编码器,不用解码器。
Q4:[CLS] 和 [SEP] 是什么?
A:[CLS] 是开头标记,[SEP] 是结束标记。
8 本课小结
- BERT 输入由三个张量相加:Token + Segment + Position。
- BERT 是双向的,可以往左走,也可以往右走。
- BERT 只用 Transformer 的编码器。
- [CLS] 是开头标记,[SEP] 是结束标记。
9 延伸思考
- BERT 的预训练任务是什么?
- MLM 和 NSP 是什么?