Skip to content

第七章 模型容量与参数量推导

参数量统计的是模型持有的可学习标量。batch、输入长度、KV Cache 和量化字节数都不改变数学上的参数个数。

1 一层 Dense 模型

由注意力的四个投影矩阵可得:

$$ P_{\rm attn}=2dd_q+2dd_{kv} $$

若 $d_q=d$:

$$ P_{\rm attn}=2d^2+2dd_{kv} $$

MHA 进一步取 $d_{kv}=d$,得到熟悉的 $4d^2$。SwiGLU 为 $3dm$,两个 RMSNorm 为 $2d$,因此:

$$ P_{\rm block}=2d^2+2dd_{kv}+3dm+2d $$

只计线性层主项时可以省略 $2d$,但要说明近似口径。要精确计算时不能因为小就漏掉。

2 Embedding 与 LM Head

输入 Embedding 为 $Vd$ 个参数。独立 LM Head 也是 $dV$ 个参数。

  • 不共享权重:两者一共 $2Vd$。
  • 权重绑定 tied embeddings:两者是同一组可学习标量,只统计 $Vd$。

令 $c=2$ 表示不绑定、$c=1$ 表示绑定,则同构 Dense 模型总参数为:

$$ \boxed{P_{\rm total}=L(2d^2+2dd_{kv}+3dm+2d)+d+cVd} $$

最后的 $d$ 是 final RMSNorm。输出层即使与 Embedding 共享权重,计算完整 logits 时仍执行 $[n,d]\times[d,V]$,主项 FLOPs 不会因为权重绑定而消失。

如果题目包含 bias,则 Attention 四个投影增加 $d_q+2d_{kv}+d$;SwiGLU 三个投影增加 $2m+d$;输出层 bias 增加 $V$。还应逐项检查 Norm 类型、位置表与额外模块。

3 MoE 替换的是哪些模块

在常见 FFN MoE 中,Attention 仍是所有 token 共享的。FFN 变成专家池和路由器;每个专家是一套独立 FFN。以 Mixtral 为例,每层有 8 个 FFN 专家,每个 token 每层选择 2 个;不同位置可以选到不同专家。

若一个 SwiGLU 专家的中间维度为 $m_e$:

$$ P_e=3dm_e $$

最简单的路由器将 $d$ 维 hidden 映射到 $E$ 个专家分数,权重是 $d\times E$:

$$ P_{\rm router}=dE $$

“只选 $k$ 个专家”不代表路由器只计算 $k$ 个分数;这个基础实现先给全部 $E$ 个专家打分,再选 top-k。

没有共享专家时,一层 MoE 的总参数和每 token 激活参数分别为:

$$ P_{\rm block,total}=P_{\rm attn}+EP_e+dE+2d $$

$$ P_{\rm block,active}=P_{\rm attn}+kP_e+dE+2d $$

如果还有 $E_s$ 个始终执行、每个中间维度为 $m_s$ 的共享专家,两式都加 $E_s3dm_s$。额外共享专家 gate 要单独加。层间配置不同时,应逐层求和,不要强行乘同一个 $L$。

若 $L_D$ 层 Dense、$L_M$ 层 MoE,$L=L_D+L_M$,共享部分相同时:

$$ P_{\rm total}=L(P_{\rm attn}+2d)+L_D3dm+L_M(3Edm_e+dE)+d+cVd $$

每 token 激活参数的常用整模块口径,就是把其中的 $E$ 个专家换成 $k$ 个,其他项保持不变。

4 激活参数量的统计口径

一种常见的整模块统计口径是:非专家模块计入,加上每层被选中的专家。这适合描述稀疏程度,但不等价于这个 token 真正读过多少 bytes,也不严格等价于 FLOPs 的一半。

有两个容易忽略的边界:

  1. 输入 Embedding 是查表,一次只读一个 $d$ 维向量;整模块统计可能仍把 $Vd$ 全部列入。
  2. 单次 batch 中,不同 token 可选中不同专家。batch 使用的专家权重并集,可能远多于单 token 的 $k$ 个专家。

因此可以报告“按整模块口径的激活参数”,并在估算 FLOPs 时改用实际执行的矩阵乘法。本文用 $P_{\rm lin}$ 表示一个 token 在各 block 中实际执行的线性层权重数量之和,不包括 Norm、输入查表与 LM Head;输出层另计。

对固定 top-k 的 MoE:

$$ P_{\rm lin}=\sum_{\ell=1}^{L}\left(P_{{\rm attn},\ell}+P_{{\rm FFN,active},\ell}+P_{{\rm router},\ell}\right) $$

激活专家数量固定时,路径的参数数量可以固定,但专家身份不断变化。若路由允许丢 token、动态选择数量或专家大小不同,还需要明确实际路由结果。

5 新增一个 token 到底增加什么

题目实际含义 答案
在已有词表内多输入或生成一个 token 参数增加 0
多处理一个 token 会使用多少权重 Dense/MoE 的每 token 激活路径,需说明统计口径
多缓存一个 token 每层新增 K 和 V,共 $2Lh_{kv}d_h$ 个元素
向词表添加一个新的词条 绑定时加 $d$,不绑定时加 $2d$;若有输出 bias 再加 1
多一个位置的 hidden state 单个 hidden tensor 增加 $d$ 个激活元素,不是完整显存增量

新增词条的公式是假定精确增加一行;实际实现可能按硬件倍数扩展词表容量。

6 量级判断

Dense 模型固定 $m/d$、head 比例和词表时,block 参数大体随 $Ld^2$ 增长。层数翻倍,block 参数翻倍;宽度翻倍且 FFN 随之翻倍,block 参数约四倍。Embedding 随 $Vd$ 变化,因此整模型不是严格四倍。

对于 FFN 主导的 MoE,增大 $E$ 主要增大存储,增大 $k$ 主要增大每 token 专家计算。总参数 40B、激活参数 10B 的模型,不能只准备 10B 权重的存储就假定能够完整常驻运行。

下一章:KV Cache 与显存。