一句话理解
BERT 的 12 层 Transformer = 12 位"专家"流水线。每位专家在前一位的基础上,把理解推得更深一层。从字面意思 → 词组含义 → 句子意图,逐层递进。
BERT 架构(bert-base-chinese):
输入 → [嵌入层] → [第1层] → [第2层] → ... → [第12层] → 输出
├── 嵌入层(Embedding):把 token ID 转成 768 维向量(初始表示)
├── 第 1-12 层:每层对向量做一次"加工"
└── 最终输出:经过 12 次加工的向量,包含了"深层理解"
每层做什么?
├── 自注意力(Self-Attention):每个字"看看"其他字,互相交流
└── 前馈网络(Feed-Forward):把交流结果"消化"成更深的理解
输入:「今天天气如何」
分词:['[CLS]', '今', '天', '天', '气', '如', '何', '[SEP]']
模型:bert-base-chinese(12层,768维,12头注意力)
方法:output_hidden_states=True(提取每层输出)
层 维度1 维度2 维度3 维度4 维度5
─────────────────────────────────────────────────────
嵌入层 0.0588 0.0704 -0.2139 -0.2435 -0.6515
第 1层 0.0436 -0.0096 -0.2416 -0.0597 -0.1145
第 2层 0.0194 0.0426 -0.0864 -0.0910 0.0595
第 3层 0.0893 0.1078 -0.0153 -0.0590 -0.1081
第 4层 0.2082 0.1883 -0.0897 -0.0470 -0.0674
第 5层 0.0605 0.2201 -0.1072 -0.3180 0.0652
第 6层 0.0151 0.4249 0.4718 -0.4595 -0.1050
第 7层 -0.1478 0.2976 0.4925 -0.4764 0.3388
第 8层 -0.0112 0.7875 0.3651 -0.6265 -0.1477
第 9层 0.1397 0.6965 0.8645 -0.9972 0.1376
第10层 0.9781 0.5439 0.8260 -0.5823 0.2721
第11层 1.1031 0.4274 0.8364 -0.3944 0.4671
第12层 0.6037 0.3802 0.5621 -0.3109 0.3097
观察: - 嵌入层的数字 → 到第 12 层完全变了 - 说明:每层都在"改写"向量,逐层加工出更深的理解 - 这不是随机的——是训练出来的"理解编码"
层变化 相似度 含义
──────────────────────────────────────────
嵌入层 → 第 1层 0.9063 变化较大(第一层"大改")
第 1层 → 第 2层 0.9638 变化减小
第 2层 → 第 3层 0.9622 继续微调
第 3层 → 第 4层 0.9900 变化很小(趋于稳定)
第 4层 → 第 5层 0.9676
第 5层 → 第 6层 0.9577
第 6层 → 第 7层 0.9509
第 7层 → 第 8层 0.9027 又开始变化(深层重构)
第 8层 → 第 9层 0.8720 ← 最低!第 9 层"大改"
第 9层 → 第10层 0.9003
第10层 → 第11层 0.9595
第11层 → 第12层 0.6985 ← 最低!最后一层"质变"
关键发现:
1. 嵌入层 → 第1层(0.91):
第一层 Transformer 对原始嵌入做了较大调整
→ 从"字面编码"变成"初步理解"
2. 第3-4层(0.99):
中间层变化很小 → 在已有理解基础上"微调"
→ 类似"精加工"阶段
3. 第8-9层(0.87)和第11-12层(0.70):
深层出现了两次"大改"
→ 说明深层在做"高级语义重构"
→ 从"词组理解"跃迁到"句子意图"
类比:
浅层(1-4):认字 → 组词
中层(5-8):理解词组 → 理解句法
深层(9-12):理解句法 → 理解意图(两次跃迁)
层 范数 柱状图
──────────────────────────────────
嵌入层 13.66 ██████
第 1层 15.91 ███████
第 2层 15.60 ███████
第 3层 18.09 █████████
第 4层 21.66 ██████████
第 5层 21.69 ██████████
第 6层 24.02 ████████████
第 7层 24.91 ████████████
第 8层 23.59 ███████████
第 9层 24.33 ████████████
第10层 25.97 ████████████
第11层 26.98 █████████████ ← 最长
第12层 21.84 ██████████ ← 缩短了
观察:
1. 范数从嵌入层(13.66)逐渐增长到第11层(26.98)
→ 越深层编码的信息越"强烈"
→ 模型越来越"确信"自己的理解
2. 第12层突然缩短(26.98 → 21.84)
→ 最后一层做了"压缩/归一化"
→ 把深层的复杂理解"浓缩"成最终输出
→ 这个最终向量会被用于分类
层 [CLS] 今 天 天 气 如 何 [SEP]
──────────────────────────────────────────────────────────────
第 1层 0.62 0.04 0.03 0.03 0.04 0.02 0.02 0.20
第 2层 0.86 0.02 0.01 0.01 0.01 0.01 0.01 0.06
第 3层 0.82 0.01 0.00 0.01 0.01 0.01 0.01 0.14
第 4层 0.24 0.03 0.01 0.02 0.02 0.02 0.04 0.62
第 5层 0.11 0.05 0.03 0.02 0.03 0.04 0.15 0.57
第 6层 0.10 0.08 0.03 0.04 0.03 0.04 0.05 0.64
第 7层 0.09 0.08 0.05 0.03 0.02 0.03 0.15 0.56
第 8层 0.09 0.09 0.05 0.07 0.04 0.04 0.07 0.56
第 9层 0.04 0.06 0.06 0.04 0.03 0.04 0.07 0.67
第10层 0.08 0.06 0.04 0.05 0.03 0.09 0.18 0.48
第11层 0.04 0.06 0.07 0.10 0.07 0.04 0.07 0.55
第12层 0.05 0.06 0.04 0.06 0.06 0.07 0.09 0.56
关键发现:
浅层(第 1-3 层):
[CLS] 主要关注自己(0.62-0.86)
→ 还没学会"看"其他字
→ 处于"自我认知"阶段
过渡层(第 4-6 层):
[CLS] 开始关注其他字(自己降到 0.10-0.24)
→ 开始"阅读"句子内容
→ 特别关注"何"(0.15)→ 识别出疑问词
深层(第 7-12 层):
[CLS] 均匀关注所有字(自己只有 0.04-0.09)
→ 综合全句信息
→ 不再偏重某个字,而是"全局理解"
→ 第10层特别关注"如"(0.09)和"何"(0.18)→ 确认疑问意图
[SEP] 始终获得较高注意力(0.06-0.67)
→ 句子边界标记,每层都需要"看到"它来定位句尾
┌─────────────────────────────────────────────────────────────┐
│ BERT 12 层处理流水线 │
├──────────┬──────────────────────────────────────────────────┤
│ 嵌入层 │ 把 token ID 转成 768 维向量(查表,无理解) │
├──────────┼──────────────────────────────────────────────────┤
│ 第 1-3 层 │ 浅层:字面理解 │
│ (浅层) │ ├── 识别字的基本含义 │
│ │ ├── 初步词性判断 │
│ │ └── [CLS] 主要关注自己,还没学会"看"其他字 │
├──────────┼──────────────────────────────────────────────────┤
│ 第 4-8 层 │ 中层:词组与句法理解 │
│ (中层) │ ├── 识别词组("今天""天气""如何") │
│ │ ├── 理解句法结构 │
│ │ └── [CLS] 开始关注其他字,特别关注疑问词"何" │
├──────────┼──────────────────────────────────────────────────┤
│ 第 9-12 层│ 深层:语义与意图理解 │
│ (深层) │ ├── 理解句子整体含义 │
│ │ ├── 判断意图(这是一个"询问") │
│ │ ├── 第 8→9 层、第 11→12 层各发生一次"质变" │
│ │ └── [CLS] 均匀关注所有字 → 全局理解 │
├──────────┼──────────────────────────────────────────────────┤
│ 最终输出 │ 第 12 层的 [CLS] 向量 │
│ │ → 送入分类头 → 17 个 logits → 类别编号 │
└──────────┴──────────────────────────────────────────────────┘
层数增加 → 理解更深 → 但收益递减
BERT-base:12 层(110M 参数)
BERT-large:24 层(340M 参数)→ 性能只提升约 5%
原因:
├── 计算量翻倍(12层 → 24层,推理时间翻倍)
├── 显存占用翻倍
├── 边际收益递减(12层已经能理解大部分语义)
└── 太深 → 梯度消失/过拟合风险增加
对于分类任务:12 层已经足够
→ 不需要理解到 GPT 那种"生成"级别
→ 12 层的"理解"已经能准确分类
12 层 Transformer = 12 次"逐步深入的理解"
实测发现:
浅层(1-3):认字 → [CLS] 只看自己
中层(4-8):组词 → [CLS] 开始看其他字
深层(9-12):懂意 → [CLS] 全局理解
两次"质变":
第 8→9 层:从词组理解 → 句法理解
第 11→12 层:从句法理解 → 意图判断
最终输出:
第 12 层的 [CLS] 向量(768 维)
→ 包含了"今天天气如何"的完整理解
→ 送入分类头 → 输出类别编号
📝 创建:2026-09-12
🔄 标签:BERT、Transformer、12层、自注意力、隐藏状态、注意力权重、层间分析