大模型不是黑箱:拆开模型看里面究竟

GPT-2的规格参数不仅仅是数字,每个数值都体现着工程权衡。接下来,我们将从hidden_size入手,逐一拆解Transformer组件的设计逻辑与参数分布。
先给模型建个档案:以 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,参数量变为 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]),用于将多个 Attention 头的输出拼接后投影回来。四个矩阵合计参数:4 × 768² = 2,359,296 个。
2. Feed-Forward Network(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 层包含两次 Layer Norm:
LayerNorm(x) = γ × (x - μ) / σ + β
γ 和 β 各为一个可学习的缩放与偏移向量,长度均为 768。Layer Norm 合计参数:2 × 2 × 768 = 3,072 个。
4. 残差连接
残差连接本身不含参数,但它使梯度能直接回传到浅层,是训练稳定性的关键要素。
把以上全部加起来
计算一层 Transformer 的参数量:
Attention(Wq/Wk/Wv/Wo): 2,359,296FFN(W1/W2): 4,718,592Layer Norm: 3,072总计: ~7,080,960
GPT-2 有 12 层,仅 Transformer 层就有:
12 × 7,080,960 ≈ 84,971,520
再加上输入嵌入层(约 50,257 × 768 ≈ 38,597,376)与输出层(约 38,597,376),总计约 1.24 亿参数。这就是 GPT-2 被称为“1.24B model”(1.24 Billion = 1.24 亿)的原因。
一层 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 | 参数量 | 所需显存(FP16) |
|---|---|---|---|---|
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?(工程经验值,实验效果最佳)残差连接的作用是什么?(让梯度直接回传,防止深层训练不稳定)。
本次内容属于系列解读的一部分,后续将介绍大模型的“涌现能力”——探讨规模突破临界点后突然出现新能力的原因及其背后的机制。