当GPT-3在2020年问世时,其1750亿参数的规模震惊了整个AI界。三年后,LLaMA-70B用更少的参数达到了更好的效果。到了2024年,DeepSeek-V3以6710亿总参数但仅激活370亿参数的MoE架构重新定义了效率边界。这些数字背后隐藏着一套精确的数学逻辑——参数量如何决定计算量,计算量如何影响训练成本,以及如何在有限的算力预算下设计最优模型。

这不是一篇关于"模型越大越好"的陈词滥调,而是一次从Transformer底层架构出发,推导参数量与计算量之间精确关系的数学之旅。

参数量从何而来:Transformer的数学解剖

理解大模型的参数量,需要从Transformer的架构入手。一个标准的decoder-only Transformer由多层堆叠而成,每层包含两个核心组件:多头自注意力机制和前馈神经网络。

Embedding层:模型的"词典"

Transformer的第一步是将离散的token转换为连续向量。假设词汇表大小为$V$,嵌入维度为$d_{model}$,则token embedding矩阵的形状为$V \times d_{model}$。

以GPT-3为例,$V = 50257$,$d_{model} = 12288$,仅embedding层就有约6.17亿参数。这个数字听起来很大,但随着模型规模增大,embedding层在总参数中的占比反而会下降——LLaMA-70B的embedding仅占总参数的0.2%左右。

位置编码是否贡献参数取决于具体实现。GPT系列使用可学习的位置编码,需要$n_{ctx} \times d_{model}$个参数($n_{ctx}$为最大上下文长度);而LLaMA系列使用RoPE旋转位置编码,这是一种确定性计算,不引入可学习参数。

注意力层:四矩阵的矩阵

每一层的注意力机制包含四个关键矩阵:Query ($W_Q$)、Key ($W_K$)、Value ($W_V$)和Output ($W_O$)。在标准的多头注意力中,这四个矩阵的形状都是$d_{model} \times d_{model}$。

这里有一个重要的设计细节:虽然注意力被分为多个head,但总参数量与head数量无关。设head数量为$n_{heads}$,每个head的维度为$d_{head}$,通常满足$n_{heads} \times d_{head} = d_{model}$。无论将$d_{model}$维度切分成多少个head,$W_Q$、$W_K$、$W_V$的总参数量始终是$3 \times d_{model}^2$。

以GPT-3为例,$d_{model} = 12288$,单个注意力层的四个矩阵贡献:

$$4 \times 12288^2 \approx 604 \text{M 参数}$$

前馈神经网络:隐形的参数大户

前馈网络(FFN)是参数量的主要来源,这一点常被忽视。标准FFN包含两个线性变换,中间层维度通常是$d_{model}$的4倍:

$$W_1: d_{model} \times 4d_{model}$$

$$W_2: 4d_{model} \times d_{model}$$

单层FFN的参数量为$8 \times d_{model}^2$,是注意力层($4 \times d_{model}^2$)的两倍。对于GPT-3:

$$2 \times 12288 \times 49152 \approx 1.21 \text{B 参数/层}$$

这解释了为什么在大型模型中,FFN贡献了约2/3的非embedding参数。

LayerNorm:微不足道但不可或缺

每个Transformer层包含两个LayerNorm(注意力前和FFN前),每个LayerNorm有$\gamma$和$\beta$两个可学习参数向量,形状均为$d_{model}$。单层贡献$4 \times d_{model}$个参数,相对于矩阵乘法的参数量可以忽略不计。

总参数量公式

综合以上分析,一个$L$层decoder-only Transformer的总参数量可以近似为:

$$P \approx L \times (12 d_{model}^2) + V \times d_{model} + n_{ctx} \times d_{model}$$

忽略embedding和位置编码(在大模型中占比很小):

$$P \approx 12 L d_{model}^2$$

这个公式揭示了一个重要事实:参数量与嵌入维度呈平方关系。将$d_{model}$翻倍,参数量会增加4倍。

验证一下GPT-3:$L = 96$,$d_{model} = 12288$

$$P \approx 12 \times 96 \times 12288^2 \approx 174 \text{B}$$

与官方公布的175B参数基本吻合。

FLOPs:计算量的精确度量

参数量告诉我们要存储多少数字,FLOPs(Floating Point Operations)则告诉我们要执行多少次浮点运算。两者之间存在确定性的数学关系,但推导过程需要仔细审视每个操作。

矩阵乘法的FLOPs计算

一次$m \times n$矩阵与$n \times p$矩阵的乘法需要$2mnp$次浮点运算:每个输出元素需要$n$次乘法和$n-1$次加法(近似为$n$次加法),共$m \times p$个输出元素。

为什么是$2mnp$而不是$mnp$?因为一个"乘-加"操作(multiply-accumulate, MAC)算作2 FLOPs:一次乘法和一次加法。这是计算领域的标准约定。

前向传播的FLOPs

以单层注意力为例,计算$Q = X \cdot W_Q$(输入$X$形状为$batch \times seq \times d_{model}$,$W_Q$形状为$d_{model} \times d_{model}$):

  • FLOPs = $2 \times batch \times seq \times d_{model} \times d_{model}$

对于单个token($batch = 1, seq = 1$),四个投影矩阵($W_Q, W_K, W_V, W_O$)共贡献:

$$4 \times 2 \times d_{model}^2 = 8 d_{model}^2 \text{ FLOPs}$$

FFN层的两个矩阵乘法:

$$2 \times 2 \times d_{model} \times 4d_{model} = 16 d_{model}^2 \text{ FLOPs}$$

单层前向传播总计(忽略softmax、激活函数等非线性操作):

$$24 d_{model}^2 \text{ FLOPs/token}$$

反向传播:计算的2倍代价

反向传播需要计算两个梯度:

  1. 对输入的梯度:传递给前一层
  2. 对权重的梯度:用于参数更新

每个矩阵乘法在前向传播时是$A \cdot B = C$,反向传播需要:

  • 计算$\partial L / \partial A$:对$B$的乘法
  • 计算$\partial L / \partial B$:对$A$的乘法

这意味着反向传播的计算量是前向传播的2倍。因此,完整的训练过程(前向+反向)每个参数需要6次浮点运算

$$\text{训练FLOPs/token} \approx 6 P$$

其中$P$是非embedding参数量。

注意力的序列长度依赖性

上述推导忽略了注意力计算中与序列长度相关的部分。完整的注意力计算包括:

  • $Q \cdot K^T$:形状$seq \times seq$的矩阵乘法
  • Softmax:对$seq \times seq$矩阵的操作
  • Attention weights $\cdot V$:形状$seq \times d_{head}$的矩阵乘法

这些操作的FLOPs与序列长度$n_{ctx}$相关:

$$\text{注意力FLOPs} \approx 2 n_{ctx}^2 d_{model} \text{ per layer}$$

当$n_{ctx}$较小时(如$n_{ctx} < 8 d_{model}$),这部分计算量相对于投影矩阵可以忽略。对于GPT-3($d_{model} = 12288$),当$n_{ctx} < 100K$时,注意力计算的二次项占比不到20%。

训练总FLOPs公式

给定模型参数量$P$、训练token数$T$,总训练FLOPs为:

$$\text{Total FLOPs} \approx 6 P T$$

这个简洁的公式蕴含着深刻的含义:训练一个175B参数的模型在300B tokens上需要:

$$6 \times 175 \times 10^9 \times 300 \times 10^9 = 3.15 \times 10^{23} \text{ FLOPs}$$

这是一个天文数字,但有了它,我们就可以估算训练时间和成本。

从FLOPs到训练时间:GPU算力的度量

GPU理论峰值FLOPS

GPU的计算能力通常用FLOPS(Floating Point Operations Per Second)衡量,注意这里是大写S,表示每秒。不同精度下理论峰值不同:

GPU FP64 FP32 FP16/BF16 INT8
A100 40GB 19.5 TFLOPS 19.5 TFLOPS 312 TFLOPS 624 TOPS
A100 80GB 19.5 TFLOPS 19.5 TFLOPS 312 TFLOPS 624 TOPS
H100 SXM 67 TFLOPS 67 TFLOPS 1979 TFLOPS 3958 TOPS

注意这些是理论峰值,实际训练中无法达到。FP16/BF16的高峰值得益于Tensor Core的矩阵乘法加速。

模型FLOPs利用率(MFU)

理论峰值与实际性能之间存在巨大鸿沟。Google在PaLM论文中提出了Model FLOPs Utilization (MFU)的概念:

$$\text{MFU} = \frac{\text{实际达到的FLOPS}}{\text{理论峰值FLOPS}}$$

MFU反映了硬件实际利用效率。业界主流模型的MFU通常在40-60%之间:

  • PaLM (540B): 57.8% MFU
  • GPT-3 (175B): ~40% MFU (估计值)
  • LLaMA-2 (70B): ~43% MFU

为什么无法达到100%?原因包括:

  1. 内存带宽瓶颈:加载参数需要时间,计算单元可能闲置等待
  2. 通信开销:多GPU之间的梯度同步占用时间
  3. 非矩阵运算:LayerNorm、Softmax、激活函数等不是矩阵乘法,无法利用Tensor Core
  4. 软件开销:框架调度、内核启动等额外成本

训练时间估算

有了FLOPs、理论峰值和MFU,就可以估算训练时间:

$$\text{训练时间} = \frac{6 P T}{\text{GPU数量} \times \text{峰值FLOPS} \times \text{MFU}}$$

以GPT-3为例,假设使用1024块A100,MFU为40%:

$$\text{训练时间} = \frac{3.15 \times 10^{23}}{1024 \times 312 \times 10^{12} \times 0.4} \approx 2.46 \times 10^6 \text{ 秒} \approx 28.5 \text{ 天}$$

这个估算与实际公开信息基本一致。OpenAI在2020年论文中提到使用10000块V100,训练时间约一个月——V100的FP16峰值是125 TFLOPS,1024块A100的计算能力约等于10000块V100。

成本的维度

假设云服务GPU价格为$2/GPU-hour,GPT-3的训练成本: $$1024 \text{ GPUs} \times 28.5 \text{ 天} \times 24 \text{ 小时} \times \$2 \approx $1.4 \text{M}$$

这与MosaicML在2022年报告的约$4.5M(使用V100)和后来的$500K优化成本形成对比——技术进步和规模效应正在快速降低训练成本。

Chinchilla定律:计算最优的参数-数据配比

2022年DeepMind发表的Chinchilla论文重新定义了大模型训练的基本原则。论文的核心问题是:给定固定的计算预算,应该用多少参数、训练多少数据?

从Kaplan到Chinchilla的转变

OpenAI的Kaplan等人在2020年提出的scaling law建议:模型参数量应该比数据量增长更快。这导致了GPT-3(175B参数,300B tokens)和Gopher(280B参数,300B tokens)这样"大模型小数据"的设计。

Chinchilla论文重新审视了这个问题,训练了超过400个不同规模的模型,发现之前的结论有系统性偏差。新的结论是:模型参数量和训练数据量应该等比例增长

计算最优公式

Chinchilla给出了计算最优条件下参数量$N$和token数$D$与计算预算$C$(FLOPs)的关系:

$$N_{opt} \propto C^{0.5}$$

$$D_{opt} \propto C^{0.5}$$

这意味着当计算预算翻倍时,最优参数量和最优数据量都应该增加$\sqrt{2} \approx 1.41$倍。

一个实用的经验法则:每个参数需要约20个训练tokens。这被称为"Chinchilla optimal"配置。

GPT-3是否被"浪费"了?

按照Chinchilla定律,175B参数的最优训练数据量应该是:

$$D_{opt} = 20 \times 175 \text{B} = 3.5 \text{T tokens}$$

而GPT-3只用了300B tokens,差了一个数量级。这解释了为什么Chinchilla-70B(70B参数,1.4T tokens)虽然参数少4倍,但性能超过了Gopher-280B——后者同样"训练不足"。

后Chinchilla时代的实践

Chinchilla定律发布后,业界开始重新审视模型设计:

LLaMA系列

  • LLaMA-7B: 7B参数,1T tokens(~143 tokens/参数)
  • LLaMA-65B: 65B参数,1.4T tokens(~22 tokens/参数)

LLaMA明显"过训练"了,但这带来了推理时的优势——相同性能的模型更小更快。

Llama 3系列

  • Llama 3-70B: 70B参数,15T tokens(~214 tokens/参数)

Meta明确表示追求推理效率而非训练效率,这是对Chinchilla定律的"理性违背"——牺牲训练成本换取推理收益。

推理计算量:与训练的本质差异

训练是一次性的巨额投资,推理是持续运营的日常开销。两者的计算模式有根本性不同。

Prefill与Decode的两阶段模式

推理分为两个阶段:

Prefill阶段:处理完整的输入prompt,所有token可以并行计算。计算模式类似于训练的前向传播,FLOPs为:

$$\text{Prefill FLOPs} = 2 P \times n_{prompt}$$

Decode阶段:逐个生成token,每生成一个token需要重新计算注意力。这是"内存受限"的计算,主要瓶颈是加载模型权重:

$$\text{Decode FLOPs/token} = 2 P$$

KV Cache:空间换时间的智慧

Decode阶段的关键优化是KV Cache。在生成第$t$个token时,需要计算它与之前所有$t-1$个token的注意力。如果每次都重新计算历史token的K、V向量,计算量会随序列长度二次增长。

KV Cache通过存储历史token的K、V向量,将每步计算量从$O(t)$降到$O(1)$。代价是内存占用线性增长:

$$\text{KV Cache大小} = 2 \times L \times n_{heads} \times d_{head} \times n_{ctx} \times 2 \text{ bytes}$$

对于GPT-3架构($L=96, n_{heads}=96, d_{head}=128$),2048 tokens的KV Cache约需:

$$2 \times 96 \times 96 \times 128 \times 2048 \times 2 \approx 9.6 \text{ GB}$$

这解释了为什么长上下文模型需要大量GPU内存——不是参数量变大,而是KV Cache随序列长度增长。

内存带宽vs计算能力:Roofline模型

推理的瓶颈往往不是计算能力,而是内存带宽。Roofline模型形象地展示了这一约束:

$$\text{算术强度} = \frac{\text{FLOPs}}{\text{Bytes transferred}}$$

对于Decode阶段,每个token需要:

  • 从内存加载:$2P$ bytes(FP16权重)
  • 执行计算:$2P$ FLOPs
  • 算术强度:$1$ FLOP/byte

A100的内存带宽是2039 GB/s,FP16峰值是312 TFLOPS。当算术强度为1时:

$$\text{内存带宽上限} = 2039 \text{ GB/s} \times 1 = 2.04 \text{ TFLOPS}$$

这远低于计算峰值312 TFLOPS!这意味着Decode阶段本质上是内存受限的,GPU的计算能力大部分处于闲置状态。

从内存受限到计算受限的临界点

$$\text{临界batch size} = \frac{\text{峰值FLOPS}}{\text{内存带宽}} = \frac{312 \times 10^{12}}{2 \times 10^{12}} \approx 156$$

当batch size超过156时,A100才会从内存受限转变为计算受限。这是批量推理能提高吞吐量的数学基础。

实际案例分析:从GPT-3到DeepSeek-V3

GPT-3:Scaling Laws的首个验证

GPT-3的训练配置:

  • 参数量:175B
  • 训练数据:300B tokens
  • 估计FLOPs:$3.15 \times 10^{23}$
  • 硬件:约10000块V100
  • 时间:约30天
  • 成本:估计$4.6M(V100时代)

GPT-3的意义在于验证了scaling laws的预测能力。论文中展示的损失曲线与幂律预测高度吻合,为后续更大规模训练奠定了信心。

LLaMA-2:开源的力量

LLaMA-2-70B的训练配置:

  • 参数量:70B
  • 训练数据:2T tokens
  • 估计FLOPs:$8.4 \times 10^{23}$
  • 硬件:Meta自建集群
  • 报告MFU:~43%

尽管参数量只有GPT-3的40%,但训练了更多数据(按照Chinchilla建议的~29 tokens/参数),最终性能相当甚至更好。

DeepSeek-V3:MoE架构的效率革命

DeepSeek-V3代表了效率优化的新高度:

  • 总参数:671B
  • 激活参数:37B
  • 训练数据:14.8T tokens
  • 训练成本:278.8万H800 GPU小时
  • 估计FLOPs:$6 \times 37 \times 10^9 \times 14.8 \times 10^{12} \approx 3.3 \times 10^{24}$
  • 实测MFU:~22%

MoE架构让模型在保持大"知识容量"的同时,每次推理只激活一小部分参数。DeepSeek-V3的总参数是LLaMA-2-70B的9.6倍,但激活参数只有一半多,推理成本更低。

关于MFU较低的原因:MoE架构引入了额外的All-to-All通信开销,且FP8训练(DeepSeek采用)的理论峰值计算方式与FP16不同。

效率提升的技术演进

从GPT-3到今天的模型,单位性能的训练成本下降了不止一个数量级。这背后是多层技术的协同优化。

混合精度训练

早期训练使用FP32,每个参数需要4字节存储。混合精度训练(FP16/BF16权重 + FP32主权重)将存储需求减半,同时利用Tensor Core加速矩阵乘法。BF16相比FP16有更大的动态范围,避免了梯度下溢问题,已成为现代训练的标准选择。

Flash Attention:算法层面的革新

Flash Attention不是简单的内核优化,而是算法层面的重新设计。传统注意力需要实例化完整的$n_{ctx} \times n_{ctx}$注意力矩阵,内存复杂度$O(n_{ctx}^2)$。Flash Attention通过分块计算和在线softmax,将内存复杂度降到$O(n_{ctx})$:

$$\text{在线softmax}: \exp(x - \max(x)) / \sum \exp(x - \max(x))$$

关键洞察:可以逐块计算softmax,然后合并结果。这使得长上下文训练变得可行。

梯度检查点:内存与计算的权衡

大模型训练面临内存瓶颈——需要存储所有中间激活用于反向传播。梯度检查点(Gradient Checkpointing)的策略是:前向传播时只存储部分激活,反向传播时重新计算被丢弃的激活。

代价:增加约30%的计算量 收益:内存占用降低数倍

这是一个典型的"计算换内存"权衡,在内存受限场景下非常有效。

通信优化:多机训练的瓶颈

当模型需要跨多机多卡训练时,通信成为关键瓶颈。优化策略包括:

  1. 梯度压缩:通信前压缩梯度,如FP16通信、稀疏化
  2. 通信计算重叠:在计算下一层梯度的同时通信当前层梯度
  3. 分层All-Reduce:先机内reduce,再机间reduce

DeepSeek报告的通信开销占比约10-20%,这是大规模分布式训练的基本成本。

结语:数字背后的设计哲学

参数量和计算量不只是技术指标,它们反映了模型设计的深层哲学:

规模的平方律:参数量与$d_{model}$呈平方关系,意味着维度增长需要谨慎。从7B到70B不是简单地"加更多层",而是需要重新平衡宽度、深度和数据量的配比。

计算效率的多维度:MFU不只取决于代码优化,还取决于模型架构选择。MoE降低了推理计算量但增加了通信开销,长上下文提升了能力但增加了KV Cache负担。

Scaling Laws的边界:Chinchilla定律给出了训练效率最优解,但实际设计往往"过训练"以获得更好的推理效率。这反映了训练成本(一次性)与推理成本(持续)之间的权衡。

理解这些数学关系,才能在大模型开发中做出明智的技术决策。175B还是70B?1T tokens还是10T tokens?答案不是"越大越好",而是取决于具体的计算预算、延迟要求和部署场景。数学提供了框架,工程智慧在于权衡。