K3 架构图解
从一个 token 的计算,
理解专家、注意力与深度信息的演进。
K3 把几条研究路线组合在一起:KDA 与 MLA 处理历史信息,Stable LatentMoE 让一部分前馈参数按需工作,AttnRes 组织深层网络中的信息传递。理解它们,先要分清位置、专家与层这三个对象。[1] [4]
先看全景:第 1–9 章在架构中的位置
从文本主干到一层,再定位注意力、专家和深度连接。
先沿上方看完整流程,再看下方放大的一层。第 1 章说明层的骨架,第 3 章说明深度连接;第 2、4–6 章展开前馈,第 7–9 章展开序列混合。点击图中的章节标签即可跳转。
文本输入经过词嵌入、93个完整层、最终深度读取与归一化、词表投影,得到下一个token的分布。第8章定位KDA与MLA的层间排布。下方放大一个块内MoE层:第1章说明序列混合后接前馈的骨架,第3章在两个子层入口分别组合同一位置的早期块与当前累计。序列混合中,第7章解释MLA缓存与MHA/GQA/MQA对照,第9章解释KDA的顺序线索与后续MLA使用NoPE。前馈中,第2章说明Router选择与合并专家,第6章控制选择偏置,第5章将路由专家放在降维和升维之间,第4章说明专家内部的门控函数。共享支路保持全宽。图为章节定位总览,省略归一化和残差累计的细部连线。
一层 Transformer 里发生什么
先看完整模块,再理解层数、子层与深度块的计数。
先认清来源,再分清作用:读历史位置、取回早期深度、接受前馈加工。 FIG 01 / 信息来源 一个 token,从哪三处取信息 先认清来源,再分清作用:读历史位置、取回早期深度、接受前馈加工。 表示 专家 深度 计算 同一 token 的更早深度 更早块 b₁ 更早块 b₂ 更早块 b₃ 取回早期表示 AttnRes 历史 token 序列 读历史位置 x₁ x₂ x₃ … xₜ₋₁ 当前 token 表示 xₜ MoE 路由专家 被选中的前馈参数加工它 E1 E2 E3 E4 E5 E6 E7 E8 返回加工结果 专家不参与 token 间的 attention 横向:序列位置 三路影响同一份表示 左边读位置,上边读深度,右边由专家做前馈变换。 三路的作用机制不同;箭头不表示三路在同一时刻简单相加。 依据:Kimi K3 技术报告 §2.1–2.3。专家数量为示意,完整层位置见 FIG 02。
设一句话有 T 个 token,每个 token 由 d 个数表示,输入就可以排成一张 T×d 的表。每一行对应一个 token,每一列对应一个特征坐标。 每一层接收这张表,更新每一行的特征,输出仍保持 T×d。序列混合子层允许信息沿位置流动;前馈子层逐个位置加工特征。两者再配合归一化与深度信息通路。[6] [3]
FIG 02,一层中的序列混合、前馈与深度读取。示意块内流程。第一次深度读取组合已保存的早期块与当前累计,归一化后进入 KDA 或 MLA;子层输出与旁路保留的旧累计相加。第二次深度读取使用更新后的累计与早期块,归一化后进入 MoE;输出再次与旧累计相加。固定同一 token 位置读取不同深度;其他 token 也参与计算,图中省略其连线。跨块时先保存旧块再开始新累计。首层前馈使用 Dense FFN。
把层内流程与坐标放在一起看:沿着多个矩形移动,改变的是 token 位置;沿着层向下移动,改变的是处理深度;进入一个矩形内部,才是在看它的特征坐标。
固定一层看横向;固定一个 token 位置看纵向;放大一个矩形再看它内部的数值。 FIG 03 / 三个维度 三个维度:序列位置、网络深度、特征分量 固定一层看横向;固定一个 token 位置看纵向;放大一个矩形再看它内部的数值。 表示 专家 深度 计算 token 序列 位置 1 位置 2 位置 3 位置 t 较浅层 x₁ x₂ x₃ xₜ 中间层 x₁ x₂ x₃ xₜ 更深层 x₁ x₂ x₃ xₜ 当前层 x₁ x₂ x₃ xₜ 网络深度 固定位置 t 放大当前 token 的完整向量 xₜ 内部小格 = 特征分量 它们属于同一个 token。 这里的 8 格只是示意, 小格表示特征分量。 横向换位置,纵向换深度,框内部才是特征维度。 蓝色矩形是一份完整 token 表示;橙色标出同一位置在更早深度的表示。 维度示意:特征格数量不对应 K3 的实际隐藏维数。
X下一层 = X′ + FFN(Norm(X′))
“93 层”按完整 Transformer 层计数。在 K3 中,每个完整层都有一个序列混合子层和一个前馈子层。KDA/MLA 决定前半部分的类型,稠密 FFN/MoE 决定后半部分的类型。每个层号下会同时出现这两种信息。[2] [3]
| 名称 | 它指什么 | K3 中如何计数 |
|---|---|---|
| Transformer 层 | 一个序列混合子层 + 一个前馈子层,含相应归一化与深度连接 | 共 93 层 |
| MoE 专家 | 前馈子层内部的一套可训练矩阵 | 每个 MoE 子层有自己的专家集合 |
| AttnRes 深度块 | 把若干完整层的子层输出汇成一个摘要 | 每 12 个完整层一块;末块 9 层 |
MoE:每个 token 选择少数前馈网络
先理解一个小型八选二模型,再看 896 选 16。
普通前馈网络让所有 token 使用同一套矩阵。混合专家(Mixture of Experts,MoE)准备多套前馈网络,并增加一个路由器 Router。路由器根据当前 token 的表示为每个专家打分,选中少数专家执行计算,最后把它们的输出加权合并。这里讨论的是 token 选择专家的稀疏 MoE。[14] [15]
不同 token 可以调用不同的前馈子网络;这就是按输入选择计算的条件计算。 FIG 04 / 条件计算 MoE:扩大总容量,每个 token 只算一部分 不同 token 可以调用不同的前馈子网络;这就是按输入选择计算的条件计算。 表示 专家 深度 计算 总容量要大,单次计算要省 Dense FFN / 稠密前馈 xₜ 本层同一套 FFN 每个 token 都使用这一整套前馈参数 MoE / 稀疏专家前馈 xₜ 选择 扩大专家池,每次只调用其中少数 总参数容量与单次激活量可以分开扩展。 专家分工由训练形成,无需手工命名。 01 打分 xₜ 路由器 1 2 0.9 3 4 5 6 7 0.6 8 8 个专家的示例分数 02 选择 选前 k 个:E2、E7(k = 2) 03 变换 E2 E7 E₂(xₜ) E₇(xₜ) 04 聚合 yₜ = 0.6 E₂(xₜ) + 0.4 E₇(xₜ) 条件计算让总容量更大,同时让单个 token 只调用少数专家。 专家无需预设“数学组”“写作组”;分工和路由一起从训练中形成。 示例为 8 选 2,分数与权重为教学设置;实际 K3 为 896 选 16,并另有共享支路。
pⱼ = sⱼ / Σᵢ∈A sᵢ,yₜ = Σⱼ∈A pⱼ Eⱼ(xₜ)
示例:p₂ = 0.9 / 1.5 = 0.6,p₇ = 0.6 / 1.5 = 0.4
为什么 MoE 值得单独学
模型想要更多参数容量,算力预算却有限。MoE 提供一条折中路:准备很多前馈参数,但让单个 token 只调用其中一小部分。
输入分布本身具有差异。不同 token 对变换的需求并不完全一样,路由器才能把它们送往不同专家,让专家逐渐出现专门化。
专家多了,负载均衡、跨设备通信和工程实现会变复杂。MoE 的账,从来不只是一条 FLOPs 公式,还包括路由是否均匀、内核是否高效。
“专家”是训练产生的功能分工。每个 Eⱼ 都有自己的权重,经过路由分到不同的输入,逐渐形成不同的处理偏好。这个名字无需对应“数学专家”“法律专家”等人工标签,单个专家也没有独立的聊天过程。
稀疏计算节省哪部分?
假设每个专家的计算量相近,准备 N 个专家、每次激活 k 个:专家总参数随 N 增加,每个 token 的专家计算主要随 k 增加。训练一批 token 时,不同 token 可以激活不同专家,因此多数专家仍可能在这一批中得到训练。
| 关注的问题 | 主要取决于什么 |
|---|---|
| 模型能容纳多少专家参数 | 全部 N 个专家的权重规模 |
| 一个 token 实际经过多少专家计算 | 选中的 k 个专家,另加 Router、共享支路与投影 |
| 权重需要多少存储或跨设备部署空间 | 全部专家及部署方式;低激活比例不会自动免除权重存储 |
| 实际运行速度 | 矩阵大小、批量、设备通信、负载均衡与内核效率 |
K3 在每个 MoE 子层配置 896 个路由专家,每个 token 激活 16 个,并保留两个全宽共享专家的等效前馈容量,供每个 token 使用。专家先读哪种宽度的向量、共享支路如何连接,将在 LatentMoE 章节展开。[2] [3]
AttnRes:重新读取较早深度的信息
先理解残差累加,再看按内容选择,以及为什么需要分块。
普通残差连接写作 h下一步 = h + F(h)。F(h) 是当前子层产生的新信息,h 保留之前的信息。连续展开后,深度输入可以写成输入嵌入与各个早期子层输出的总和。这条直接相加的通路有助于训练深层网络,但所有来源逐渐汇入一条状态,后续子层对来源的选择不够直接。[22] [25]
固定 token 位置 t,只沿网络深度比较:已有信息是直接累计,还是按内容重新加权。 FIG 05 / 深度读取 AttnRes:同一位置,怎样取回早期表示 固定 token 位置 t,只沿网络深度比较:已有信息是直接累计,还是按内容重新加权。 表示 专家 深度 计算 全图固定同一 token 位置 t 普通残差:直接累加 子层输出随输入变化,加法系数为 1 AttnRes:按内容加权 权重随输入内容改变 已有表示 h₀ 累计表示 h₁ 当前表示 h₂ + 子层输出 f₀(h₀) × 1 + 子层输出 f₁(h₁) × 1 深度 更早块 b₀ 更早块 b₁ 当前块累计 b₂ 按内容加权 Σ αᵢ bᵢ 当前子层输入 读取同一位置的块表示 AttnRes 回取同一个 token 的不同深度表示,不读取别的 token。 普通残差的加法系数固定;AttnRes 按内容计算权重。K3 使用块内累计、跨块加权的分块版本。 依据:Attention Residuals、K3 报告 §2.2、官方 _apply_attn_res。
Attention Residuals(AttnRes)让每个子层读取较早深度的输出,并给这些来源分别赋权。它沿深度进行选择。普通序列注意力的候选来源是不同 token,AttnRes 的候选来源是同一 token 在不同深度留下的表示。[22] [25]
aᵢ,ₗ,ₜ = exp(eᵢ,ₗ,ₜ) / Σⱼ exp(eⱼ,ₗ,ₜ)
hₗ,ₜ = Σᵢ aᵢ,ₗ,ₜ uᵢ,ₜ
注意权重的产生方式:同一个子层可以对不同 token 给出不同的深度权重,因为 uᵢ,ₜ 不同。RMSNorm 用于计算匹配分数,减弱大幅度来源对分数的支配;加权合并时使用对应的原始来源向量。[25]
为什么把若干层汇成一个块?
逐一保存所有早期子层输出,会增加激活存储与跨设备传递的负担。Block AttnRes 将一段深度内的子层输出相加,保存为一个块摘要;同时维护当前块尚未完成的部分和。下一个子层读取“输入嵌入、已完成块摘要、当前部分和”这些来源。[4] [25]
这里展示两个完成块与一个进行中的块。一次读取后,Attention 或 FFN 产生的新输出会继续加入当前部分和;跨块边界时,将该块摘要保存,再开始新的部分和。[3] [25]
K3 的 93 层分成 7 个完整的 12 层块与最后一个 9 层块。再计入输入嵌入,最终聚合可以看到 9 个深度来源。这些深度摘要仍然保留 token 轴,逐个 token 位置分别计算,整句不会在这里被压成一个向量。[2] [4]
一个专家内部:GLU → SwiGLU → SiTU
沿着两条分支看函数如何改变,先把“门”具体化。
在一个专家内部,输入 x 经过两次不同的线性投影,得到同样长度的 a = Wg x 与 b = Wu x。把 b 当作要传递的值,门控函数 g(a) 用来逐坐标调节它。对应坐标相乘后,还要经过输出矩阵 Wd,回到输入宽度。下面统一省略偏置项。[17] [18]
三行保持相同的双分支骨架。GLU 用 Sigmoid 门;SwiGLU 在门内引入 a;SiTU-GLU 同时压缩门控和值支路的动态范围。[17] [18] [1]
GLU 中间量:z = σ(a) ⊙ b
SiLU(a) = a ⊙ σ(a)
SwiGLU 中间量:z = SiLU(a) ⊙ b
完整 FFN:E(x) = Wd z
曲线由所示公式计算。SiLU 的大正输入近似线性增长;SiTU 的大正输入平滑接近 4。两者的门控值可以为负,不能直接当作概率使用。[18] [1]
| 门控输入 a(值分支固定 b=3) | GLU 的 z | SwiGLU 的 z | SiTU-GLU 的 z |
|---|---|---|---|
| -2 | 0.358 | -0.715 | -0.658 |
| 0 | 1.500 | 0.000 | 0.000 |
| 2 | 2.642 | 5.285 | 4.861 |
| 8 | 2.999 | 23.992 | 11.509 |
例如 a=2、b=3 时,GLU 用 σ(2)≈.881 调节值;SwiGLU 用 2σ(2)≈1.762 调节值,输出因此可以大于 b。SwiGLU 保留更大的正向动态范围,同时也允许两条大数分支在同一坐标相乘。这一放大路径是 K3 希望控制的对象。[18] [1]
SiTU-GLU 在相乘之前限制两条支路
SiTU(a) = 4 tanh(a/4) ⊙ σ(a)
z = SiTU(a) ⊙ [25 tanh(b/25)]
E(x) = Wd z
双支路限幅约束相乘后的中间坐标。Wd 会重新组合这些坐标,完整专家的输出还取决于 Wd 的权重大小。[1] [3]
为隔离函数形状,令 a=b 且取正值。a=40 时,SwiGLU 中间乘积约 1600,SiTU-GLU 约 92.17;纵轴为对数刻度。[1]
硬截断在阈值外的局部导数为 0;softcap 的实数导数为 sech²(v/β),会平滑变小。浮点实现仍可能在极端输入下数值饱和。作者报告在同样界限下 softcap 通常表现更好,这属于相应实验设置下的观察。[1]
LatentMoE:把宽度预算换成更多专家
专家数量、每次激活数量与单个专家宽度,需要放在一起计算。
Latent 表示在一个更小的特征空间里处理输入。LatentMoE 在路由专家外共享一次降维和一次升维:先把 d 维输入投影到 d/2,在低维空间运行专家,再回到 d。保持专家中间宽度不变,单个专家的三块主矩阵参数量随输入输出宽度减半。[16]
标准方案作为预算对照。Router 从原始输入选择专家;降维后的特征进入被选中的专家;共享支路保持全宽。Stable 版本在路由输出聚合之后、升维之前增加 RMSNorm。[1] [3] [16]
下面跟随同一个 token 的连续演示,把上图的几条支路接起来;随后再计算这条路径的参数预算。
先看路由器读取完整输入,再看降维后的表示进入被选中的专家;专家输出加权聚合,经 RMSNorm 与升维后,与全宽共享支路相加。末尾保持网络参数不变,只更换输入,观察专家选择与最终输出如何变化。
y = W↑ RMSNorm(u) + Shared(x)
取 K3 的宽度 d=7168、中间宽度 m=3072:全宽专家需要 3dm 个主矩阵参数,低维专家需要 3(d/2)m。于是,448 个专家选 8 个,与 896 个低维专家选 16 个,在路由专家的主矩阵预算上恰好相等。新增投影的成本还需要另算。[2]
柱形长度表示每个 token 涉及的主矩阵参数量。新增两次投影约 51.4M,约为路由专家激活主矩阵的 9.7%;图中另列两组方案相同的共享专家容量。Router、Norm 和通信未计入。[2] [16]
额外的 Norm 控制什么?
低维路由链增加了降维和升维两个线性投影,中间还有专家自身的矩阵与门控。多个映射的幅度可能相互放大。RMSNorm 让升维矩阵先收到一个整体尺度受控的向量,以减少这条链上的幅度累积。[1]
二维教学例设 γ=1,并忽略 ε。u 与 3u 映射到相同的方向和幅度;真实训练中仍需考虑可学习增益、方向与梯度等因素。[1] [3]
作者报告:这一位置的 Norm 能稳定训练,某些下游评测也会改善。路由与共享输出的比例、归一化带来的非线性、优化动态,都可能参与其中。观察到收益与确定收益机制,是两项不同的证据任务。[1] [4]
Loss-Free 与 QB:让专家获得合适的负载
从一条训练反馈回路,走到根据分布求阈值。
路由器可能偏爱少数专家,造成部分专家拥堵、另一些专家缺少训练信号。传统做法常在主任务损失之外添加均衡损失,写成 L = Ltask + λLbalance。Loss-Free 采用另一条控制通路:根据负载调整专家选择偏置 b。主任务损失与模型训练继续保留。[19]
上方是前向计算,下方区分主任务反向传播与负载偏置反馈。偏置影响 Top-k 选择,合并权重仍由入选专家的原始分数归一化得到。[19] [3]
pⱼ = sⱼ / Σᵢ∈A sᵢ,j∈A
SignSGD 式反馈:bⱼ ← bⱼ + u · sign(目标负载 − 实际负载)
这里的“Loss-Free”指避免额外的均衡损失项。路由改变后,参与计算的专家发生变化,主任务梯度也会随之改变。由于输入不同,均衡目标通常针对一批 token 的统计,单个 token 无需平均使用所有专家。[19]
QB 把偏置更新写成分位数问题
假设有 N 个专家,每个 token 选 k 个,单个专家希望拿到约 k/N 的 token。QB 先为每个 token 找出当前入选门槛,再看一个专家面对整批 token 时的“离门槛有多远”,根据这个分布确定新的偏置。这样不再需要 SignSGD 的更新步长 u。[4]
左侧沿专家轴找一个 token 的 cutoff,右侧沿 token 轴给某个专家找分位数。示例固定当前 cutoff,并忽略并列分数;真实更新使下一步的 cutoff 也可能改变。[4]
mᵢⱼ = sᵢⱼ − αᵢ
b̂ⱼ = −Q₁₋ₖ/ₙ(m[:,j])
b新 = b̂ − mean(b̂)
固定当前 token 门槛时,分位数给出目标入选份额对应的偏置。所有专家偏置一起变化后,各个 token 的门槛也可能变化。因此,该更新会跨步继续调整;无需学习率式步长,并不能单独保证每一步或任意输入分布下都达到完美均衡。
全球分布怎样汇总?
局部中位数的平均无法恢复整体中位数。直方图保留各个区间的计数,计数相加后能够还原合并分布的区间累计量。[1] [4]
K3 的报告附录 D 给出具体做法:统计 rᵢⱼ=αᵢ−sᵢⱼ 的直方图,范围取 [min(b)−1, max(b)+1],再读出 k/N 分位数。这个范围利用了 Sigmoid 分数在 (0,1) 内的性质。跨机器和梯度累积先合并计数,再在命中的 bin 内线性插值。[4]
随机种子为 20260909。QB 精确分位数与 1000-bin 估计在这 41 个观测点上的 MaxVio 最大差为 0.02734。曲线描述固定分布下的一个教学实验;不同分数分布、批次与更新规则可能产生不同结果。
独立分析还给出一个需要警惕的情形:在特定分位数约定下,交替更新可能停在次优不动点。一个可枚举的 3×3 示例,其不动点的对偶目标为 5,而最优一一分配得分为 4,二者仍有间隙。这说明“某组模拟调整很快”和“一般收敛保证”需要分别判断。[24]
现在回看专家技术的传承
横向看各自怎样改进,纵向区分它们分别在解决什么;三行不串成一条因果链。 FIG 18 / 设计脉络 专家技术的演化:三条脉络,三类问题 横向看各自怎样改进,纵向区分它们分别在解决什么;三行不串成一条因果链。 表示 专家 深度 计算 01 专家结构 哪些参数参与? 公共变换与条件分工 稀疏专家 Sparse MoE 按需激活少数专家 共享专家 Shared Expert 公共变换始终参与 低维专家 LatentMoE 专家计算先降维 稳定低维专家 Stable LatentMoE K3 的结构组合 降 升 Norm 02 激活函数 单专家内部, 如何控制数值幅度? GLU sigmoid 控制门分支 SwiGLU Swish 门分支;乘积无界 SiTU-GLU(K3) 平滑限制两条分支的幅度 03 负载均衡 路由专家之间, 谁太忙、谁太闲? Aux-loss / 辅助损失 用额外目标鼓励负载均衡 Loss-Free 用选择偏置调节专家负载 QB(K3) 按分数分位数更新选择偏置 共享专家处理公共变换;负载均衡调节路由专家的忙闲。 共享专家不等于负载均衡。K3 将专家结构、数值稳定、路由均衡三类机制配合使用。 依据:DeepSeekMoE、LatentMoE、GLU Variants、Auxiliary-Loss-Free Load Balancing、K3 报告 §2.3。
注意力缓存:共享头与压缩特征
从 Q、K、V 的用途出发,把两种结构约束画在同一坐标系里。
注意力中的三个向量有不同用途:Query(Q)表达当前要找什么,Key(K)用来与查询匹配,Value(V)提供匹配后读出的信息。每个头使用自己的查询方式。先对可见历史位置打分,再用 softmax 将分数转成归一化权重,最后加权读取 V。[6]
oₜ = Σⱼ aₜⱼ vⱼ
自回归生成时,历史位置的 K/V 可以缓存下来。MHA 为每个头分别保留 K/V;GQA 把多个 query head 分组,每组共享一套 K/V;MQA 让所有 query head 共享一套。它们都保留各个历史位置,主要减少 KV 头的数量。[6] [7] [8]
三列固定同一个历史位置 j。上方 Q 是查询头,下方比较这个位置的缓存对象。 FIG 19 / 缓存对象 GQA / MQA / MLA:历史缓存到底存什么? 三列固定同一个历史位置 j。上方 Q 是查询头,下方比较这个位置的缓存对象。 表示 专家 深度 计算 GQA 分组共享 K/V Q1 Q2 Q3 Q4 MQA 全部头共享一份 K/V Q1 Q2 Q3 Q4 MLA 缓存低维 latent Q1 Q2 Q3 Q4 Kⱼ / Vⱼ Kⱼ / Vⱼ 位置 j:2 组 K/V 沿“头”共享 同一份 Kⱼ / Vⱼ 位置 j:1 组 K/V 沿“头”共享的极限 低维 latent cⱼ K/V K/V K/V K/V 位置 j:一份压缩特征 cⱼ 上方展开表示投影关系 沿“特征维”压缩 GQA / MQA 共享 K/V 头;MLA 改变每个历史位置的缓存表示。 图示针对压缩缓存的语义对象,不约束底层后端的具体物理存储形式。 依据:MQA、GQA、DeepSeek-V2 §2.1、K3 报告 §2.1.2。4 个查询头为统一对照示意。
MLA 低维分解:K₁ = U₁ᴷ c,K₂ = U₂ᴷ c;V 同理
一个最小例子:c=(1,2),两套投影分别读取第一、第二个坐标,就能得到 K₁=1、K₂=2。GQA 同组的两个头则读取相同的 K。这个例子说明,“相同来源经不同投影”和“直接使用同一套 K/V”有不同的表达约束。
MLA 如何同时保留多头表达与小缓存?
K3 每个 MLA 层有 96 个 query head。压缩表示由 512 维 latent c 与 64 维共享键旁路 r构成。每个头可从 c 展开 128 维内容 Key 与 128 维 Value,再把 r 拼到 Key 后面,形成 192 维 Key。[2] [3]
左右两侧计算相同的函数。左边先展开各头 K/V,右边将内容 Key 的升维矩阵移到 Query 一侧,并在 latent 空间聚合 Value。两侧都保留原来的缩放、因果掩码与 softmax。[3] [9]
Σⱼ aⱼ(Uⱽcⱼ) = Uⱽ(Σⱼ aⱼcⱼ)
K3 还在各头输出拼接后增加逐坐标门 g(x),然后才进入最终输出投影 Wo。Uⱽ 可以移到聚合之后执行;由于 g(x) 随输入变化且按坐标调节,一般不能再把 Uⱽ 穿过它,预先静态合入 Wo。[3]
KDA 与 MLA 如何混合
沿层交替的两种记忆:固定大小状态与逐位置记录。
KDA 把历史信息写入一张持续更新的关联记忆矩阵 S。Key 用来定位写入方向,Value 是要记住的信息,Query 从当前状态读取。Delta 更新先读出当前 Key 对应的旧预测,再按“新值减旧预测”的差额修正记忆;KDA 还为不同通道设置遗忘或保留程度。[10] [11] [12] [13]
图示采用 S∈ℝᵈᵏˣᵈᵛ。状态先按通道保留,再对当前 Key 做差额更新,最后由 Query 读取。实际 KDA 模块还包含短卷积、归一化与输出门。[13] [3]
v̂ₜ = Ŝₜᵀ kₜ
Sₜ = Ŝₜ + βₜ kₜ(vₜ − v̂ₜ)ᵀ
õₜ = Sₜᵀqₜ
普通加法记忆只把新值加入旧值;Delta 更新尝试修正当前关联。如果某个单位 Key 过去关联到 1、新值是 3,在不遗忘且完整写入的教学条件下,差额更新得到 1+(3−1)=3。这有助于理解它如何处理同一关联的覆盖。
“混合”发生在网络深度上
沿深度交替安排两种序列混合方式:压缩历史的状态递推,以及逐位置的内容读取。 FIG 22 / 混合记忆 KDA + MLA:摘要状态与逐位置读取 沿深度交替安排两种序列混合方式:压缩历史的状态递推,以及逐位置的内容读取。 表示 专家 深度 计算 重复模式:3 × KDA + 1 × MLA 只画序列混合子层 子层 1 KDA 子层 2 KDA 子层 3 KDA 子层 4 门控 MLA 此处展示重复模式;完整层数见正文。 完整层还有前馈子层与 AttnRes。 KDA:固定大小状态递推 x₁ x₂ … xₜ S₁ S₂ Sₜ₋₁ Sₜ 每步把新信息写入摘要;解码状态的形状固定。 压缩后的状态不能逐位置无损保留所有细节。 MLA:逐位置低维缓存 c₁ c₂ c₃ … cₜ₋₁ xₜ 保留逐位置读取;缓存随序列长度增长。 KDA 以状态压缩历史;MLA 保留逐位置回看的通道。 左侧只表示序列混合子层模式;每个完整层还包含前馈子层,深度连接由 AttnRes 处理。 依据:官方配置实际为 69 个 KDA、24 个 MLA,共 93 层;末层也使用 MLA。
前一层输出的 token 表示,成为后一层可读取的信息。KDA 的顺序信息通过表示和深度通路传递给后续 MLA。MLA 读取本层各个历史位置的表示;图中的 KDA 递归矩阵由各 KDA 层自行维护。[3] [13]
Kimi Linear 已采用 3 个 KDA 层接 1 个 MLA 层的重复结构。K3 的 MLA 层号为第 4、8、…、92 层,以及最后的第 93 层,因此总计 69 个 KDA 层、24 个 MLA 层。首层的前馈部分为稠密网络,其余层为 MoE。[2] [13]
每一竖列代表一个完整 Transformer 层:上行标注序列混合器,下行标注前馈网络。上方括号是 AttnRes 的深度分块,按 12 个完整层计数;最后一块包含 9 层。[2] [3]
固定状态也有开销
M混合(T) = 24 × 576 × T × 2 + 69 × 96 × 128² × b 字节
只比较单条序列的注意力主状态,采用压缩 MLA 缓存。两条混合曲线展示 KDA 状态精度的影响;对数坐标用于跨长度比较。它们不代表某一后端的实际显存测量。[2]
代入上述公式,b=2 时的交叉点约为 2731 token;b=4 时约为 5461 token。这里比较的是替换掉的 69 层 MLA 缓存增长与新增 KDA 固定状态。到很长上下文时,混合结构的缓存增长斜率由 24 个 MLA 层决定。
注意力的两条历史路线在这里会合
上支路保留历史位置,研究 KV 共享与低维压缩;下支路研究固定状态如何更新。Kimi Linear 将 KDA 与 MLA 按层组合,K3 延续并调整这一结构。时间间距仅用于排版。[6] [7] [8] [9] [10] [11] [12] [13] [1]
RoPE 与 NoPE:顺序信息从哪里来
先算旋转如何影响分数,再看 K3 的局部选择。
在注意力公式中,qₘᵀkₙ 描述内容匹配。要显式加入相对位置,RoPE(Rotary Position Embedding)对 Query 与 Key 的二维坐标对施加旋转:位置越靠后,按相应频率转过越多角度。多个坐标对使用不同频率。[20]
RoPE 显式加入相对位移;K3 的 NoPE 去掉的是 MLA 分支里的显式位置旋转。 FIG 26 / 位置与边界 RoPE 与 NoPE:位置怎样进入计算 RoPE 显式加入相对位移;K3 的 NoPE 去掉的是 MLA 分支里的显式位置旋转。 表示 专家 深度 计算 RoPE:位置变成向量旋转 同一二维子空间中的示意 位置 m 位置 n qₘ q′ₘ kₙ k′ₙ 角度与向量长度仅作示意。 q′ₘ = Rₘ qₘ k′ₙ = Rₙ kₙ q′ₘᵀ k′ₙ = qₘᵀ Rₙ₋ₘ kₙ 旋转部分只依赖相对位移 n − m; 内容向量 q、k 仍参与决定分数。 K3:MLA 去掉显式 RoPE x₁ x₂ x₃ xₜ S₁ S₂ S₃ Sₜ KDA:按先后顺序递推 经顺序敏感路径加工的 token 表示 表示经过层间传递,供 MLA 继续读取。 MLA:在可见位置之间按内容读取 因果约束:只能看自身与过去。 MLA 的 Q/K 不显式加入位置旋转。 K3 的混合结构允许 MLA 内去掉 RoPE;结论限于相应架构与实验。 不推出任意模型都能无代价移除位置编码,也不代表精确保留全部相对位置信息。 依据:RoFormer / RoPE、K3 报告 §2.1.2、mla_use_nope=true 与 KDA 实现。
单一二维坐标对的几何示例。为隔离位置作用,三个位置的内容向量固定为 (1,0);θ=30° 只用于教学,实际 RoPE 组合多组旋转频率。[20]
NoPE 保留内容注意力与因果可见性
NoPE:ℓₘₙ = [qₘᵀ kₙ] / √dₖ + Mₘₙ
aₘₙ = softmaxₙ(ℓₘₙ)
固定内容时,NoPE 的可见位置内积相同;RoPE 的内积因相对位置不同而变化。真实模型的 q/k 已经经过上下文处理,所以 NoPE 的分数也可以反映先前层编码的顺序信息。[20]
这个二维例子在 0~60° 范围内的点积逐渐变小。不能据此推出 RoPE 在所有方向和距离上单调衰减。旋转具有周期性,实际分数还取决于内容向量及多个频率的组合。
K3 为什么能让 MLA 使用 NoPE?
MLA 前面穿插着 KDA。递归更新和短卷积都依赖输入先后次序,因此即使 MLA 自己不再旋转 Q/K,输入表示中仍可以包含顺序信息。因果掩码也保留了可见前缀的结构。理解这一点,可以先看一个只用两个数字的递归例子。[3] [13]
这条标量递归仅说明顺序如何进入隐藏表示。KDA 的真实状态为矩阵,遗忘、写入和输出门由输入决定;示意不能用来量化 K3 的位置识别能力。
原文的经验判断是:在 K3 的 KDA+MLA 混合模型中,将 RoPE 加回 MLA,没有观察到明显收益;在全 MLA 的 K2 上移除 RoPE,会明显变差。去除位置旋转的效果依赖整体架构与实验条件。因果掩码存在、递归对顺序敏感,也不足以单独保证精确位置任务或任意长度外推都成功。[1]
RoPE、PaTH 与 KDA 的联系,需要哪些条件?
KDA 状态转移:Aₜ = (I − βₜ kₜkₜᵀ) Diag(αₜ)
固定正交变换的幂可以构造广义位置变换;PaTH 探索了输入相关的 Householder 型路径变换。Delta 规则也出现 I−βkkᵀ 这一矩阵形式,在满足特定归一化与系数条件时,可以联系到正交反射。KDA 进一步加入通道衰减。这条脉络说明了机制上的亲缘关系,完整模型的效果仍需相应实验支撑。[1] [21]
保留 64 维旁路,意味着什么?
K3 的 512 维 latent 负责多头内容 Key/Value 的展开;64 维旁路直接拼入各头 Key。移除 RoPE 后,这条旁路继续贡献内容分数。[1] [3]
K3 NoPE 的旁路分数: (qₘʳ)ᵀ rₙ
完整 K3 每头 logit:[(qₘᶜ)ᵀUᴷcₙ + (qₘʳ)ᵀrₙ] / √192 + Mₘₙ
作者保留旁路的理由包括兼容已有 MLA 基础设施,以及避免把全部 576 维 latent 再展开为各头 K/V 所带来的额外计算。长上下文能力还依赖训练数据与日程:报告描述了从 8K、64K,再到 256K、1M 的长度阶段。[1] [4]
把缓存、计算与任务时间分开
同一个设计可以节省存储,同时增加某种计算。
Prefill 是一次处理输入的新 token,Decode 是逐步生成输出。MLA 在展开形态中使用较小的头内维度,在压缩缓存形态中则让 Query 进入更大的 latent 空间。两种计算顺序的核心成本不同。[1] [9]
按每个有效 query–key 位置对计数,QK 与加权 V 的主乘加系数为 H(dqk+dv)。统一 H=96,以便只比较所列头内尺寸;省略投影、softmax 和其它模块。[1] [2]
每个历史位置、每个注意力层的缓存标量数。GQA8 在此指 8 个 KV head;K=V 的共享 512 维只存一份。MQA 256/256 是原文讨论 MFA 时的注意力核心尺寸简化。[1] [2]
压缩 MLA 中,QK 使用 576 维,聚合 latent Value 使用 512 维;因此核心系数为 96×(576+512)=104448。此处只数依赖历史位置的主乘加,输出升维等操作需另计。[1] [2]
MAC 指一次乘法并累加。上面三图展示的单位不同:乘加系数反映一部分计算,标量个数反映缓存容量。生成耗时还取决于显存读取、矩阵利用率、批量、通信与调度。4.25 倍核心乘加系数不能直接换成 4.25 倍延迟。
推测解码改变了额外计算的价值
推测解码先由较小的草稿模型提出若干 token,再让目标模型批量验证。收益来自验证效率与接受率,也要扣除草稿计算和状态维护开销。MLA 的 latent 计算较重,在部分设置下可能更早遇到计算瓶颈;KDA 的递归状态还需要处理验证拒绝后的回退。[1] [4]
K3 的训练与发布形态需要按阶段理解:预训练包含一个 MTP 层,随后将它微调成 EAGLE-3 式草稿模型;发布主模型配置中 num_nextn_predict_layers=0。前者说明训练历史,后者描述所发布主模型的配置。[2] [4]
另一条路线:DeepSeek-V4 的压缩与稀疏访问
K3 用大量固定状态层减少逐位置缓存;V4 结合局部窗口、压缩历史条目和稀疏访问。CSA 先压缩再选择条目,HCA 采用更强压缩;两者的访问方式需要分别理解。[1] [5]
| 结构字段 | DeepSeek-V4-Flash | DeepSeek-V4-Pro |
|---|---|---|
| 完整 Transformer 层 | 43 | 61 |
| Query 头数 | 64 | 128 |
| 共享 KV 维度 | 512 | 512 |
| 总参数 / 每 token 激活参数 | 284B / 13B | 1.6T / 49B |
上述字段来自 V4 技术报告。其共享 K=V 结构与 MLA 的 latent 解码视角有联系,压缩和稀疏机制又引入新的取舍。固定矩阵可能让记忆相互干扰,条目压缩可能合并局部细节,稀疏访问可能漏选重要记录。哪种组合更合适,需要同等条件下的任务评测。[5] [1]
从机制回到 K3 的设计选择
现在可以把开篇的三个方向连起来,并回答架构取舍问题。
训练更新这条配套路线:Muon 与 Per-Head Muon
前面的模块定义模型怎样计算;优化器定义训练时权重怎样更新。Muon 对矩阵形状的更新方向做特殊处理,Moonlight 将其扩展到大模型训练。Per-Head 形式将相关注意力矩阵按头分块处理更新。原文报告此改动没有明显效果差异,主要出于避免不必要耦合的设计考虑。[1] [23]
专家变多,成本为什么可能接近?
专家总数 N、激活数 k 和每个专家宽度共同决定预算。K3 把路由专家输入输出宽度减半,再把 N、k 都翻倍,路由专家的三块主矩阵预算保持相等;降维、升维、Router 与通信仍有额外成本。
MLA 缓存小,为什么解码仍可能较重?
同一份 latent 节省了存储,但各个 Query head 在 latent 空间进行打分和聚合时,要处理更长的向量。实际速度要结合计算与访存瓶颈判断;推测解码进一步改变两者的利用方式。
去掉 RoPE,位置能力依赖什么?
KDA 的递归、短卷积与因果可见性为顺序信息提供了通路,后续 NoPE MLA 可以读取已含上下文的表示。RoPE 是否有收益,以及位置任务和长度外推能做到什么程度,需要对应架构的实验结果。
沿技术脉络回看:MoE 发展了按需前馈计算,MLA 将多头表示与缓存宽度拆开,KDA 提供固定状态记忆,AttnRes 增加深度选择。Stable LatentMoE、输出门、位置分支与优化器中的调整,让这些部件在同一个系统里协调工作。[1]
数据从哪里来,经过什么计算,省下哪种资源,又付出哪种代价。
参考文献与计算说明
技术来源、教学推导与实验观察按各自用途引用。
本文围绕苏剑林关于 K3 的架构随笔展开。K3 的尺寸与开关依据发布配置,计算路径依据公开参考代码;对设计效果的描述保留相应论文或作者观察的范围。小型数值例、函数曲线和容量模型均明确标注了教学假设。
SituAndMul、KimiSparseMoeBlock、KimiMLAAttention、KimiDecoderLayer 与 _apply_attn_res。
按组共享 K/V 的 Grouped-Query Attention。
教学计算的适用范围
保存教学计算代码(Python / NumPy)。运行 python K3_图解计算示例.py --output results.json,可计算专家参数与状态容量,并检查 MLA、KDA、RoPE 的公式关系及 QB 教学示例。
专家参数量按三块主矩阵计算;注意力成本图仅计核心乘加;显存模型仅含所列注意力状态。它们可用于理解结构趋势,无法代替实际吞吐或完整显存测试。QB 曲线采用固定分布、每步重采样的教学设置。随文计算代码提供这些数值例及矩阵等价检查。
文中未报告重新训练 K3、加载完整模型或复现其消融实验的结果。实验效果的适用范围以对应来源说明为准。