MLA 中的 \(c^{KV}\)、LatentMoE 中的 latent token,以及 Kimi K3 里的 LatentMoE,都围绕同一个词:latent。它不是某个模型特有的技巧,而是一个可以单独定义的数学对象。本节先给出 latent 的定义,再解释为什么要在 GEMM 两侧插入 latent,以及它在数学层面改变了什么。
Latent 表示的定义
给定输入 \(X \in \mathbb{R}^{T \times H}\),其中 \(T\) 是 token 数、\(H\) 是 hidden size。latent 表示指的是一个维度更低的中间变量 \(Z \in \mathbb{R}^{T \times L}\)(\(L < H\)),以及一对映射 \(\operatorname{Enc} : \mathbb{R}^{H} \to \mathbb{R}^{L}\) 和 \(\operatorname{Dec} : \mathbb{R}^{L} \to \mathbb{R}^{H}\):
\[ Z = \operatorname{Enc}(X), \qquad \hat{X} = \operatorname{Dec}(Z). \]
这个定义本身很空泛,真正决定含义的是三个问题:
- 压缩的是什么? 是整个 token 的 hidden state,还是 attention 的 K/V,还是专家计算使用的表示?
- latent 在哪里被物化? 是写进 KV cache 长期保存,还是只在一次前向中短暂存在?
- 谁在读取 latent? 后续计算直接在这个低维空间中完成,还是立刻展开回 \(H\) 维?
“用了 latent”这句话本身并不蕴含任何显存或计算收益。收益来自 \(L\) 的大小、压缩与展开的次数,以及低维表示被复用的范围。后面的公式会用统一的语言量化这三点。
与低维流形假设的区别
latent 只说明中间经过了一个更窄的变量,不蕴含输入数据一定位于某个低维流形上。数学上的硬约束来自映射的结构,而不是来自 \(L < H\) 这个事实本身:线性 latent 约束的是秩,带非线性的 latent 约束的是每层线性算子的内部宽度。
GEMM 两侧的 latent 与低秩分解
先看最简单的形式。一个标准线性层写作
\[ Y = X W^{\mathsf T}, \]
其中 \(X \in \mathbb{R}^{T \times H}\)、\(W \in \mathbb{R}^{N \times H}\)、\(Y \in \mathbb{R}^{T \times N}\)。在它的两侧插入 latent,就是把一次 GEMM 拆成两次:
\[ Z = X W_{\mathrm{down}}^{\mathsf T}, \qquad \hat{Y} = Z W_{\mathrm{up}}^{\mathsf T}, \]
其中
\[ W_{\mathrm{down}} \in \mathbb{R}^{L \times H}, \qquad W_{\mathrm{up}} \in \mathbb{R}^{N \times L}. \]
由于矩阵乘法满足结合律,
\[ X W^{\mathsf T} = X \left( W_{\mathrm{up}} W_{\mathrm{down}} \right)^{\mathsf T}, \]
所以这条路径计算的仍然是一个普通线性层,只是它的权重被限制为
\[ W_{\mathrm{eff}} = W_{\mathrm{up}} W_{\mathrm{down}} \in \mathbb{R}^{N \times H}, \qquad \operatorname{rank}(W_{\mathrm{eff}}) \le L. \]
这就回答了”一个 GEMM 为什么要加一个 latent”:它把一个原本有 \(NH\) 个自由度的矩阵,换成了秩被 \(L\) 卡住的矩阵,用表达能力换取参数量和计算量。latent 没有引入新的运算类型,它引入的是一个参数化约束。
给定权重时的最优 latent
如果问题不是训练一个新矩阵,而是近似一个已经给定的 \(W\),那么最优的秩 \(L\) 近似由 SVD 截断给出(Eckart–Young 定理)。设
\[ W = U \Sigma V^{\mathsf T}, \qquad W_L = U_L \Sigma_L V_L^{\mathsf T}, \]
则
\[ \lVert W - W_L \rVert_F^2 = \sum_{i=L+1}^{r} \sigma_i^2, \]
且最优分解可以取
\[ W_{\mathrm{up}} = U_L \Sigma_L^{1/2}, \qquad W_{\mathrm{down}} = \Sigma_L^{1/2} V_L^{\mathsf T}. \]
这给出了一个可直接执行的判据:查看 \(W\) 的奇异值谱。如果
\[ \frac{\sum_{i > L} \sigma_i^2}{\sum_{i} \sigma_i^2} \]
已经很小,那么秩 \(L\) 的 latent 路径几乎不损失信息;如果谱尾部能量很大,瓶颈 \(L\) 就会成为真实的性能上限。能否压缩是谱的性质,不是维度的性质。
需要注意,真实训练中并不存在一个给定的 \(W\),\(W_{\mathrm{up}}\) 与 \(W_{\mathrm{down}}\) 是和整个网络一起端到端学习的。SVD 只能给出”给定矩阵”意义下的最优近似,不能保证是网络层面的最优解。
中间插入非线性之后
如果 latent 两侧之间还夹着非线性,例如
\[ f(X) = \sigma\!\left( X W_{\mathrm{down}}^{\mathsf T} \right) W_{\mathrm{up}}^{\mathsf T}, \]
那么复合映射不再是一个低秩线性映射,上面的秩结论对整体函数不再成立。此时保留下来的是一条局部结论:在任意点 \(x\),该函数的 Jacobian 为
\[ J_f(x) = W_{\mathrm{up}} \operatorname{Diag}\!\left( \sigma'\!\left( W_{\mathrm{down}} x \right) \right) W_{\mathrm{down}} \in \mathbb{R}^{N \times H}, \qquad \operatorname{rank}(J_f(x)) \le L. \]
也就是说,瓶颈限制的不是网络的整体表达能力,而是每个线性算子可以使用的内部方向数。这正是 LatentMoE 的形态:down projection、专家内部的非线性、up projection 三层结构,\(L\) 约束的是专家每一层线性权重的内部宽度。
参数量与计算量
单层线性层
原路径的参数量与每个 token 的 FLOPs 分别为
\[ P_{\text{base}} = NH, \qquad F_{\text{base}} = 2THN. \]
latent 路径为
\[ P_{\text{latent}} = LH + LN = L(H + N), \qquad F_{\text{latent}} = 2THL + 2TLN = 2TL(H + N). \]
两者给出同一个压缩比:
\[ \frac{P_{\text{latent}}}{P_{\text{base}}} = \frac{F_{\text{latent}}}{F_{\text{base}}} = \frac{L}{H} + \frac{L}{N}. \]
这个式子值得记住:压缩比由两项组成,一项来自 \(H \to L\) 的压缩,另一项来自 \(L \to N\) 的展开,两者都正比于 \(L\)。令比值小于 1,得到盈亏平衡条件
\[ L < \frac{HN}{H + N}, \]
即 \(L\) 必须小于 \(H\) 与 \(N\) 的调和平均数的一半。当 \(H = N\) 时,条件退化为
\[ L < \frac{H}{2}. \]
换句话说,latent 只比 hidden size 小一点时,先压缩再展开反而比直接算更贵。
MoE 中的摊销
设每个专家是一个两层 FFN,输入输出宽度为 \(H\)、中间宽度为 \(N\),共有 \(E\) 个专家、每个 token 激活 \(k\) 个。普通 MoE 的全部参数为
\[ P_{\text{base}} = 2ENH, \]
而 LatentMoE 把共享的 down/up projection 加在两侧、让专家在 latent space 中工作之后,
\[ P_{\text{latent}} = 2LH + 2ENL, \]
因此
\[ \frac{P_{\text{latent}}}{P_{\text{base}}} = \frac{2LH + 2ENL}{2ENH} = \frac{L}{EN} + \frac{L}{H}. \]
每个 token 的激活计算量(只算被选中的 \(k\) 个专家)有同样的结构:
\[ F_{\text{base}} = 4kTHN, \qquad F_{\text{latent}} = 4THL + 4kTLN, \]
\[ \frac{F_{\text{latent}}}{F_{\text{base}}} = \frac{L}{kN} + \frac{L}{H}. \]
把三种场景放在一起对比:
| 场景 | 压缩比 | 摊销效果 |
|---|---|---|
| 单层线性层 | \(\frac{L}{H} + \frac{L}{N}\) | 没有可摊销的对象 |
| MoE 全部专家参数 | \(\frac{L}{H} + \frac{L}{EN}\) | 共享投影被 \(E\) 个专家分摊 |
| MoE 每 token 激活计算 | \(\frac{L}{H} + \frac{L}{kN}\) | 只有 top-\(k\) 个专家参与 |
三行的第一项都是 \(L/H\),第二项的分母被复用次数放大。这就是为什么 latent 在 MoE 里比在单层 dense 层里更有吸引力:同一个 down/up projection 被所有专家共享,\(E\) 和 \(k\) 越大,\(\frac{L}{EN}\) 与 \(\frac{L}{kN}\) 越接近零,压缩比趋近理想值 \(L/H\)。反过来,单个矩阵没有摊销对象,只能靠 \(N\) 本身足够大来压低 \(L/N\) 这一项。
也要注意反例:当 \(L\) 接近 \(H\) 时,三次 GEMM 的总量加上中间张量的读写会超过原来的一次 GEMM。所以问题通常不是”要不要加 latent”,而是”\(L\) 取多少”。
显存与带宽
latent 同时改变了几种不同性质的资源占用,需要分开看:
- 常驻权重:\(L(H + N)\) 替代 \(NH\),减少的是参数存储;
- 每次前向的权重读取:与常驻权重同阶,减少的是权重带宽;
- 中间张量:latent 会引入 \(T \times L\) 的临时 workspace,通常远小于原来的 KV cache 或专家输出;
- 长期保存的表示:如果 latent 需要缓存(例如 MLA 的 \(c^{KV}\)),节省体现在缓存容量与 decode 阶段的读取带宽上,而不是当次的 GEMM 计算量;
- 跨设备通信:如果 latent 是 EP dispatch 的载荷(例如 LatentMoE),节省体现在 All-to-All 的字节数上。
一个容易混淆的点是:latent 不自动减少 FLOPs。它减少的是被压缩那个 GEMM 的 FLOPs,但会新增两次投影 GEMM,只有 \(\frac{L}{H} + \frac{L}{N} < 1\) 时净计算量才下降。
表达能力与信息瓶颈
秩上限
纯线性 latent 路径的输出只能落在 \(W_{\mathrm{down}}\) 行空间张成的 \(L\) 维子空间中:
\[ W_{\mathrm{eff}} = W_{\mathrm{up}} W_{\mathrm{down}}, \qquad \operatorname{rank}(W_{\mathrm{eff}}) \le L. \]
这意味着下游计算只能读取 hidden space 中 \(L\) 个方向的信息,剩下的 \(H - L\) 个方向对这一分支不可见。是否可接受,取决于被压缩对象的信息是否真的集中在这 \(L\) 个方向上,这又回到前面的谱判据。
信息瓶颈的下界
对固定目标 \(W\),误差下界是谱尾部能量
\[ \sum_{i > L} \sigma_i^2. \]
这是一个与训练过程无关的下界:无论怎样优化 \(W_{\mathrm{up}}\) 和 \(W_{\mathrm{down}}\),只要 \(L\) 固定,都无法突破。这个下界在 \(L\) 很小时增长很快,所以瓶颈最直接的影响是模型容量。
在带非线性的结构里,通用逼近性仍然成立,表达能力的损失更多表现为优化难度上升和有效宽度下降,而不是某类函数完全无法表示。
尺度对称与非凸性
参数化 \((W_{\mathrm{up}}, W_{\mathrm{down}}) \mapsto W_{\mathrm{up}} W_{\mathrm{down}}\) 不是单射。对任意可逆矩阵 \(S \in \mathbb{R}^{L \times L}\),
\[ (W_{\mathrm{up}} S)\,(S^{-1} W_{\mathrm{down}}) = W_{\mathrm{up}} W_{\mathrm{down}}. \]
也就是说,同一组有效权重对应无穷多组因子参数,多出的自由度有 \(L^2\) 个。这带来几个后果:
- 目标函数在因子参数空间中是非凸的,会出现鞍点和平台;
- 两个因子的尺度可以相互补偿(一个变大、另一个变小),权重衰减作用在因子上而不是作用在 \(W_{\mathrm{eff}}\) 上,因此通常需要额外的缩放约定或初始化策略;
- 有效映射的条件数 \(\sigma_1 / \sigma_L\) 直接影响数值稳定性,\(\sigma_L\) 很小时训练更困难。
梯度也停留在低秩流形上
记 \(\mathcal{L}\) 为损失,\(G = \partial \mathcal{L} / \partial W_{\mathrm{eff}}\),由链式法则
\[ \frac{\partial \mathcal{L}}{\partial W_{\mathrm{up}}} = G W_{\mathrm{down}}^{\mathsf T}, \qquad \frac{\partial \mathcal{L}}{\partial W_{\mathrm{down}}} = W_{\mathrm{up}}^{\mathsf T} G. \]
两个梯度矩阵的秩都不超过 \(L\),因此一次梯度更新给出的
\[ \Delta W_{\mathrm{eff}} = \Delta W_{\mathrm{up}} W_{\mathrm{down}} + W_{\mathrm{up}} \Delta W_{\mathrm{down}} \]
是两个秩不超过 \(L\) 的矩阵之和,秩不超过 \(2L\)。这正好是秩 \(L\) 矩阵流形在 \(W_{\mathrm{eff}}\) 处的切空间。换句话说,低秩约束在优化过程中是被解析地保持的:网络不会溢出到 \(L\) 维之外的子空间去。
两个典型应用
MLA:latent 作为可缓存的 KV 表示
沿用 content/theory/attention/mla/index.md
的记号,
\[ c^{KV} = X W_{DKV}, \qquad K_{nope} = c^{KV} W_{UK}, \qquad V = c^{KV} W_{UV}. \]
把 K 与 V 的投影写在一起:
\[ \begin{bmatrix} K_{nope} & V \end{bmatrix} = c^{KV} \begin{bmatrix} W_{UK} & W_{UV} \end{bmatrix}, \qquad \operatorname{rank} \le d_c. \]
它的数学含义是:所有 head 的 key 和 value 都来自同一个 \(d_c\) 维 latent 子空间,head 之间共享的是坐标,而不是输出。
缓存量的差别可以直接算出来。以 DeepSeek-V2 的量级为例,\(d_c = 512\)、rope key 为 64,每 token 每层只需缓存 \(512 + 64 = 576\) 个元素;而 MHA 需要缓存 \(2 n_h d_h = 2 \times 128 \times 128 = 32768\) 个元素,两者相差约 \(57\) 倍。
MLA 与 MQA/GQA 的数学区别也在这里:
- MQA/GQA 减少的是 head 数量,让多个 query head 共用同一个 key/value head,相当于把 K/V 的表示限制在少数几个 head 中;
- MLA 保持 head 数量不变,让所有 head 共享一个 \(d_c\) 维 latent,再各自上投影。head 结构完整保留,被压掉的是 latent 子空间之外的方向。
decode 阶段的权重吸收只是结合律与转置恒等式。设 \(W_K \in \mathbb{R}^{d_c \times d_h}\) 是某个 head 的 key 上投影矩阵,\(c\) 是 latent,则
\[ q^{\mathsf T} \left( W_K c \right) = \left( W_K^{\mathsf T} q \right)^{\mathsf T} c, \]
即 \(\langle q, W_K c \rangle = \langle W_K^{\mathsf T} q, c \rangle\)。query 被先吸收到 latent 空间后,attention 的 key 侧只剩 \(c^{KV}\) 一个”头”,所以 decode 阶段在形式上等价于 MQA;但 value 路径满足
\[ \sum_s a_s W_V c_s = W_V \left( \sum_s a_s c_s \right), \]
说明 head 的上投影可以推迟到最后再做,因此效果上仍然接近 MHA。
有一点必须区分:MLA 的压缩收益是缓存容量与 decode 阶段的读取带宽。prefill 阶段 q_len 与 kv_len 同阶,MLA 走的就是 MHA 路径,压缩并不带来计算量收益;只有在 decode 阶段缓存被反复读取时,latent 才真正体现价值。
LatentMoE:latent 作为共享的专家工作空间
LatentMoE 的前向可以抽象为
\[ Z = X W_{\mathrm{down}}^{\mathsf T}, \qquad Z' = \sum_{e \in \mathcal{S}(X)} \alpha_e(X) f_e(Z), \qquad Y = Z' W_{\mathrm{up}}^{\mathsf T}. \]
路由仍在 hidden space 中完成,被压缩的是专家计算使用的表示:
- \(W_{\mathrm{down}}\) 与 \(W_{\mathrm{up}}\) 由所有专家共享,专家特有的参数位于 latent space 内;
- 专家主体的内部宽度由原来的 \(H\) 变成 \(L\),参数量与 FLOPs 按上一节的公式下降;
- latent 是一次前向中的临时量,不写回缓存,这一点与 MLA 相反。
两者共享同一副骨架:
宽空间输入 X
│ down projection
▼
窄空间表示 Z (维度 L)
│ 在窄空间中重复主要计算
▼
窄空间结果 Z'
│ up projection
▼
宽空间输出 Y
差异可以整理成一张表:
| 维度 | MLA | LatentMoE |
|---|---|---|
| 压缩对象 | K/V 表示 | routed token 表示 |
| 窄空间中的计算 | attention 的匹配与加权 | 专家 FFN |
| latent 是否长期保存 | 是,写入 KV cache | 否,单次前向的临时量 |
| 主要收益 | KV cache 容量与读取带宽 | 专家参数、激活计算与 EP 通信载荷 |
| 是否改变 head 或专家数量 | 不改变 head 数 | 不改变 top-\(k\) |
| 数学约束 | K/V 投影的秩不超过 \(d_c\) | 专家线性层的内部宽度为 \(L\) |
LatentMoE 不改变路由的稀疏性,它改变的是被选中的专家在什么坐标空间里工作。
如何判断某个位置该不该加 latent
- 先看谱。 对目标权重做 SVD,计算前 \(L\) 个奇异值的能量占比。谱尾部能量大,说明 \(L\) 会成为硬瓶颈。
- 再算盈亏平衡。 单层 dense 用 \(L < \frac{HN}{H+N}\);MoE 用 \(\frac{L}{H} + \frac{L}{kN} < 1\)(激活计算)或 \(\frac{L}{H} + \frac{L}{EN} < 1\)(全部参数)。
- 确认有摊销对象。 同一个 latent 被多少下游计算复用?MLA 里是所有 head 与所有历史位置,LatentMoE 里是所有专家。复用次数越多,收益越接近理想的 \(L/H\)。
- 确认收益类型。 是省缓存(MLA)、省参数与计算(LatentMoE),还是省通信?三者不能混为一谈。
- 检查实现代价。 latent 引入的 GEMM 维度小,在 decode 场景可能受 kernel launch 和带宽限制,实际是否更快取决于融合程度与 batch size。
- 检查精度敏感度。 attention 的 K/V 与专家中间表示通常能承受压缩,输出 logits 或需要精确复现的路径通常不能。
一个经验判据是:只有当 \(L\) 足够小、下游计算能在窄空间中完整完成,并且低维表示被大量复用时,latent 才值得引入。仅仅”中间过一层窄表示”并不构成优化。
与 LoRA、SVD 的关系
| 方法 | 数学形式 | 低秩结构扮演的角色 |
|---|---|---|
| SVD 截断 | \(W_L = U_L \Sigma_L V_L^{\mathsf T}\) | 对给定 \(W\) 的最优秩 \(L\) 近似 |
| LoRA | \(W + BA\),\(\operatorname{rank}(BA) \le r\) | 在满秩原矩阵上增加低秩增量 |
| latent 路径 | \(W_{\mathrm{up}} W_{\mathrm{down}}\)(中间可带非线性) | 用低秩形式替代原计算 |
三者都用到”两个瘦矩阵相乘”,差别在于低秩结构是替代、修正还是近似:
- LoRA 的总矩阵秩不低于原矩阵,只是少学了增量部分;
- latent 路径的秩上界就是 \(L\),压缩更彻底,代价也更直接;
- SVD 是事后近似,latent 是事前设计,\(W_{\mathrm{up}}\) 与 \(W_{\mathrm{down}}\) 与网络其余部分一起训练。
常见面试问题
- 为什么在 GEMM 两侧插入 latent 会同时降低参数量和 FLOPs?压缩比是多少,什么时候反而更贵?
- 一个秩 \(L\) 的 latent 路径在数学上被限制在哪一类函数里?如果中间插入非线性,这个限制还在吗?
- latent 的 \(W_{\mathrm{up}} W_{\mathrm{down}}\) 参数化存在什么对称性?它对优化和权重衰减有什么影响?
- MLA 与 MQA 都减少了 K/V 信息,在数学上的区别是什么?
- MLA 的 decode 阶段为什么可以等价成 MQA?用到了哪条矩阵性质?
- LatentMoE 的收益为什么会随专家数 \(E\) 和 top-\(k\) 变化?
- 给定一个训练好的权重矩阵,如何估计需要多大维度的 latent?
小结
- latent 的数学本质是”低维中间变量 + 一对压缩/展开映射”;在纯线性情形下,它等价于秩不超过 \(L\) 的矩阵分解。
- 参数量与计算量的压缩比是 \(\frac{L}{H} + \frac{L}{N}\),在 MoE 中被 \(E\) 或 \(k\) 进一步摊销;盈亏平衡点约为 \(L < \frac{HN}{H+N}\)。
- 数学代价是秩上限与信息瓶颈,误差下界由奇异值谱尾部给出;非线性保留了通用逼近性,但局部 Jacobian 的秩仍被 \(L\) 限制。
- 因子参数化是非凸的,存在 \(L^2\) 维的尺度冗余,梯度更新停留在秩 \(2L\) 的切空间内。
- MLA 用它压缩 KV cache 并用结合律做权重吸收,LatentMoE 用它构造共享的专家工作空间,两者共享同一个”先压缩、在窄空间计算、再展开”的骨架。