今天我们来深入探讨一个非常具体、但理解大模型底层运行机制时无法绕开的关键问题:模型中的参数到底是如何分布的?以经典的GPT-2模型为切入点,我们将彻底拆解其内部结构,你会发现每一个数字背后都蕴含着切实的工程考量。
先为模型建立一份档案:以 GPT-2 为例
将模型展开来看,其基本规格如下:
| 属性 | 值 | 含义 |
|---|---|---|
| 层数(num_layers) | 12 | Transformer block 的数量 |
| 隐藏维度(hidden_size) | 768 | 每个 token 的向量表示长度 |
| 注意力头数(num_heads) | 12 | Attention 分拆成多个头并行计算 |
| 词表大小(vocab_size) | 50257 | 模型能识别的 token 总数 |
| 上下文长度(context_length) | 1024 | 一次能够处理的最大文本长度 |
| 参数量 | 约 1.24 亿 | 模型的总体规模 |
这些数值并非随意设定——每一项参数都具有明确的工程含义。让我们逐一拆解分析。
hidden_size 究竟是什么
hidden_size 代表每个 token 在模型内部的表征粒度。打个比方,它就像每个词的“指纹”长度。
当模型读到“你好”这两个字时,首先会查询词表,获得两个 token ID。随后 Embedding 层将每个 ID 映射成一个 768 维的向量——这就是 token 在模型内部的“表示”。
768 维是什么概念?可以理解为一个 768 维的坐标系。每个词在这个空间里都有一个位置,语义相近的词在空间中的位置也彼此靠近。这正是大语言模型能够进行类比推理(例如“国王-男人+女人≈女王”)的根本原因——这些关系全部编码在向量空间的几何结构之中。
为什么选择 768 而不是 1000?这又是一个典型的工程折中:hidden_size 越大,向量空间的表达能力就越强,能够编码更细腻的语义关系;但参数量会随着 hidden_size 的平方增长——如果 hidden_size 翻倍,参数量将变为原来的 4 倍,同时计算量(FLOPs)和显存占用也会大幅攀升。
因此,模型设计的本质就是在表达能力和计算成本之间寻求平衡。GPT-2 选用了 768,而 GPT-3 则用了 12288——并非 768 不够用,而是不同时期的算力约束条件完全不同。
参数都分布在哪里
在一个标准的 Transformer 层中,参数主要分布在四个关键部分:
1. Self-Attention 的 Q/K/V 投影
每个 token 都有一个输入向量 x(维度 = hidden_size = 768)。Attention 机制需要将其转换成三份:
Q = x × Wq (形状:[768, 768])
K = x × Wk (形状:[768, 768])
V = x × Wv (形状:[768, 768])
Wq、Wk、Wv 是三个独立的权重矩阵,每个矩阵拥有 768 × 768 = 589,824 个参数。此外还有一个 Wo 矩阵(形状:[768, 768]),用于将多个注意力头的输出拼接后再投影回来。这四个矩阵合计:4 × 768² = 2,359,296 个参数。
2. 前馈网络(FFN)
Attention 层之后,紧接着是一个两层全连接网络:
FFN(x) = gelu(x × W1) × W2
其中 W1 的形状为 [768, 3072],W2 的形状为 [3072, 768]。为什么中间维度是 3072 = 768 × 4?这是 Transformer 的标准配置:FFN 的中间层维度通常设为 hidden_size 的 4 倍。FFN 合计参数:(768 × 3072) + (3072 × 768) = 4,718,592 个——这是整个 Transformer 层中参数量最大的部分,约占一层的 66%。
3. 层归一化(Layer Norm)
每个 Transformer 层中会进行两次层归一化:
LayerNorm(x) = γ × (x - μ) / σ + β
其中 γ 和 β 分别是可学习的缩放向量和偏移向量,每个向量的长度均为 768。Layer Norm 合计参数:2 × 2 × 768 = 3,072 个。
4. 残差连接
残差连接本身不包含参数,但它能够使梯度直接回传到浅层,是保证训练稳定性的关键组件。
将上述所有部分加起来
一层 Transformer 的参数总量:
- Attention(Wq/Wk/Wv/Wo): 2,359,296
- FFN(W1/W2): 4,718,592
- Layer Norm: 3,072
- 总计: ~7,080,960
GPT-2 共有 12 层,因此仅 Transformer 层就有 12 × 7,080,960 ≈ 84,971,520 个参数。再加上输入 Embedding 层(约 50,257 × 768 ≈ 38,597,376)和输出层(同样约 38,597,376),总参数量约为 1.24 亿。这就是 GPT-2 被称为 “1.24B model” 的原因。
一层 Transformer 的完整旅程
了解参数分布之后,我们来看看数据流经一层 Transformer 时究竟发生了什么:
- 第 N 层输入向量(形状:[batch, seq_len, 768])
- ① Layer Norm → 归一化处理,稳定数值分布
- ② 多头自注意力(Multi-Head Self-Attention)
├─ 将输入复制三份,分别与 Wq, Wk, Wv 相乘得到 Q, K, V
├─ Q × Kᵀ / √d → 计算相关度分数(d=768)
├─ softmax → 归一化为概率分布
└─ 概率分布 × V → 加权求和,得到融合了上下文信息的输出 - ③ 残差连接:output = input + attention_output
- ④ Layer Norm → 再次归一化
- ⑤ FFN:gelu(W2·(gelu(W1·x)))
- ⑥ 残差连接:output = input + ffn_output
- 第 N 层输出向量(形状:[batch, seq_len, 768])
重复 12 次(GPT-2 的情况),每经过一层,向量表示都变得更加抽象。
层数与抽象层次:层层递进的语义
研究显示,Transformer 各层所做的事情存在明显的规律:
| 层范围 | 主要任务 | 具体表现 |
|---|---|---|
| 第 1-3 层 | 词汇级 | 识别词形、词频、位置编码 |
| 第 4-6 层 | 句法级 | 主谓关系、动宾关系、依存分析 |
| 第 7-9 层 | 语义级 | 实体识别、语义角色、常识关系 |
| 第 10-12 层 | 任务级 | 推理、问答、生成逻辑 |
这就是为什么可以利用 Probing Classifier,在特定层的激活向量上训练分类器,从而“透视”模型在某个层级关注哪些信息。
真实模型的规模对比
| 模型 | 层数 | hidden_size | 参数量 | 所需显存(估算) |
|---|---|---|---|---|
| GPT-2 | 12 | 768 | 1.2 亿 | ~2GB |
| GPT-3 | 96 | 12288 | 1750 亿 | ~350GB |
| LLaMA-2 | 32 | 4096 | 70 亿 | ~140GB |
| Claude 3 | 40+ | 8192+ | 数千亿 | 数千GB |
一个粗略的估算公式:模型所需显存 ≈ 参数量 × 2(FP16 存储)。因此 GPT-3(1750 亿参数)在 FP16 格式下大约需要 350GB 显存——这已经超出单张显卡的容量,需要多卡并行部署。
面向工程师的实用视角
如果你是一名开发者,理解这些知识有哪些实际用途?
首先,可以预估推理所需的显存。使用 transformers 加载模型时,先计算参数量:在 float16 精度下,每 10 亿参数大约需要 2GB 显存。其次,能够理解为什么 batch_size 通常很小——显存大部分被模型权重占据,剩余的空间才分配给激活值和 KV cache,因此大模型的自然 batch size 往往很小。最后,有助于理解微调策略。全量微调 GPT-3 需要 350GB 以上显存,于是催生了 LoRA、QLoRA 等参数高效微调方法——它们只更新一小部分参数,而非整个模型。
总结:三个核心要点
- hidden_size 是每个 token 的向量维度——决定了模型对单个词的表示精度,GPT-2 为 768,GPT-3 为 12288。
- 参数主要集中在 FFN 层——占一层的 2/3,是主要的计算和存储瓶颈。
- 层数代表抽象的深度——从词汇到句法再到语义,层层递进,越深层越抽象。
读完本文,你应该能够回答:Attention 中的 Wq/K/V 形状是什么([768, 768]),FFN 为什么采用 4 倍 hidden_size(工程经验值,实验效果最佳),以及残差连接的作用是什么(使梯度直接回传,防止深层训练不稳定)。
第 3 篇我们将探讨大模型的“涌现能力”——为什么当规模突破临界点后,模型会突然展现出全新的能力,以及这种现象背后的深层含义。
