Residual + pre-norm 是现代深层的默认底座
残差与 pre-norm 影响梯度和表示的传播。RMSNorm 省去了均值中心化,具体质量收益需要在相同训练配方下做替换实验。
ARCHITECTURE / VARIANTS & CONCLUSIONS
现代 decoder 可以看成几个可替换零件的组合:Attention / KV 结构、位置编码、归一化、FFN 激活、 残差布局和 Dense/MoE。每个选择通常优化一个资源或能力,同时在其他地方付出代价。
比较模型结构时,可以逐项查看下面五类设计及其参数。
full attention、滑窗/稀疏 attention、linear/recurrent、SSM 或混合层。
token 如何交换信息MHA、GQA、MQA、MLA;query heads 与 KV heads 的数量关系。
表达 vs 推理缓存absolute、relative bias、ALiBi、RoPE 及缩放;Pre/Post Norm、RMSNorm、QK-Norm。
顺序与深度训练ReLU/GELU、SwiGLU、Dense MLP、MoE experts、共享专家。
参数容量 vs 激活计算pre-norm 主干、scale 乘子、并行/串行 residual、QKV 初始化。
梯度与激活传播选择一项变体。重点看结构改了什么、改善了哪项指标,以及结论适用于哪些条件。
STANDARD ATTENTION
每个 query head 拥有自己的 K/V projection。固定 batch、序列长度、层数、query heads、head dim 和存储精度时,MHA 的 KV 缓存不小于共享 KV 的 GQA/MQA;结构本身不保证任务质量更高。
Hq = Hkv; cache ∝ Hkv · D
每个 query head 有独立的 K/V 投影。
固定其他维度时缓存通常更大;实际时延取决于实现与硬件。
head 数量的收益需要结合每头维度、训练配方和任务结果评估。
选择你当前最想优化的约束,页面给出常见的结构组合与限制。具体收益需要在目标任务和相同预算下测试。
INFERENCE MEMORY
GQA 是常见折中:多个 query heads 共享 KV heads;MQA 更激进;MLA 则学习压缩潜在缓存。还要配合 paged KV、prefix cache 和 batch 调度。
KV 与权重占用应分别计算;长上下文吞吐还受 attention 计算和调度影响。
下表用于对照结构。使用具体模型时,核对对应版本和尺寸的配置及模型卡。
| 家族 | 类型 | 位置 | Norm | FFN | KV / 容量结构 | 关键点 |
|---|---|---|---|---|---|---|
| BERT | Encoder | Learned absolute | Post-LN | GELU FFN | MHA、双向 | 用于 masked LM 的双向编码接口 |
| T5 / T5 v1.1 | Encoder-decoder | Relative bias | 无均值中心化的 Norm | 原版 ReLU;v1.1 gated-GELU | MHA | 版本改变 FFN,不宜合称为同一配置 |
| LLaMA 2 7B | Decoder | RoPE | Pre-RMSNorm | SwiGLU | MHA | 现代 decoder 配方,KV 较大 |
| Mistral 7B | Decoder | RoPE | Pre-RMSNorm | SwiGLU | GQA + sliding window | 用有限窗口降低长序列成本 |
| Mixtral 8×7B | MoE Decoder | RoPE | Pre-RMSNorm | SwiGLU experts | GQA、8 experts / top-2 | 总参数约 46.7B,每 token 激活约 12.9B |
| DeepSeek-V2 / V3 | MoE Decoder | RoPE 相关 | RMSNorm 类 | MoE | MLA、细粒度 experts | 压缩 KV latent + 共享/路由 expert;以模型卡为准 |
| Mamba(原版) | SSM | 状态递推 | 架构相关 | 无独立 FFN;投影与门控融入统一块 | SSM 状态与短卷积状态 | 选择性 SSM、短卷积与门控;不使用标准 attention KV |
这些是机制层面的结论;具体幅度仍依赖规模、数据和 kernel。
残差与 pre-norm 影响梯度和表示的传播。RMSNorm 省去了均值中心化,具体质量收益需要在相同训练配方下做替换实验。
减少 KV heads 直接压低 decode 带宽与缓存,但共享越激进越依赖训练弥补表达。实际选择看上下文长度、batch 与质量回归线。
总参数增大、激活参数可以较小;所有 experts 仍需驻留/可达,router 不均与 all-to-all 是核心风险。
位置外推、训练长度、attention 模式、数据与评估都决定模型能否在远端 token 上可靠工作。
它通过分块与在线 softmax 降低内存访问,通常仍是同一 attention 数学;评估时分别记录数学目标和执行 kernel。
宽度、深度、FFN、数据、token 预算、位置和推理成本共同作用。比较时先固定预算,否则结论不可迁移。
检查 RoPE 频率、缩放、插值、滑窗/全局层;新长度下的相位关系改变。
长文本应包含需要跨段结合的证据,让模型有机会学习远距离依赖。
调整长度混合、microbatch、LR、重算和 context parallel;保持全局有效 token 口径。
长度、位置、干扰、检索/组合/聚合与短上下文回归,连同成本和延迟报告。
RoPE 让不同位置的 Q/K 通过旋转表达相对位移。把位置插值进已训练范围,或修改频率尺度,会改变距离与相位关系;这可能帮助扩展,但不能单凭数学变换保证新长度的能力。继续训练的数据、长度课程和原始模型决定是否适应,短距离分辨率也可能受影响。
长度 L 的全注意力算术量含 L² 项;FlashAttention 减少物化中间矩阵与 HBM 搬运,不消除这个交互数。滑窗缩小局部访问,但跨窗口信息如何传播取决于层结构。context parallel 把同一长序列的计算分给设备,仍需要交换相应状态,共同完成这条序列的前向与反向。
| 评估轴 | 测试变化 | 能回答什么 |
|---|---|---|
| 长度 × 位置 | 固定任务,改变上下文长度、证据放头/中/尾的位置。 | 模型在哪些长度和位置可靠,而非只报告最大可输入长度。 |
| 单条检索 | 找一个明确事实或标记,加入相似干扰。 | 能否找到局部信息;不能代表跨多证据推理。 |
| 多跳/组合 | 分散多条事实,必须按关系组合才能回答。 | 各条远端证据是否共同影响答案。 |
| 聚合/顺序 | 计数、排序、跨段去重、事件先后和矛盾更新。 | 长程任务执行与状态维护;单 needle 命中率不足以覆盖。 |
| 成本与短程回归 | 相同任务/推理预算下测显存、TTFT、ITL 与短问题质量。 | 扩展是否值得,以及是否牺牲常见场景。 |
RULER 用多类合成任务揭示“标称上下文”与实际使用能力之间的差距;合成评估也有范围,应再测真实文档、代码仓库或多轮任务。报告可靠长度时应明确通过阈值、任务类型和位置分布,每个可靠长度结论都应对应到这些评估条件。
这类层把历史压入每个 head 的矩阵状态。新 key 用来读取旧关联,再把“新 value 与旧预测的差”写回;衰减控制旧状态保留多少。它与逐 token 保存 K/V 的全注意力、只保留固定邻域的滑窗,以及完整 Mamba 块的结构分别理解。
| 公开版本 | 本节对应内容 | 配置边界 |
|---|---|---|
| Gated DeltaNet v1 · 2024-12-09 NVIDIA / MIT,§3 | 每头一个标量遗忘门,结合 delta 修正;原文提供 WY 分块训练与混合层。 | 原文状态是 dᵥ×dₖ;下文统一转置成 dₖ×dᵥ。完整块还含短卷积、归一化与输出门。 |
| Kimi Linear v1 · 2025-10-30 Moonshot,§3–4 | KDA 改为逐 key 通道衰减,原文式 1 给定乘法顺序。 | Kimi Linear 以 3:1 混合 KDA 与 full MLA;其 WY/UT 实现和模型结果不同于本站稠密小矩阵教具。 |
| Qwen3.5-9B 官方模型卡 2026-10-30 核对,c202236 | 明确列出 8 组“3 层 Gated DeltaNet + 1 层 Gated Attention”,每层 mixer 后接 FFN。 | 这是指定 9B 版本;GDN 不等于 KDA,Gated Attention 也不等于 Kimi 的 MLA。模型卡不是未披露训练配方的依据。 |
以下 Sₜ∈ℝᵈₖ×ᵈᵥ,qₜ/kₜ 为 dₖ 维列向量,vₜ 为 dᵥ 维列向量;本节统一使用 Kimi 论文的方向。令 Dₜ=Diag(αₜ),逐通道 αₜ∈[0,1]ᵈₖ,写入强度 βₜ∈[0,1]。GDN 的标量门是 Dₜ=αₜI 的特例。
本地固定四个位置、2×3 初始状态、单位 q/k,以及预先保存的 v、α、β;不运行模型投影、短卷积或输出门。三个输出坐标直接来自 Sₜᵀqₜ;此表显示四位小数,完整数值保存在结果文件中:
| 位置 t | oₜ[0] | oₜ[1] | oₜ[2] |
|---|---|---|---|
| 1 | 0.2530 | 0.0100 | 0.0100 |
| 2 | 0.0148 | 0.3423 | -0.1890 |
| 3 | 0.2251 | -0.1926 | -0.1203 |
| 4 | 0.2190 | -0.1040 | 0.1031 |
标量门依次固定为 [0.8,0.875,0.75,0.675];错序例将旧状态路径改成 Dₜ(I−βₜkₜkₜᵀ)Sₜ₋₁,写入项保持原样。清零例在处理第 3 个位置前把状态置零。其他输入不变,比较最后一个输出:
| 路径 | o₄[0] | o₄[1] | o₄[2] |
|---|---|---|---|
| KDA:逐通道衰减 | 0.218979 | -0.103997 | 0.103106 |
| GDN:每头标量衰减 | 0.223563 | -0.104936 | 0.108299 |
| 错序:先修正再衰减旧状态 | 0.213903 | -0.095091 | 0.106742 |
| 误把计算分块当新文档清零 | 0.139264 | -0.114176 | 0.091648 |
这些差异说明算子和边界约定不同,不比较模型质量。计算分块要延续同一文档的状态;独立文档需要自己的状态、短卷积和注意力隔离规则。
对本层给定的 q/k/v 与门值,每步可写成 Sₜ=AₜSₜ₋₁+Bₜ。若前块表示为 S↦P₁S+R₁、后块为 S↦P₂S+R₂,代入后得到 P=P₂P₁、R=P₂R₁+R₂。因此能先组合块内仿射变换,再用块入口状态求输出。组合顺序保留因果关系;代数等价允许浮点舍入差异。
本地枚举四位置的全部 8 种连续分块方式,核对每个中间状态与输出。这个稠密展开用于看懂依赖;真实高效训练还需论文的结构化 WY/UT、块内并行、精度处理和硬件实现,不能用教具的运算时间代表论文收益。
| 训练路径 | 同一前向 loss | ∂L/∂v₁[0] | 传过 S₂ 的 ‖G₂‖F |
|---|---|---|---|
| 逐 token 递推 | 0.001544 | -0.003852 | 0.020273 |
| 仿射分块 [2,2] | 0.001544 | -0.003852 | 0.020273 |
| 块边界 detach | 0.001544 | 0.000000 | 0.000000 |
输入状态、v、通道衰减和写门共 30 个局部量均核对手工伴随、分块伴随与有限差分。q/k 在此固定,未核验上游投影、归一化或门参数化的权重梯度。前向相同和训练梯度相同是两项独立检查。
只计算抽象四层、每层一头、dₖ=2/dᵥ=3、相同精度的缓存标量数。全注意力每层保存 T(dₖ+dᵥ)=5T,循环层每层保存 dₖdᵥ=6;三层循环加一层全注意力需要 18+5T:
| 已处理长度 T | 四层全注意力 | 四层循环 | 3+1 混合 |
|---|---|---|---|
| 1 | 20 | 24 | 23 |
| 4 | 80 | 24 | 38 |
| 16 | 320 | 24 | 98 |
短前缀时,固定矩阵也可能比少量 K/V 占更多槽位;混合模型仍有随 T 增长的全注意力缓存。本表排除了短卷积状态、权重、激活与分配器,也没有套用 Qwen/Kimi 不同的 head 数、维度或量化配置。
必须按状态语义处理。作为方程的端点反例,取 β=1、k=[1,0]、D=I,两份旧状态只在第一行不同。这次写入会把第一行完全换成 v,两份新状态的最大差为 0.000000,从新状态不能唯一恢复旧第一行。
这里 β=1 是明确的数学端点,不宣称有限 sigmoid logit 必然达到该值。内部参数下的可逆性需另看 A 与数值条件;不能默认所有步都可逆,也不能只按 KV 删除位置。实现通常需要按所选机制核对状态快照、重算、短卷积状态及混合层缓存,本站不指定某个引擎未核对的回滚实现。
在仓库根目录执行,仅用 Python 3.10+ 标准库。固定输入、全部状态、30 项有限差分、8 种分块、反例与来源版本随代码保存;同时核对正文四表一值。
python3 artifacts/delta-state-20261030T092245Z/check-mechanisms.py另检查空序列、门值端点和后缀变更不影响早期状态。没有下载权重、训练完整模型、运行作者 kernel 或测 GPU 吞吐;不复现作者的任务成绩和速度提升。
普通残差把分支输出加回一条流。Hyper-Connections 扩成多条流,并学习层间的混合。DeepSeek 的 mHC 再约束残差混合矩阵;它改变的是计算图,不能只当成优化器或 KV 压缩技巧。
固定正矩阵 M⁽⁰⁾=[[4,1],[1,1]],交替归一化。本站教具约定每轮先行、后列;原论文 v1 式 9 写的是先列、后行。二者有限次结果不同,不能只凭同为 20 轮就认作逐步复现。
| 轮数 | 最大行和误差 | 最大列和误差 | ‖M‖₂ |
|---|---|---|---|
| 0 | 4.000e+0 | 4.000e+0 | 4.302776 |
| 1 | 9.890e-2 | <1e−14 | 1.005465 |
| 2 | 1.097e-2 | <1e−14 | 1.000068 |
| 5 | 1.505e-5 | <1e−14 | 1.000000 |
| 20 | <1e−14 | <1e−14 | 1.000000 |
一轮后列和已满足,行和与二范数却仍不满足精确双随机结论。表中 1.000000 是六位舍入,不能当作严格上界;“<1e−14”也不代表精确为零。低精度、极端输入、归一化次序和稳定项会改变误差,需要在实际实现上核对。
固定线性读出 L=ΣᵢⱼM⁽²⁰⁾ᵢⱼGᵢⱼ,G=[[0.2,−0.3],[0.4,0.8]]。本例从四个原始 Z=log M⁽⁰⁾ 出发,沿 20 轮归一化逐步反传;有限差分核对全部四个导数。一次 η=0.1 的 SGD 后,读出由 0.700000 变为 0.695987。这是指定矩阵目标的更新,不是模型质量提升,也没有实现状态相关的系数预测器。
对精确非负双随机的方阵,二范数至多为 1;这样的矩阵相乘仍满足同样约束。对每个固定输入方向 v,‖Bv‖₂≤‖v‖₂。该结论只约束残差混合算子,不把近似行列和自动升级成精确条件。
| 混合次数 r | 差异方向 [1,−1] 的范数比 | ‖Bʳ‖₂ |
|---|---|---|
| 1 | 3.333333e-1 | 1.000000 |
| 5 | 4.115226e-3 | 1.000000 |
| 12 | 1.881676e-6 | 1.000000 |
这里 B=[[2/3,1/3],[1/3,2/3]],常量方向保持,差异方向却每层缩为 1/3。另取单流 B=1、A=0.5、C=1、F(u)=4u,完整转移是 x→3x,导数为 3.000000。B 满足约束,完整分支仍可放大梯度;实际 A/B/C 依赖 X 时还会出现系数导数。
DeepSeek-V4.1-Flash 报告第 2.4.1 节把输入混合由本层 Aℓ 改成前层产生的 Aℓ−1,解除输入混合等待本层系数归约的依赖。报告区分预训练沿用多 kernel 实现和部署时融合执行;不能把这项改动概括成“同一计算图换个快 kernel”。
固定 X=[2,1]、上面的 B、C=[0.25,0.75]、F(u)=2u,本层 A=[0.6,0.4],已保存前层 A=[0.8,0.2]。只对比一次转移,不生成系数或声称两行输出等价。
| 输入混合 | AX | 下一状态两条流 |
|---|---|---|
| 本层 Aℓ | 1.600000 | 2.466667 / 3.733333 |
| 前层 Aℓ−1 | 1.800000 | 2.566667 / 4.033333 |
本例检验的是系数来源与依赖,未执行融合 kernel、量化或测速。访存下界与作者的端到端收益不能由这三列数值推出。
一手版本:mHC v1(2025-12-31)第 4.1–4.2 节、式 6–9定义约束、参数化和有限次迭代;DeepSeek-V4.1-Flash v1(2026-09-17)第 2.4.1 节、式 2–6说明 Single-Pass 的系数移位与执行阶段。这里没有重跑作者训练、验证质量或复现吞吐。
标准残差展开后,是 embedding 与此前各子层输出的固定加和。Moonshot 的 AttnRes 将这些来源保留为候选,用学习到的权重重新聚合。这里选择的是同一 token 的不同深度来源;GDN/KDA 处理序列状态,mHC 混合相邻层之间的多条残差流,三者的对象不同。
本节绑定 Attention Residuals v1(2026-03-16)§3–4。作者仓库将示例标为 PyTorch-style pseudocode;本轮保存了 README 的文件 blob 身份,未把伪代码当完整训练实现。报告中的 Attention 和 FFN 各算一个子层。
对目标子层 ℓ,伪查询 wℓ 是独立的学习向量,不是当前 hidden state 的 Q 投影。候选 vᵢ 来自 embedding 或此前子层输出;权重随输入变化,是因为候选键随输入变化。RMSNorm 用于计算键,最终加权的值仍是原始 vᵢ。
固定一个 token、四个三维来源:v₀=[1,0,−0.5],v₁=[0.2,0.8,−0.1],v₂=[0.6,−0.4,0.5],v₃=[−0.3,0.2,0.9];w=[0.5,−0.25,0.2]。Full 聚合的分数和权重如下:
| 来源 | 分数 sᵢ | 权重 αᵢ |
|---|---|---|
| embedding | 0.619670 | 0.295685 |
| f1 | -0.250212 | 0.123892 |
| f2 | 0.986908 | 0.426893 |
| f3 / partial | -0.035729 | 0.153530 |
本例 Full 的候选是 [v₀,v₁,v₂,v₃]。另设前两个子层构成已完成块 b₁=v₁+v₂,当前块已产生 partial=v₃;Block 的候选变成 [v₀,b₁,v₃]。先求和再做 RMSNorm/softmax,与分别对 v₁、v₂ 打分并不等价。
两阶段执行则先计算 embedding/已完成块的结果,再计算当前 partial,并合并归一化统计量。若两组各自的归一化输出为 hA/hB,log-partition 为 LA/LB,合并必须按概率质量加权:
| 聚合路径 | h[0] | h[1] | h[2] |
|---|---|---|---|
| Full:四个原始来源 | 0.530540 | -0.040937 | 0.191392 |
| Block:embedding / f1+f2 / f3 | 0.655731 | 0.204155 | 0.151084 |
| Block:两阶段精确合并 | 0.655731 | 0.204155 | 0.151084 |
| 错误:两组结果各取一半 | 0.298699 | 0.202603 | 0.430857 |
| 错误:把归一化键当作值 | 0.933016 | -0.075526 | 0.413283 |
固定来源只比较本地聚合算子;真实 Full/Block 网络还会改变后续 fᵢ(hᵢ),不能把这几列当作模型能力比较。原文 Block 还改变跨层来源的保留与传递:每 token 的这部分候选存储由 O(Ld) 降到 O(Nd),不等于整个训练的总内存都按此缩减。
| 分块方式 | 保持的对象 | 需要单独核对 |
|---|---|---|
| GDN/KDA 的执行分块 | 相同递推与输入下的状态和输出。 | 跨块梯度;detach 会更改反传约定。 |
| Block AttnRes 的结构分块 | 将子层输出求和为块级候选。 | 候选与模型计算图发生变化;不是 Full 的精确执行重排。 |
| AttnRes 的两阶段执行 | 同一组已完成块/partial 候选的 softmax 聚合。 | 归一化分母、稳定合并和因果可用性。 |
本地枚举 Full 四候选的 8 种连续分组和 Block 三候选的 4 种连续分组,合并后都与各自直接求值一致;不据此把 Full 与 Block 的输出等同。
固定监督 y=[0.2,−0.1,0.3],L=½‖h−y‖²。来源 vᵢ 一方面直接作为 value,另一方面经过 RMSNorm、分数和 softmax 改变权重。只把本轮 α 当常量会漏掉第二条路径。下表核对同一个原始来源 v₁[0] 的局部导数:
| 候选结构 | value 直通项 | 打分路径项 | 完整导数 | 中心有限差分 |
|---|---|---|---|---|
| Full | 0.040951 | -0.003860 | 0.037091 | 0.037091 |
| Block | 0.186611 | 0.011712 | 0.198322 | 0.198322 |
两种结构分别对原始来源的 12 个坐标及查询的 3 个坐标做有限差分,共 30 项;Block 的导数继续通过 b₁=v₁+v₂ 返回原始来源。分项独立四舍五入,完整精度保存在结果文件中。
只更新 Full 的三个查询参数,来源保持不动,η=0.05,执行一次 SGD。下表只验证这次固定目标更新:
| 阶段 | w[0] | w[1] | w[2] | 本地 loss |
|---|---|---|---|---|
| 更新前 | 0.500000 | -0.250000 | 0.200000 | 0.062270 |
| 一次 query SGD 后 | 0.494158 | -0.249322 | 0.207460 | 0.060482 |
若另取 w=0,四来源权重均为 1/4,输出是均值 [0.375,0.15,0.2];它不是标准残差的原始求和。不能只凭“均匀权重”就宣称两种完整网络的初始化行为完全相同;还需核对后续归一化与具体实现。
原文式 6 明确:新块首个子层只使用 embedding 与此前已完成块;后续子层才加入当前 partial。多加一个零向量虽然不直接贡献 value,却会以 exp(0) 增大 softmax 分母,改变已有来源的权重。未来子层输出也不能提前加入。
本地另核对省略 partial 与加入零候选的不同输出、单来源、空候选拒绝、排列不变性和大分数的稳定求值;不猜测官方伪代码未完整展示的初始状态约定。
在仓库根目录执行,仅使用 Python 3.10+ 标准库。固定输入先于结果保存;30 项局部导数、12 种执行分组、查询更新及反例均可重算:
python3 artifacts/attnres-20261030T095028Z/check-mechanisms.py没有实现完整骨干、流水线通信或作者 GPU kernel,也未复现作者训练、scaling law 或线上速度;本文的数值只核验指定聚合机制。
先检查控制变量,再看机制是否解释结果。
MoE 的“更大”可能是总参数,也可能只是训练 compute;要区分。
多训练本身就能提升质量,与结构改良混在一起。
词表变化会改变有效序列长度和 bits/byte。
batch、context、precision、decoding 参数不同,延迟与质量不可直接比。
一次换多个部件时,无法归因到具体设计。
声称省 KV,就应报告缓存、带宽和长上下文回归;不能只报训练 loss。
mHC、GDN/KDA 与 AttnRes 均用固定教具核验,并区分序列状态、残差流和深度候选。AttnRes 只检查四来源的聚合、30 局部导数与两阶段合并;Block 改候选,执行分组才保持同一 softmax。各节保留版本与简化边界,不复现完整模型、厂商训练或速度。