跳转至

第 10 章 扩容

本章继续讨论扩容的可能性

10.1 宽度扩容

改变

之前,稠密 7B / 13B / 70B 的升级路径很直接:加宽加深,\(P\) 上升,Decode 每步仍约走完全部参数。训练贵,上线后每一次生成也贵。

现在,MoE 把每层 FFN 换成 \(N\) 个专家,每个 token 只激活 \(k\) 个(外加可选的共享专家)。于是出现两个必须分开读的数字:

量 决定什么 MoE 下的典型行为
\(P_{\text{total}}\) 权重显存、知识容量上限 随专家数上去,可达同代稠密的数倍到一个数量级以上
\(P_{\text{active}}\) 每 token 近似计算量 约按 \(k/N\) 卡住,可接近一个中小稠密模型

Mixtral 一类「8 专家选 2」总参约数十 B、激活约十余 B;DeepSeek-V3 一类总参六百B量级、激活约数十B

10.2 深度扩容

宽度扩容解决「同样激活下多装知识」。另一条路是把 层数 \(L\) 做大:残差栈变长,表示可以多经几层变换;Decode 也要多穿这几层,延迟大致随 \(L\) 上涨。

这里要和「循环多跑几遍」分开。

层复用 / 循环深度:栈里仍是那一组层参数,前向时对同一组权重多调用几次。\(P\) 可以不变,变的是每 token 算力与有效深度。这才是「循环多一点」。

深度扩容(depth up-scaling):栈里真的多出层。工业常见做法是:取已训好的 checkpoint,把中间若干层深拷贝一份插回栈中,\(L\) 变大,总参数也随拷贝上去;再继续预训练或退火,让两份拷贝在梯度下分开。新层不是运行时借原层绕一圈,而是权重表上多出来的条目。

10.3 知识扩容:外部记忆 / 查表大参数

FFN 把大量统计知识压进矩阵乘。另一条路是把知识放进 可检索的大表:用当前隐状态生成 query,取表中最相关的少数 value,加回残差。参数可以加到极大,单步算术却接近「算相似度 + 加权求和」,而稠密 \(d\to d_{\mathrm{ff}}\to d\) 那三块大矩阵可以变瘦或少堆。

由于访存不规则,GPU 上不如 GEMM 友好;表很大时还要分布式存储与一致性更新。它和 MoE 同属「稀疏用参」,粒度不同——专家是一小片 FFN,记忆项可以小到一条向量。

10.4 Scaling Law

核心:经验规律,自回归预训练模型的损失随参数量 N、训练 token 数 D、算力 C呈幂律下降。

  • 2020 Kaplan 早期观点:算力优先,侧重堆参数量。
  • Chinchilla(DeepMind 2022,既是 70B 模型,也是修正后的缩放法则):固定算力预算,参数与训练 token 要同比例放大,经验最优配比≈1 参数配 20 个 token。同等算力下 70B Chinchilla 效果强于 280B Gopher,证明之前很多大模型参数大、数据不足,属于欠训练。

局限:仅针对文本预训练;高质量文本数据存在上限,稠密模型单纯堆规模的边际收益下滑。

注意,稠密大模型无脑扩规模的时代已经过去,虽然缩放思想仍有效,但技术发展逐渐转变成 MoE 稀疏、测试时算力增强、多模态 scaling、合成高质量数据;同时追求小模型高效训练。当然,我觉得量变到质变的涌现还未到来,说明模型算法还有精进的地方。


核心问答

Q1:为什么说 MoE「改变了现代大模型」,而不是又一个可选插件? 因为它改了默认的扩容方程:旗舰用总参描述容量、用激活描述逐步成本;开源前沿配置里专家字段与层宽、层数同等常见。插件改的是局部算子,MoE 改的是整条产品线的账本。

Q2:深度扩容之后,每 token 计算会怎样变? 层数变多,Decode 要多穿若干层,计算与延迟大致随 \(L\) 上涨。它把模型做深、做大参数,并不自动给出 MoE 那种激活稀疏。若要又深又省,需要深度轴与宽度轴叠用。

Q3:复制出来的新层不继续训能用吗? 能前向,质量不会按深度比例变好。两份相同层只是重复同一变换;分化依赖后续梯度更新。扩容解决的是初始化成本,不解决数据与训练步数。

Q4:记忆层的参数算进 \(2P\) 吗? 估算力时应按每步实际碰到的参数(query 投影、top-\(k\) 条 value、输出投影等)。估显存则仍要按整张表是否常驻来算。与 MoE 一样:总量和激活量分开报。

Q5:Scaling Law 是否已经过时? 配比数字随数据质量、合成数据、稀疏结构在更新,但「参数–数据–算力要联合规划」没有作废。过时的是把「只加大稠密 \(P\)」当成唯一缩放旋钮;MoE 与记忆层正是在同一底座上换了旋钮组合。