BERT 的 12 层 Transformer:每层在做什么?

一句话理解

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(提取每层输出)

第一部分:各层向量在变化

[CLS] 向量的前 5 个维度(共 768 维)

层        维度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):理解句法 → 理解意图(两次跃迁)

第三部分:向量的"强度"变化

L2 范数(向量长度)

层        范数     柱状图
──────────────────────────────────
嵌入层    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] 在每层关注哪些字?

层      [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)
  → 句子边界标记,每层都需要"看到"它来定位句尾

总结:12 层的"分工"

┌─────────────────────────────────────────────────────────────┐
│                    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层、自注意力、隐藏状态、注意力权重、层间分析

相关笔记