Kimi K3 の KDA が Gated MLA と AttnRes との連携を解説
本文の状態
日本語全文を表示中
詳細モードで約43分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
zartbot
Kimi K3 の技術レポート詳細分析記事は、同モデルが採用する KDA、Gated MLA、Block AttnRes の協働メカニズムを解明し、2.5 倍のスケーリング効率とアーキテクチャの限界について論じている。
Continue in AI NEW LAB
このニュースを、実務の判断につなげる
AI NEW LABで、試したことや先に確認したい条件を共有できます。まずはログインなしで読めます。
AI NEW LABで論点を見るAI深層分析を開く2026年8月7日 19:36
AI深層分析
キーポイント
Kimi K3 の基本アーキテクチャ
同モデルは約 2.78T パラメータを持つ多模態稀疏 MoE で、言語部分は 93 層のバックボーンに 69 層の KDA(線形注意力)と 24 層の MLA(全注意力)を組み合わせる。
KDA と Gated MLA の協働構造
モデルは「3 層 KDA + 1 層 Gated MLA」のユニットを基本構成とし、最終層に MLA を追加することで、線形注意力と全注意力の特性を補完させる設計を採用している。
スケーリング効率とアーキテクチャの課題
K2.5 相比で 2.5 倍のスケーリング効率が達成されたが、モデル構造とチップ構造の共同設計(co-design)において推論効率への配慮に欠ける点が残されている。
代数視点からの KDA の再解釈
記事は KDA を代数的観点から分析し、列方向の完全な解耦や仿射変換の性質、そして状態が FP32 でなければならない理由を理論的に説明している。
KDA における因果畳み込みの役割
因果畳み込みは単なるパッチではなく、逐点マップでは表現できない「直前のトークン」という順序関係を Key に埋め込むために不可欠である。これにより、同じ単語でも文脈に応じて異なるアドレスを獲得し、状態空間内の干渉を大幅に低減できる。
重要な引用
Kimi K3 は約 2.78T 総パラメータ、約 105B 単トークン活性化パラメータの多模態稀疏 MoE モデルである
93 層はすべて標準全注意力を使用するわけではなく、3 層 KDA + 1 層 MLA のアーキテクチャユニットを採用している
K2.5 と比較して 2.5 倍のスケーリング効率を達成したが、モデル構造とチップ構造の共同設計にはまだ課題が残っている
「conv の做的事就是 '把自己和前 3 个 token 加权混合'」
編集コメントを表示
編集コメント
本記事は Kimi K3 の技術レポートを深く掘り下げ、KDA と Gated MLA という特殊な注意力機構の協働原理を代数学的視点から解説している。特にモデル効率と推論コストのトレードオフに関する指摘は、実務的なアーキテクチャ設計において重要な示唆を与える内容である。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
Kimi K3 の KDA(1): KDA が Gated MLA と AttnRes とどのように連携するか
2026 年 8 月 7 日 13:26 浙江 / 著者:渣 B
要約
先週、好奇心から「Attention は Sparse か Linear か?詳細分析」という記事を書きました。K3 の技術報告書を精査したところ、Linear Attention に関する私の疑問がいくつか解消されたようです。同時に公開された AgentENV などの成果も、深く学ぶ価値があります。後処理(post-training)やインフラ関連の項目にも検討すべき点が多くあるため、本シリーズは数回に分けて解説していきます。
ただし、物事は常に多角的に捉える必要があります。先日、昇騰(Ascend)の首席科学者である廖恒氏への 5 時間にわたるインタビュー記事『昇騰史、18 層宝塔と世界半導体 30 年の壮大な叙事詩』[1] を読んだ際、DeepSeek の Sparse アプローチについても言及されていました。正式版の DeepSeek-V4 Flash の性能も非常に優れており、284B-A13B という大規模モデルであることは間違いありません。
全体的に見て、Kimi K3 はモデル性能とトレーニングの両面で素晴らしい成果を上げています。特に K2.5 と比較して 2.5 倍のスケーリング効率を達成した点は目覚ましいものです。しかしながら、アーキテクチャ全体を見ると、高速推論のための最適化が十分に行われているとは言い難く、モデル設計とチップ設計の協調(co-design)においてはまだ改善の余地があります。廖氏もインタビューで触れていた通り、この課題は非常に難しく、高い人材要件を伴います。数学やアルゴリズムの観点からモデル構造を深く評価するだけでなく、チップアーキテクチャやメモリアクセスの詳細な理解まで必要とされるからです。おそらく、これら 18 の層すべてを完全に攻略できる人はそう多くないでしょう。
本稿はシリーズ物の第 1 弾です。分量が多いため数回に分けて執筆します。まずは K3 の「KDA + Gated MLA + Block AttnRes」という組み合わせがどのように連携しているかを詳細に分析し、第 2 篇では Sparse Attention との比較を行います。さらに時間が許せば、チップ設計の視点から第 3 篇を補足する予定もあります。
本記事はシリーズの初回であり、今回はモデル構造そのものに焦点を当てます。具体的には、KDA が Gated MLA や AttnRes とどう連携するかという点です。
目次
- 第 1 章: K3 モデル構造の概要分析(既知の場合はスキップ可)
- 第 2 章: 本文の核心部分
- Kimi K3 モデルアーキテクチャ
1.1 概要
Kimi K3 は、総パラメータ数約 2.78T、単一トークンあたりの活性化パラメータ数約 105B を持つ多モーダルなスパース MoE(Mixture of Experts)モデルです。Kimi K2 との主な違いは以下の通りです。
モデルのアーキテクチャは以下の通りです。
ここでは視覚エンベディングの部分は一旦脇に置き、言語処理部分の中核となるフレームワークを見ていきましょう。
混合アテンション構造
93 层并非全部采用标准全注意力机制,而是采用了由 3 层 KDA 加 1 层 MLA 构成的架构单元,即 [KDA, KDA, KDA, Gated MLA]。此外,在第 93 层末尾还额外放置了一个 MLA。因此,整个 Backbone 的精确结构如下:
整个模型由以下部分组成:
- 69 层 KDA(Kimi Delta Attention)线性注意力
- 24 层 MLA(Multi-head Latent Attention)全注意力
在深度维度上,还引入了 Block AttnRes 机制,每 12 层构成一个 Block。
Latent MoE 结构
共享专家的数量增加到了 2 个,整体专家总数进一步扩展至 896 个,Top-K 选择数量也扩大到了 16。为了降低网络通信压力,模型采用了 Latent MoE 结构。这里的"Latent"指的是:在 Top-K 选择的专家中,由于 Top-K 翻倍,通信前会通过一个 Linear 层将数据压缩至原始 Hidden Dim(7168)的一半,即 3584。
1.2 Attention 结构
#### 1.2.1 KDA
单层 KDA 的数据流如下图所示:
从输入到输出,共有六条并行分支汇入一个融合内核,随后经过门控 RMSNorm 和输出投影:
其中包含三条 Q/K/V 分支,分别执行投影与短卷积操作。
3 つの ShortConvolution(hidden_size=12288, kernel_size=4, activation='silu') は因果畳み込みです。各チャネルは独立しており、現在のトークンと直前の 3 トークンのみを参照します。その後、SiLU が適用されます。
q と k は、カーネル内部でヘッドごとの L2 正規化が行われます(use_qk_l2norm_in_kernel=True)。このステップが極めて重要です。これにより、delta 消去演算子 Δ のスペクトルノルムを 1 以下に抑え込み、再帰計算における非拡張性を保証しています。
なぜ畳み込みが必要なのか?
これは頻繁に問われる質問ですが、通常、Linear Attention のカーネルはこの部分でパッチ(修正)を施す必要があります。
あるタスクを考えてみましょう。系列 S において、2 つ目の t_2 で t_1 を予測する(連想記憶)というものです。この際必要な操作は、「t_1 が書き込まれる際に、『直前のトークンは t_1 である』という情報を key にエンコードすること」です。
命題:もし f が逐点写像であれば、単層 KDA ではこのタスクを達成できません。
証明:位置 i(トークンが t_i)の key は k_i = f(t_i) であり、t_{i-1} に依存しません。一方、クエリは q_i = f(t_i) です。
任意の語彙ペア (t_a, t_b) に対して、k_i と q_j の内積が「直前のトークンが一致している場合」にのみ大きく値を持つようにするには、内容に依存しない全順序マッチングが必要です。しかし、f は固定された写像であり、スコアリングは f(t) の内容にしか依存できません。「t_b が t_a の直後に続く」という関係性を表現することは不可能です。減衰項を導入しても、遠くの記憶を薄くするだけで、「直前の位置」という精密な関係を捉えることはできません。
ここで、カーネルサイズ 4 の因果畳み込みを加えることで、問題は解決します。畳み込みが行うのは「自分自身と直前の 3 トークンを加重混合すること」です。
もし t_2 の項を大きく学習すれば、key は近似して「直前のトークンの表現」となります:k_i ≈ f(t_{i-1})。全体の流れを追うと以下のようになります。
書き込み側(t_1 の位置): key ≈ f(t_0)(「私の前には t_0 がいた」)、value = v_1
読み取り側(2 つ目の t_1 の位置): 自身を参照する項で検索、k_j ≈ f(t_1)(「私は t_1 だ」)
内積が即座にヒットし、v_1 が読み出されます。タスク完了です。
これは逐点写像では決して作り出せないものです。まさにこれが、H3 論文で shift-SSM を k 分支に導入した動機であり、Mamba、GLA、GDN、RWKV(token-shift)もすべてこの構造を受け継いでいます。
別の視点として、状態を近似して叠加式連想記憶 S = Σ v_i k_i^T と見なし、k_j で検索すると考えましょう。
串擾(クロストーク)
検索誤差は、Key 集合の相関性 ρ = max_{i≠j} |⟨k_i, k_j⟩| によって制御されます(key は L2 正規化されて単位球面上にあります)。
自然言語のトークンは Zipf 分布に従い、頻出語が大量に繰り返されます。逐点 key を用いると、同じトークンが二度出現した際に、完全な衝突(k_i = k_j)が発生します。KDA ではこの結果がより深刻です。delta 消去演算子 Δ が、古い同キーの記憶を能動的に抹消してしまうからです。つまり、「the」という単語を2度目に目にした瞬間、1度目の「the」に関連付けられていた内容をすべて書き換えてしまうことになります。
畳み込みを加えると、key は 4-gram の関数となります。同じ単語でも、局所的な文脈によって異なるアドレスが割り当てられます。これにより、Key 集合は球面上に効果的に散らばり(相関性が低下)、読み出し時の串擾を低減できます。また、delta 消去も「同一文脈内の同一単語」に限定されるため、固定された状態予算の中で直接容量を向上させることができます。
なぜ k にも畳み込みが必要なのか?
k の検索品質は、q と k が正確にアライメントできるかどうかに依存します。もし q が 4-gram 特徴空間に存在し、k が unigram(単一単語)のみであれば、双線形スコアリングは文脈次元への周辺化に退化してしまいます。つまり、「内容を 4-gram でインデックスして保存したのに、検索時には単語単位でしか探せない」状態になります。したがって、q と k は同じ種類の局所汎関数によって生成されなければならず、k の畳み込み構造は q と対称的である必要があります。同時に、ヘッドごとの L2 正規化も導入されます。
Kimi K3 の KDA(Key-Value Decay Attention)において、書き込み項が保持するのは新しい情報です。もし逐点処理のみを行う場合、状態は「単一トークンの埋め込みの単純な加算」に限定されてしまいます。これでは、BPE で分割された単語や固有名詞、慣用句といった複数のトークンにまたがる複合的な意味を構築できません。その構築プロセスは、後続のデルタ(差分)によって常に上書きされたり中断されたりするリスクがあります。
一方、conv(畳み込み層)を導入することで、書き込み前にすでに 4-gram の複合表現が形成されます。これは、一度に一つの完全な局所意味ユニットを書き込むことと同等です。
なぜ SiLU が必要なのか?
conv は線形演算ですが、4-gram 内の異なるパターンが線形分離不可能な場合、線形のキーではそれらを区別できません。conv の後に SiLU を接続することで非線形関数が生成され、これにより識別可能な n-gram の種類が大幅に拡大します。
(思考問題:なぜ DeepSeek CSA では Overlap が必要なのか?この答えは『DeepSeek-V4 詳細分析 (1): アルゴリズムとモデル構造』に記載されています。)
減衰分支の生成について、これは見落としがちな構造的な細部です。96 ヘッド × 各ヘッド 128 チャネル(合計 12,288)に及ぶ減衰ロジットは、すべて 128 次元の低ランクボトルネックから生成されています。
self.f_a_proj = nn.Linear(self.hidden_size, self.head_dim, bias=False)
self.f_b_proj = nn.Linear(self.head_dim, projection_size, bias=False)
g = self.f_b_proj(self.f_a_proj(hidden_states)) # 7168 -> 128 -> 12288
g = rearrange(g, '... (h d) -> ... h d', d=self.head_dim)ここで、hidden_size は 7168、head_dim は 128、projection_size は 12,288 です。
パラメータ数は約 0.9M で、全ランクの場合の 88.08M に比べて 35 倍削減されています。
その代わり、減衰モードのランクは 128 に制限されます。つまり、異なるヘッド間の忘却挙動は完全に独立しているわけではなく、同じ 128 次元の「忘却意図」ベクトルの異なる線形読み出しとして表現されることになります。
興味深い対比として、K3 は新たに追加された出力ゲート g_proj を低ランクから全ランク(7168 → 12,288)へアップグレードしましたが、減衰ゲートの構造は低ランクのまま維持しています。合理的な解釈としては、両者の感度が異なるためです。出力ゲートは読み出す内容の各チャネルの振幅を直接決定しますが、減衰率には粗粒度な「時間スケールの選択器」で十分であると考えられます。
これに付随する 2 つのパラメータは以下の通りです。
self.A_log = nn.Parameter(torch.log(torch.empty(num_heads).uniform_(1, 16))) # [96]
self.dt_bias = nn.Parameter(torch.empty(projection_size)) # [12288]- A_log: ヘッドごとの学習可能な対数スケールです。初期化により log(σ) が設定され、シグモイド関数の傾斜(つまり減衰が入力にどの程度敏感か)を制御します。
- dt_bias: (ヘッド, チャネル) ごとのバイアスで、報告書における Δt に相当し、各チャネルのデフォルト記憶長さを決定します。
これら 3 つの要素を組み合わせて、Tech Report §2.1.1 で定義されている「有界減衰(bounded decay)」の映射を実現しています。また、書き込み強度分支は、ヘッドごとに 1 つのスカラー値として扱われます。
beta = self.b_proj(hidden_states).float() # [B,T,96], 随后在内核内过 sigmoid 是逐 head 标量,不是逐通道向量。它在在线学习视角下就是学习率:表示"这个 token 不值得写", 表示"完全覆盖旧记忆在 方向上的分量"。注意代码显式 .float() 递推超参一律用 FP32 , 避免 BF16 累积误差污染状态转移。
全秩输出门
if self.use_full_rank_gate:
g = self.g_proj(hidden_states) # K3: 7168 -> 12288
else:
g = self.g_b_proj(self.g_a_proj(hidden_states)) # Kimi Linear: 7168 -> 128 -> 12288
g = rearrange(g, '... (h d) -> ... h d', d=self.head_dim)
o = self.o_norm(o, g) # FusedRMSNormGated: RMSNorm(o) * sigmoid(g)对应报告公式:
FusedRMSNormGated(head_dim=128, activation='sigmoid') 把三件事融合在一个内核里:逐 head RMSNorm (在 128 维上归一), 对门做 sigmoid, 逐元素相乘。归一化必须在门控之前,循环状态的幅度会随 漂移,先归一才能让门的语义稳定为"保留多少比例"。
递推核心:衰减 → 擦除 → 写入
image②擦除①逐通道衰减③写入
三个算子各司其职:
image令 , 展开后可以合并 ②③:
括号里是新息 (innovation): 真实 value 减去当前状态对它的预测。这一步正是对重构损失 做一步学习率为 的梯度下降。
而 出现在梯度步之前,由此可以说清 KDA 相对 GDN 的表达力优势:GDN 用逐 head 标量门,等价于假设状态空间各向同性;KDA 的 channel-wise 门让在线学习的有效学习率逐坐标自适应,允许状态流形各向异性。
注意:读取的是 S_t 而非 S_{t-1},即每个 token 读取的是“包含自身写入后”的状态。这也解释了为何在 chunkwise 并行形式中,Tril 矩阵必须保留对角线元素。
chunkwise 并行形式包含两条执行路径:
路径①(跨 chunk):Query 先乘以自身在 chunk 内的累积衰减,随后一次性读取 chunk 的起始状态,从而承载所有更早的历史信息。该操作的计算成本与序列长度无关。
路径②(chunk 内部):涉及 A 的因果交互矩阵,其中 1/A 是那个可能导致数值溢出的倒数重标定项。后文小节中提到的下界有界处理,正是为了让这一部分能够整体通过稠密 GEMM(通用矩阵乘法)高效执行。由于读取的是本 token 写入后的状态,Tril 矩阵必须包含对角线元素。
上述形式源自 UT 变换,它将 chunk 内的 delta 递推展开为矩阵形式。
关于下界有界衰减:在上述形式中,每个 chunk 的 Key 需要除以累积衰减 A 进行重标定。由于 A 是区间内保留因子的乘积,其倒数可能无界增长,并在有限精度下发生溢出。Kimi Linear 通过在 log 空间计算相对衰减,并将每个 chunk 细分为包含 16 个 token 的次级 tile(子块)来控制数值范围。非对角线 tile 随后可以直接利用 Tensor Core 进行稠密矩阵乘法计算;而对角线 tile 仍需显式的逐位置对(position-pair)计算,这构成了 chunk 内部计算的主要瓶颈。
Kimi K3 通过改变从衰减 logit log(A) 到每步对数衰减的映射来解决这一瓶颈。遵循 GDN 与 Mamba-2 的设计思路,Kimi Linear 使用负 Softplus 映射;而 Kimi K3 则采用 scaled sigmoid(缩放 Sigmoid)函数将 log-衰减从下界进行封底处理:
这是 K3 相对于 Kimi Linear 最具代表性的一处改动。其动机链条完整地从数学形式推导至内核实现路径:
image 其中,是各头可学习的逐头 log-尺度参数,固定。取时,每个保留因子满足,16 token tile 上的累积 log-衰减落在范围内。相应的倒数重标定因子因此小于,保持在 BF16 动态范围内。这一有限范围使得对角 tile 与非对角 tile 都能使用稠密 Tensor Core 矩阵乘法,从而消除了逐位置对的对角路径。
1.2.2 Gated MLA
首先,与标准 MLA 相比,K3 对所有 MLA 层应用了无位置编码(NoPE)。因此这些层的 query 与 key 不施加任何显式位置编码。夹在中间的 KDA 层提供位置敏感且感知近因的序列混合,而 MLA 层则提供不受限的全局内容交互。
此外,Kimi K3 为 MLA 增加了输入依赖的 channel-wise 全秩输出门。记为位置处未门控的 MLA 输出,门控输出为:
门投影为全秩 (7168->12288),该门允许每个 token 调制从全局注意力读出的通道。
1.2.3 Block AttnRes
关于 AttnRes,我们此前已写过一篇《谈谈 Kimi Attention Res 的工作》,此处不再赘述。
2. 关于 Linear Attention 的一些分析
2.1 为什么要用 Linear Attention?
回顾 Linear Attention 的起源,很大程度上受两个因素驱动:
其复杂度为,其中是序列长度。特别是近几年 Context window(上下文窗口)发展迅速,许多模型的上下文长度已扩展至 1M。可以预期的是,未来还将很快扩展到 3M ~ 5M。
另一个重要因素来自 Softmax。为了寻求更低代价的运算方式,使注意力矩阵具备低秩结构,成为了一个重要的探索方向。
这也正是 2020 年 Linear Attention 论文《Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention》[2] 出现的原因。该文章从标准注意力:
演进到线性注意力:
并且可以写成因果递推(RNN)形式:
核心观点如下:
- 核特征映射线性化:将 softmax 注意力中的替换为可分解核,使注意力矩阵具备低秩结构。
- 结合律加速:利用改变计算顺序,先算(与无关),将复杂度从降至。
- Transformer-RNN 等价性:证明因果线性注意力可以写成递推形式,本质上是一个隐状态为矩阵的 RNN。
- 常数内存梯度:推导出前向/反向传播都可以用累积和在线性时间、常数内存内完成。
上記の理由から、多くの人が Linear Attention の可能性に注目しています。計算複雑度が低く、メモリ消費も一定で、Softmax といった比較的遅い演算を回避できるからです。どれも魅力的な特徴です。しかし、これほど完璧な仕組みが本当にあるのでしょうか?物語はいつもこうです。機能や要素が増え、システムが重くなる一方です。
RDMA の例を考えてみましょう。最初はシンプルに「損傷なし」を実現し、ハードウェアも単純で高速でした。しかし最近では、数年かけて何度もパッチを適用しても完全には解決できていません。なぜ誰も「最初から間違っていたのではないか」と疑わないのでしょうか?
2.2 パッチが厚くなる一方
冒頭でも触れた通り、Linear Attention が抱える問題に対処するため、Convolution(畳み込み)を追加して修正する必要が出てきました。さらに、非線形活性化関数である SiLU も追加されました。本来避けたい指数演算が再び加わってしまいました。それでもなお、状態の蓄積や衝突は解消されません。
Linear Attention は状態行列への入力しかできず、不要な情報を「忘れる」ことができません。そこで Mamba-2 では、入力の依存度に応じた記憶寿命(input-dependent memory lifetime)を導入しましたが、忘却が粗すぎ、書き込みも単純な加算に留まりました。次に登場した DeltaNet は、現在のキーに沿って指向性のある書き換えが可能になりましたが、グローバルな旧状態を即座にクリアする仕組みがありませんでした。
そこで Gated DeltaNet が生まれました。これにより、グローバル忘却と指向性書き換えの両立が可能になりましたが、ヘッド(head)ごとに減衰率(decay)は一つだけという制約が残りました。そして KDA の登場です。KDA はキーチャネルごとに独立した減衰を導入しましたが、固定された状態では完全な「トークンアドレス可能メモリ」とは言えません。
他方、遷移行列を考慮すると、その固有値は 1 つが 1 で、残りの d-1 個は λ です。v 方向の固有値は λ です。もし λ を制約しない場合、たとえ |λ| < 1 であっても、再帰過程でその方向が増幅されたり、逆に過剰に反転(オーバーシュート)したりする可能性があります。
Q/K に L2Norm を加える理由
Q は状態遷移には関与しないため、再帰の安定性を考える際、鍵となるのは K です。ただし、出力やチャンク内では Q も K も両方とも使用されます。もし K だけを正規化した場合、
つまり、Query が投影された後のノルム(長さ)に制約がなく、それが読み出し時の増幅係数として直接使われてしまいます。Query のベクトルが長くなればなるほど、読み出される結果は全体として大きく増幅されてしまいます。
Softmax Attention ではこの点を気にする必要がありません。なぜなら、各行で必ず Softmax による正規化が行われ、重みの合計は常に 1 になるからです。Query が長くなっても注意力の分布がより鋭くなるだけで、出力は V の加重平均であり、全体のスケールが増幅されることはありません。
一方、KDA ではこの正規化ステップがありません。そのため、Query のノルムがそのまま結果に乗算されます。これにより、状態の読み出しも増幅され、チャンク内のトークン間の類似度も増幅されてしまいます。逆伝播の際には勾配の規模も変動し、学習の安定性が損なわれます。
Q と K を両方とも正規化すれば、
このとき Q/K は主にアドレス方向(どの位置を参照するか)を表すようになり、類似度の値は有界になります。
では、なぜ V には正規化が必要ないのでしょうか?
Q と K は「どこから読み込むか」、V は「どこへ書き込むか」を表します。これらベクトルのノルム(模長)は、アテンションの親和性(affinity)と重複して制御強度を決定してしまうため、この自由度は排除すべきです。一方、V の値そのものが内容の強さを運ぶ役割を持つため、無理に単位球面上に圧縮する必要はありません。状態の読み出し後には、ヘッドごとの RMSNorm と出力ゲートが最終的なスケールを調整します。
しかし、これらのパッチはまだ完全ではありません。K3 の KDA ではさらに、下界付きの減衰とグローバルな出力ゲートが追加されています。
固定された状態行列を使用することが KDA の効率性の源泉である一方で、それが構造的な制約にもなっています。1 つの状態ベクトルは任意に長い履歴を圧縮しなければならず、フルアテンションのようにすべてのトークンの独立したアドレスを保持することはできません。
そこで Kimi Linear と K3 はハイブリッドアーキテクチャを採用しました。K3 の基本パターンは以下の通りです。
K3 では、KDA レイヤーと Gated MLA レイヤーを組み合わせて使用し、バックボーンの最後にグローバルな混合(global mixing)をもう一度保証します。両者の役割は互いに補完関係にあります。
- KDA は固定状態を担当し、長いシーケンスのミキシングを大部分処理することで、KV キャッシュの容量と履歴読み出し帯域幅を削減します。
- MLA は周期的にトークンアドレス可能なグローバル相互作用を提供し、純粋な固定状態モデルが抱える正確な検索(retrieval)における上限を補完・修復します。
この 3:1 の比率は、KV-Cache の使用量を劇的に節約しているわけではありません。全体の 93 レイヤーの構成と KV Cache のオーバーヘッドは以下の通りで、MLA の KV Cache 使用量が非常に大きい影響を与えていることがわかります。
image 104B のアクティブパラメータ分布を見ると、全体的にやや大きめです。私の当初の推計ではアクティブパラメータは約 80B 程度でしたが、最終的なオープンソース化の結果は予想よりほぼ 20B も多くなってしまいました。
image 他方、KDA との連携のために、MLA にもさらに Gated Output を追加する必要があります。単純な試算では、Gated Output の追加だけでアクティブパラメータが約 8B 増加します。これだけのコストを払ってでもやる価値があるのでしょうか?正直に言って、システム全体の複雑さは増す一方です。だからこそ、このような図が存在するのかもしれません。
Kimi が Linear Attention の実現に向けて K3 で多大な努力を払ったことは事実です。直感的には、Gated Output や AttnRes、そして後続の per-head moun などは、訓練中の安定性問題に対処するために段階的に追加されたパッチのようなものです。しかし、これらの追加が重くなりすぎた結果、Linear Attention が本来持つべきメリットを十分に得られなかったという側面もあります。一方で、内部で多数の小演算子を融合させることで計算複雑度は依然として高いままです。
さて、この節では、これら 3 つの要素がどのように協働するかを、純粋に数学的な観点から分析してみましょう。
2.3 KDA の再解釈:代数的視点
KDA を代数構造の観点から再解釈することは非常に価値があります。では、KDA とは何か?結論から言うと以下の通りです。
KDA の公式は以下のように記述できます。
このとき、KDA の更新則は「仿射収縮半群」を構成します。その後の分析はすべて、この代数構造の性質に基づいて展開されます。
まず、今回の書き換えについて見てみましょう。単に新しい記号を導入しただけに見えますが、この書き換えの真価は以下の分離にあります。
この分離は、後続の分析における基礎となります。
安定性の問題はほぼすべて A に起因します(状態が爆発するかどうか)。
表現力の問題はほぼすべて B に起因します(どれだけ多くの情報を埋め込めるか)。
明らかに、A はランク 1 の行列です。列方向に分解して見れば一目瞭然で、すべての d_k 個の列は、同じベクトル v のスカラー倍となっています。
第 j 列:a_j = v * b_j
2.3.1 A の固有値
ランク 1 の行列には非ゼロの固有値がただ一つしか存在せず、その値は ||v|| * ||b|| に等しくなります。A を直接計算すると以下のようになります。
これもまたランク 1 の行列であり、唯一の非ゼロ固有値は ||v|| * ||b|| です。したがって、AA^T の唯一の非ゼロ固有値も (||v|| * ||b||)^2 となります。
平方根をとれば、唯一の非ゼロ特異値が得られます。
最後のステップでは、L2 ノルム(二乗和ノルム)による正規化により ||v|| = 1 が保証されています。これは、正規化が単なる装飾ではなく不可欠な要素であることを再確認させるものです。これにより、書き込まれる振幅は ||b|| と ||v|| のみによって決定され、キーベクトルの方向には依存しなくなります。
非ゼロ特異値がただ一つしかないため、スペクトルノルム(演算子ノルム)とフロベニウスノルムは一致します。
- スペクトルノルム ||A||_2 は安定性を分析するための適切な指標です(これは演算子のゲインであり、次乗性 ||AB||_2 ≤ ||A||_2 * ||B||_2 を満たします)。ただし、通常は固有値問題を解く必要があります。
- 一方、フロベニウスノルム ||A||_F は要素ごとの閉じた式(クローズドフォーム)を持ち計算が容易です。
ランク 1 という性質により両者は等しくなるため、計算しやすいフロベニウスノルムの閉じた式を利用しながらも、スペクトルノルム特有の演算子としての性質を享受できるのです。
2.3.2 重要な構造:列方向の完全な独立
n
A は左から乗算されます。行列乗算において、左乗算は行同士を混合しますが、列同士は混合しません。A を列ごとに分解し、第 j 列を a_j と記します(ただし b_j はスカラー)。このとき、再帰式の第 j 列を取り出すと以下のようになります。
導出:A の第 j 列は v * b_j です。ここで b_j はスカラーです。これにより、重要な結論が得られます。
KDA の状態更新は、互いに独立した n 次元のアフィン动力系统(アフィン力学系)の集合です。これらは同じ遷移行列を共有しており、書き込み項のスカラー係数のみが異なります。
この構造から、以下の三つの重要な点が説明できます。
第一に、スペクトル解析では A のみを調べれば十分である理由です。128 個の列はすべて一つの遷移演算子を共有しているため、安定性は単一の演算子の性質によって決定されます。
第二に、B が正規化(ノーマライゼーション)を必要としない理由です。B は書き込み項のスカラー係数としてのみ現れ、状態ベクトル x の振幅には影響を与えますが、A のスペクトル(固有値の分布)には影響しません。安定性に対する B の依存性は加算的であり、乗算的ではありません。対照的に、C は A と B の両方に現れるため、正規化が必要となります。
第三に、B が n 次元ではなく d 次元である理由です。減衰作用はアドレス空間の座標に対して行われるものであり、その意味は「このキーチャネルの記憶がどれほど持続するか」を指します。「このバリュー成分をどの程度保持するか」という意味ではありません。
2.3.3 アフィン変換
アフィン変換である場合、以下の三つの課題に対応する必要があります。
- スペクトルだけでなく、書き込みの累積も追跡しなければならない
純粋な線形システム x_{t+1} = Ax_t の長期的な振る舞いは、遷移行列の積 A^t によって完全に決定されます。スペクトルがゼロに収束すれば状態もゼロになります。しかし、アフィンシステムの一般解は二つの部分に分かれます。
・斉次解:初期値の忘却
・書き込み項の累積
スペクトル(つまり A の縮約性)は第一項のみを管理し、初期状態がどれほど速く忘れ去られるかを決定します。第二項は外部入力によって継続的に供給される結果であり、たとえスペクトルが小さくてもこの項が消滅することはありません。端的に言えば、純粋なスペクトル分析だけでは、状態の定常部分(ステady state)全体を見逃してしまいます。後ほど詳しく分析を展開します。
- 結合則には交差項が含まれており、これがチャンク並列処理の核心である
二つのステップを合成した際の書き込み項は単純な b_1 + b_2 ではなく、A_2 b_1 + b_2 となります。これは、前段で書き込まれた情報 b_1 が、後段の遷移行列 A_2 を通じて作用(減衰・消去)を受けた後に、後段の書き込み b_2 と加算されることを意味します。
この交差項こそが、「先に書き込まれた情報は、その後のトークンによっても継続的に減衰・擦除される」という現象の代数的表現です。もしこれが存在しなければ(つまり純粋な加法的線形アテンションであれば)、結合則は b_1 + b_2 へと退化し、各セグメントを順序無視で合計することが可能になります。しかし、この交差項があるからこそ、KDA におけるセグメント間の縮約は順序を保つ必要があります。一言で言えば、この交差項こそが、KDA が純粋な線形アテンションよりも表現力が高く、かつ並列化が難しい根源的な理由です。
- 不動点がゼロではない
線形システム x_{t+1} = Ax_t の不動点は、A^t → 0 の場合、自明解 x = 0 のみです。一方、アフィンシステム x_{t+1} = Ax_t + b の不動点は以下のようになります。
x* = (I - A)^{-1}b
これは、同じ入力 b を繰り返し与え続けると、状態はゼロに減衰するのではなく、その入力によって決定される非ゼロの「記憶」x* に収束することを意味します。これが本来「連想記憶」が持つべき振る舞いです。純粋な線形システムではすべてがゼロに忘れ去られてしまい、記憶媒体として機能しません。書き込み項 b が、KDA を単なる減衰器ではなく、真の記憶装置たらしめている部分です。
これら三つの課題は、同じ本質を指し示しています。
・スペクトル(A に由来):「どれほど速く忘れるか」を管理する
・書き込み(b に由来):「何を記憶するか」を管理する
アフィン構造はこの二つを分離しており、線形構造には前者しか存在しません。言い換えれば、
・安定性の問題はほぼすべて A に委ねられる(状態が爆発しないか)
・表現力の問題はほぼすべて b に委ねられる(どれだけ多くの情報を書き込めるか)
2.3.4 アフィンモノイド:代数的骨格
各トークンをアフィン写像とみなせば、「一連のトークンシーケンスを処理する」という行為は、これらの写像の合成となります。この合成演算は優れた代数構造を形成します。
2.3.4.1 アフィン変換の合成演算の閉包性
二つのアフィン写像を考えます。
f_1(x) = A_1 x + b_1
f_2(x) = A_2 x + b_2
直接計算すると、その合成は以下のようになります。
(f_2 ∘ f_1)(x) = A_2(A_1 x + b_1) + b_2 = (A_2 A_1)x + (A_2 b_1 + b_2)
結果もまたアフィン写像です。したがって、アフィン写像を二元組 (A, b) で表した場合、合成演算の式は以下のようになります。
(A_2, b_2) ∘ (A_1, b_1) = (A_2 A_1, A_2 b_1 + b_2)
閉包性が成立します。これが半群の最初の要件です。
特に第二成分にある A_2 b_1 に注意してください。前段で書き込まれた情報は、後段の減衰と消去(A_2 による作用)を経た後に、後段の書き込み b_2 と加算されます。これがまさに「先に書き込まれた情報が、その後のトークンによっても継続的に忘れ去られる」という現象の代数的表現です。
2.3.4.2 結合律の段階的な検証
半群の二つ目の、かつ唯一実質的な要件は結合律です。三つのアフィン対 (A_1, b_1), (A_2, b_2), (A_3, b_3) を考えます。
まず ((f_3 ∘ f_2) ∘ f_1) を計算します。内側から始めます。
(f_3 ∘ f_2)(x) = A_3(A_2 x + b_2) + b_3 = (A_3 A_2)x + (A_3 b_2 + b_3)
これをさらに f_1 と合成します。
((f_3 ∘ f_2) ∘ f_1)(x) = A_3(A_2(A_1 x + b_1) + b_2) + b_3
= (A_3 A_2 A_1)x + (A_3 A_2 b_1 + A_3 b_2 + b_3)
次に (f_3 ∘ (f_2 ∘ f_1)) を計算します。内側から始めます。
(f_2 ∘ f_1)(x) = A_2(A_1 x + b_1) + b_2 = (A_2 A_1)x + (A_2 b_1 + b_2)
これをさらに f_3 と合成します。
(f_3 ∘ (f_2 ∘ f_1))(x) = A_3((A_2 A_1)x + (A_2 b_1 + b_2)) + b_3
= (A_3 A_2 A_1)x + (A_3 A_2 b_1 + A_3 b_2 + b_3)
両式を項ごとに比較すると完全に一致します。したがって、
(f_3 ∘ f_2) ∘ f_1 = f_3 ∘ (f_2 ∘ f_1)
結合律が成立します。
結合律の深い由来について言及する価値があります。これは行列乗法の結合律に由来しています。第一成分は純粋な行列積であり、明らかに結合則を満たします。第二成分の三項(例:A, B, C)は、「第 i 段から書き出し、その後続するすべての段の遷移を順に経る」というパスの総和を表しています。括弧の付け方を変えるのは単に総和のグループ順序を変更するだけであり、各パスそのものには影響しません。
2.3.4.3 単位元:半群からモノイドへ
I を恒等写像とします。任意の状態 s に対して、
両側からの単位元が存在します。したがって厳密にはこれは単なる半群ではなく、モノイド(monoid)です。これを以下のように記号で表します。
単位元の意味論的解釈:空のトークン列は状態に対して何もしません。これは chunkwise アルゴリズムにおける「空のチャンクも有効なチャンクである」という代数的保証であり、境界ケースにおいて特別な分岐処理を不要にしています。
2.3.4.4 なぜ群ではないのか:忘却の不可逆性
前述した通り、モノイドの三条件(結合則の閉包、結合律、単位元の存在)は既に検証済みです。群がモノイドと異なる点は、単に「各要素の逆元もまたこの集合内に含まれなければならない」という追加要件があることです。これは見落としがちですが、KDA の意味論を理解する上で最も重要な点です。
モノイド M が可逆であるのは、行列 A が可逆である場合に限られ、そのとき逆行列が存在します。
では、KDA の単一ステップ遷移 T_i は可逆でしょうか?まず可逆性を確認しましょう。行列式の公式より、
各単一ステップの遷移行列は非特異(正則)です。したがって、すべての可逆行列からなる群 GL(n) 内には確かに逆元が存在し、一見すると「群」のように思えます。しかし、実際にはそうではありません。鍵となるのは、可逆な要素の逆元が「実行可能な族(feasible family)」内に存在しないという点です。
T_i^{-1} を設定して代入すると、
ここで det(A) = 0 の条件を用いました。括弧内をゼロに置くと、
したがって、
次に、この逆元と実行可能な族 F の要件を項目ごとに照らし合わせます。
したがって、
KDA が生成する要素集合は合成演算に対して閉じていますが(部分モノイド)、逆元を取る操作に対しては閉じていません。これは群ではなくモノイドです。また、det(A) = 0 の場合、逆行列は数値的に極めて不安定(病態)になります。閉包内では A=0 の点において真の特異元が出現します。
これが「忘却の不可逆性」の代数的根源です。これは実装側でデータを捨てたからではなく、アーキテクチャがモデルに与えているのが縮小方向への生成子のみであり、拡大方向への生成子が存在しないからです。前方計算では任意の組み合わせで忘却を行うことができますが、一度行われた忘却を取り消すトークン列は存在しません。なぜなら取り消しには拡大型の遷移が必要ですが、モデルはそのような遷移を生成できないからです。情報が A によって減衰したり、B が x 方向に沿って擦り消したりした場合、その情報はシーケンス軸上では二度と回復できません。
2.3.4.5 自由モノイド準同型:工程上の実装則「まず分段計算し、後に結合する」
前述の通り、アフィン対(affine pairs)は合成閉包性、結合律、単位元の存在を満たすことが証明されました。この節では、この代数的構造を、そのまま実装に落とし込める言葉へと翻訳します。
核心的な観察:KDA がトークン列を処理する際の本質は、各トークンのアフィン写像 T_i を順序通りに合成することです。合成演算には結合律が成り立つため、シーケンスをいくつかのセグメントに分割し、それぞれのセグメントに対して「その区間が状態に与える純粋な効果(一つのアフィン対)」を計算した上で、それらのアフィン対をさらに合成しても、最初から最後まで一つずつ処理した場合と全く同じ結果が得られます。
これが KDA が並列化可能である理由のすべてです。長いシーケンスは、数字の列をグループごとに和をとってから合計するのと同様にして、一つのアフィン対 T に凝縮することができます。
形式的な記述:トークンの入力空間を V(すなわち、L 層の入力を生成する空間)とし、V* を V 上の自由モノイド(すべての有限列の集合。演算は連結、単位元は空文字列)とします。定義を以下のように行います。
「1 つのトークン列」を $S$ と記し、空の序列を $\emptyset$ とします。また、列をその状態に対するアフィン変換に写す写像 $\phi: S \to \mathbb{R}^{d \times d}$ を定義します。
この定義には 3 つの重要な性質があります:
- 空序列は恒等写像(何もしない)です。
- 単一のトークンは、そのステップにおけるアフィン変換そのものです。
- 2 つの列を連結した全体の効果は、それぞれの列がもたらす効果の合成になります。ここで注意すべきは、後処理される側の変換 $\phi(S_2)$ が左側に記述される点です(後から作用するため)。この「分割して計算し、その後結合する」という性質は、数学的には半群準同型と呼ばれます。
これが持つ工学的な価値は、「分段計算後に結合できる」ことと、結合順序に括弧の付け方を変えても結果が変わらない(結合律が成立する)ことにあります。これこそが、FlashKDA や KCP といった並列処理戦略を可能にする根拠です。
2.3.4.6 非可換性:結合律と可換性の違い
KDA は結合律を満たしますが、一般には可換性は満たしません。つまり、通常 $\phi(S_1) \cdot \phi(S_2) \neq \phi(S_2) \cdot \phi(S_1)$ です。
その理由は、$\Delta_t$ の特徴ベクトルが $v_t$ によって決定される(特徴方向は $v_t$ とその直交補空間で構成される)一方、$\Lambda_t$ の特徴ベクトルは固定された座標軸であることにあります。異なるトークンでは $v_t$ の方向が異なるため、$\Delta_t$ と $\Delta_s$ は一般に共通の特徴基底を持ちません。同様に、$\Delta_t$ と $\Lambda_s$ も($v_t$ がたまたま座標ベクトルでない限り)共通の基底を持ちません。
ただし、減衰係数同士は可換です:
$$ \Lambda_t \cdot \Lambda_s = \Lambda_s \cdot \Lambda_t $$
したがって、純粋な減衰線形注意力(スカラーまたは対角行列による忘却で、$\Delta$ 項を持たないもの)の遷移行列は可換になります。しかし KDA はデータ依存性のランク 1 の方向補正を導入しているため、この可換性が破られます。
これは決して欠点ではありません。可換性があるとモデルがトークンの順序に敏感にならなくなるからです。KDA の非可換性は、まさに時系列情報を符号化する方法そのものです。つまり、厳密な順序のセマンティクスが完全に保持されているのです。これが KDA が明示的な位置エンコーディングを不要とする前提条件となっています。
2.3.5 位置情報は遷移行列の積に内包される
この問題をさらに展開するために、$\phi(S)$ から出発して反復代入を行います。
帰納法により一般解は以下のようになります:
$$ \phi(S) = \prod_{t=1}^{|S|} (\Lambda_t + \Delta_t) $$
ここで行列の積は添字を大きい方から小さい方へ、左から右へと計算します(空積は単位行列 $I$ です)。また、2 パラメータ遷移演算子を以下のように定義します:
$$ T_t = \Lambda_t + \Delta_t $$
すると一般解は簡潔に $\phi(S) = \prod_{t=1}^{|S|} T_t$ と書けます。これは任意の $k < j$ に対して以下の性質を満たします。
この式を代入し、$j=k+1$ を取り、読み出し操作を行うと:
$$ \text{Attention}(i, j) = v_i^\top (\prod_{t=i}^{j-1} T_t) u_j $$
この式は、KDA が数学的には一種の注意力機構であることを示しています。ただし核関数が異なるだけです。
位置情報が遷移行列の積に内包されていることが、ここで最も注目すべき点です。トークン $i$ から $j$ への到達可能性は、その間のすべての遷移行列の積によって完全に決定されます。これらの行列はデータから生成されるため、KDA が提供する位置情報は「データ依存性の相対位置情報」となります。
この暗黙的な核関数は、なぜ Gated MLA に RoPE(回転位置エンコーディング)が不要なのかを説明できるでしょうか?
技術報告ではこう述べています:K3 技術報告 §2.1.2 では、すべての MLA レイヤーに NoPE を採用しています。その理由は一言で「役割分担」にあります。
中間に挟まれた KDA レイヤーが位置感度と近因(直近の文脈)を感知したシーケンス混合を提供し、MLA レイヤーが制限のないグローバルなコンテンツ相互作用を提供する。
さらに技術報告 §3.4 では、NoPE を採用する理由として「KDA の循環ゲートと減衰メカニズムによって位置情報が暗黙的に符号化される」と記されています。これにより、1M トークンのコンテキストでも位置エンコーディングの手術が不要であると結論付けられています。
ここで言う「暗黙的な位置情報の符号化」の詳細は報告書内で展開されていませんが、前述の「位置情報は遷移行列の積に内包される」という式 $\prod T_t$ が、まさにその数学的表現です。位置情報はすべてこの遷移行列の積の中に含まれています。
純粋な減衰近似 $T_t \approx \Lambda_t$ を考えると、あるチャネルの減衰率が安定して $\lambda$ である場合、そのチャネルにおける核因子は以下のように単純化されます。
単に距離のみを依存させるのは、まさに純粋な相対位置バイアスであり、指数減衰型のものである。しかし、減衰率がデータに依存するようになると、同じ距離でも中間のトークン内容によってその度量が変化する。これにより、データ依存型の相対位置度量へと進化することになる。
演算子ノルムとの相容性から即座に導かれる核の指数包絡は以下の通りだ。
これが報告書にある「近因を感知するシーケンス混合」という表現の正確な意味である。KDA の核は、学習によって獲得された、チャネルごとの多尺度相対位置核そのものである。核の振幅は、データ依存型の指数減衰包絡によって制御される。この明確な境界線は、完全に L2 正規化に依存していることに注意が必要だ。もし正規化がなければ、右辺には制約のないノルムが二つ追加されてしまう。
重要なステップは、この位置情報がどのようにして MLA に伝達されるかである。これは核の展開自体からは直接得られず、補完が必要な一環となる。前述したのは KDA レイヤー自身の出力であり、MLA は別の種類のレイヤーである。これらを橋渡しするのは残差流だ。
- レイヤーが近因性をゲート付き残差流の内容に書き込む
- 時系列読み取り層は、順序を含む内容に対して純粋なコンテンツアテンションを行う
もう一つの視点として、KDA の非可換性がある。任意の二つのトークンの順序を交換すると KDA の状態が変化するため、KDA の出力には順序情報が含まれている。この出力が出力ゲートを通じて残差流に書き戻されれば、下流の MLA が読み取るコンテンツ表現にはすでに順序が含まれることになる。その結果、MLA は「NoPE」のような純粋なコンテンツスコアリング(query/k)のみを行えばよい。
原文を表示
原创 渣B 2026-08-07 13:26 浙江
image
TL;DR
上周处于好奇写了一篇文章《详细分析一下Attention, Sparse or Linear?》, 正好 K3 的technical report仔细分析了一下, 似乎解答了很多我关于Linear Attention的疑惑, 这次一起开源的AgentENV 等工作也非常值得深入的去学习. 后训练部分和Infra部分也有很多值得仔细推敲的地方, 因此分成几篇文章来写吧.
当然任何事情都还需要辩证的考虑, 恰好前几天也在看廖博的一个访谈《对华为半导体首席科学家廖恒的5小时访谈:一部昇腾史、18层宝塔与全球芯片恢弘30年史诗》[1], 其中也谈论到DeepSeek的sparse路线, 特别是正式版的DeepSeek-V4 Flash性能也非常不错, 毕竟是一个284B-A13B的模型...
总体来看Kimi K3在模型效果和训练上都做的非常棒, 特别是相对于K2.5有 2.5x 的 Scaling Efficiency, 但是整个模型架构上似乎并没有兼顾到高效率的推理, 在模型架构和芯片架构co-design的处理上, K3还是有所欠缺的, 当然正如廖博在访谈里讲的一些内容, 这一点做起来挺难的, 特别对人的要求会更高, 需要从数学和算法层面对模型结构有很深入的评估, 又要深入底层对芯片架构和内存访问有非常细节的理解, 或许能把这18层完全通关的人并不多...
这是一个系列的文章, 字数太多拆成几篇写. 大致第一篇对K3: KDA + Gated MLA + Block AttnRes 的协同进行一个详细的分析, 第二篇会详细对比一些和Sparse Attention的分析, 经历够可能还会从芯片的视角再补一篇.. 这是整个系列的第一篇, 今天这篇主要关注与模型结构相关的内容, 即KDA 如何与 Gated MLA 以及 AttnRes 协同的问题.
本文第一章主要是对模型结构进行一些简单的分析, 如果熟悉 K3 模型结构可以直接跳过. 第二章是全文的重点. 本文目录如下:
- Kimi K3 模型架构
1.1 Overview
1.2 Attention 结构
1.2.1 KDA
1.2.2 Gated MLA
1.2.3 Block AttnRes
- 关于 Linear Attention 的一些分析
2.1 为什么要用 Linear Attention?
2.2 越来越厚的补丁
2.3 重新解读 KDA: 代数的视角
2.3.1b_t 的特征值
2.3.2 关键结构: 列方向完全解耦
2.3.3 仿射变换
2.3.4 仿射幺半群: 代数骨架
2.3.4.1 仿射变换的复合运算封闭
2.3.4.2 结合律的逐步验证
2.3.4.3 单位元: 从半群升级为幺半群
2.3.4.4 为什么不是群: 遗忘的不可逆性
2.3.4.5 自由幺半群同态: 工程上先分段算, 再拼起来
2.3.4.6 非交换性: 结合律不等于可换序
2.3.5 位置度量内生于转移积 Γ
2.3.6 收缩性: 谱分析
2.3.7 收缩为什么是正确设计
2.3.8 数值实现的精度下界: 状态为什么必须是 FP32
2.3.9 小结
2.4 K3: KDA + Gated MLA + Block AttnRes 的协同系统
2.4.1 Gated MLA的作用
2.4.1.1 A 类: MLA 结构性接住的五项
2.4.1.2 C 类: 部分缓解, 残差可估计
2.4.1.3 B 类: 唯一一项 MLA 完全不触及的
2.4.1.4 MLA每层也有盲区
2.4.1.53:1混合带来的修复延迟
2.4.1.6 小结
2.4.2 Blocked AttnRes的作用
2.4.2.1 被缓存的那份表示本身在退化
2.4.2.2 全秩输出门与 AttnRes
2.4.2.3 组件之间的互相协同1. Kimi K3 模型架构
1.1 Overview
Kimi K3 是一个约 2.78T 总参数, 约 105B 单 token 激活参数的多模态稀疏 MoE 模型. 相对于Kimi K2的变化:
image模型架构如下图所示:
image暂时抛开视觉Embedding的部分不谈, 我来看语言部分的主体框架
混合注意力结构
93 层不是全部使用标准全注意力, 采用3层KDA + 1层MLA的架构单元, 也就是采用:[KDA,KDA,KDA,Gated MLA]的单元结构, 然后在最后第 93 层再放一个 MLA, 所以整个 backbone 的精确结构是:
整个模型结构就包含:
69 层 KDA(Kimi Delta Attention)线性注意力
24 层 MLA(Multi-head Latent Attention)全注意力
然后在深度这个维度上有一个block AttnRes, 每12层构成一个block.
imageLatent MoE 结构
共享专家数增加到了2个, 整体专家数量进一步扩展到了896, topk进一步扩展到了16, 为了降低网络通信上的压力, 采用了 Latent MoE的结构, Latent的意思是在 topk 选择的专家中, 由于topk 翻倍, 那么在通信前通过一个Linear层压到原来 Hidden dim 7168的一半,即 3584.
1.2 Attention 结构
1.2.1 KDA
单层的KDA数据流如下图所示:
image可以看到从输入 到输出 共有六条并行分支汇入一个融合内核, 再经门控 RMSNorm 和输出投影:
image三条 q/k/v 分支: 投影 + 短卷积
三个 ShortConvolution(hidden_size=12288, kernel_size=4, activation='silu') 是因果卷积 (每个通道独立, 只看当前和前 3 个 token), 后接 SiLU. q 和 k 之后还会在内核内做逐 head L2 归一 (use_qk_l2norm_in_kernel=True). 这一步很关键: 使得 时 delta 擦除算子 的谱范数不超过 1, 递推非扩张.
为什么需要卷积?
这是一个经常被问到的问题, 通常Linear Attention的Kernel都得在这个地方打一个补丁.
我们来考虑一个任务: 序列 , 在第二个 处预测 (联想回忆). 此时所需操作是: 在写入 时, 把 "前一个 token 是 " 编码进 key.
命题: 若 逐点, 则单层 KDA 无法完成该任务.
论证: 位置 (token 为 ) 的 key 是 , 与 无关. 查询端 .
要使 对任意词表配对 都恰好偏大, 等价于要求一个与内容无关的全序匹配, 而 是固定映射, 打分只能依赖 的内容, 无法表达 " 紧跟在 后面" 这个关系. 衰减 也帮不上忙, 它只会让越远的记忆越淡, 表达不了 "紧挨着的前一个位置" 这种精确关系.
加上 kernel = 4 的因果 conv, 问题一步解决. conv 做的事就是 "把自己和前 3 个 token 加权混合":
只要把 这一档学大, key 就近似变成 "前一个 token 的表示": . 整个流程串起来:
写入端 ( 的位置): key ≈ ("我前面是 "), value =
查询端 (第二个 的位置): 用 档取自己, ("我就是 ")
内积 立即命中, 读出 ,任务完成
这是逐点映射无论如何造不出来的东西. 这正是 H3 论文把 shift-SSM 引入 分支的原始动机, Mamba/GLA/GDN/RWKV (token-shift) 全部继承了这一结构.
另一个视角, 把状态近似看成叠加式联想记忆 , 用 检索:
串扰
检索误差由 Key 集合的相干性 控制 (key已被 L2 归一到单位球面上).
我们注意到自然语言 token 服从 Zipf 分布, 高频 token 大量重复: 逐点 key 意味着两次出现的同一个 token 给出 的完全碰撞. 对 KDA 这后果更加严重, delta 擦除算子 会把旧的同键记忆主动抹掉: 等同于第二次见到 "the" 就冲掉第一次 "the" 挂着的内容.
conv 之后 key 是 4-gram 的函数: 同一个词在不同局部上下文中获得不同的地址, Key集合在球面上被有效散开 (相干性下降), 既降低读出串扰, 又让 delta 擦除只覆盖"同一上下文中的同一个词". 在固定的 状态预算下, 直接提升了容量.
为什么 也需要卷积?
对于 , 检索质量取决于 是否能对准. 若 活在 4-gram 特征空间而 是 unigram 的, 双线性打分退化为对上下文维度的边缘化, 也就是说你把内容按 4-gram 索引存了, 却只能按单词查. 因此, 必须由同一类局部泛函生成, 所以 与 的 conv 结构对称, 并同时引入逐 head L2 归一.
对于 , 写入项存的是新息 . 若 逐点, 状态只能存"单 token 嵌入的叠加", 多 token 的复合语义 (BPE 切碎的词, 专名, 习语) 必须靠状态慢慢拼装, 而拼装过程随时可能被后续 delta 擦除打断. conv 让 在写入前就已经是 4-gram 的复合表示, 等同于一次写入一个完整的局部语义单元.
为什么需要SiLU?
conv 是线性的, 4-gram 中不同模式若线性不可分, 则线性 key 无法区分它们; conv 后接 SiLU 生成成为 4-gram 的非线性函数, 此时可区分的 n-gram 类 扩大了.
思考题, 为什么在DeepSeek CSA中要做Overlap? 这个问题答案在《DeepSeek-V4详细分析(1): 算法和模型结构》.
衰减分支, 生成
这是比较容易被忽略的结构细节: 全部 96 个 head × 每个head 128 个通道 (共 12288 个) 的衰减 logit, 是从一个 128 维的低秩瓶颈生成的.
self.f_a_proj = nn.Linear(self.hidden_size, self.head_dim, bias=False)
self.f_b_proj = nn.Linear(self.head_dim, projection_size, bias=False)
g = self.f_b_proj(self.f_a_proj(hidden_states)) # 7168 -> 128 -> 12288
g = rearrange(g, '... (h d) -> ... h d', d=self.head_dim)其中:
, ,
参数量 M, 相比全秩 88.08 M 省了 35 倍
代价是衰减模式的秩被限制为 128: 不同 head 的遗忘行为不是完全独立的, 而是同一个 128 维"遗忘意图"向量的不同线性读出
有意思的对比是: K3 把新增的输出门 g_proj从低秩升级成了全秩(7168 -> 12288), 却保留了衰减门的低秩结构. 合理的解释是二者敏感度不同, 输出门直接决定读出内容的每个通道幅度, 而衰减率只需要一个粗粒度的"时间尺度选择器"?
配套的两个参数:
self.A_log = nn.Parameter(torch.log(torch.empty(num_heads).uniform_(1, 16))) # [96]
self.dt_bias = nn.Parameter(torch.empty(projection_size)) # [12288]A_log: 逐 head 的可学习 log 尺度, 初始化使 , 控制 sigmoid 的陡度 (即衰减对输入的敏感度)
dt_bias: 逐 (head, channel) 的偏置, 对应报告里的 , 决定每个通道的默认记忆长度
三者组合出Tech Report §2.1.1 下界有界衰减 的映射:
写入强度分支: 每 head 一个标量
beta = self.b_proj(hidden_states).float() # [B,T,96], 随后在内核内过 sigmoid 是逐 head 标量, 不是逐通道向量. 它在在线学习视角下就是学习率: 表示"这个 token 不值得写", 表示"完全覆盖旧记忆在 方向上的分量". 注意代码显式 .float() 递推超参一律用 FP32 , 避免 BF16 累积误差污染状态转移.
全秩输出门
if self.use_full_rank_gate:
g = self.g_proj(hidden_states) # K3: 7168 -> 12288
else:
g = self.g_b_proj(self.g_a_proj(hidden_states)) # Kimi Linear: 7168 -> 128 -> 12288
g = rearrange(g, '... (h d) -> ... h d', d=self.head_dim)
o = self.o_norm(o, g) # FusedRMSNormGated: RMSNorm(o) * sigmoid(g)对应报告公式:
FusedRMSNormGated(head_dim=128, activation='sigmoid') 把三件事融合在一个内核里: 逐 head RMSNorm (在 128 维上归一), 对门做 sigmoid, 逐元素相乘. 归一化必须在门控之前, 循环状态的幅度会随 漂移, 先归一才能让门的语义稳定为"保留多少比例".
递推核心: 衰减 → 擦除 → 写入
image②擦除①逐通道衰减③写入
三个算子各司其职:
image令 , 展开后可以合并 ②③:
括号里是新息(innovation): 真实 value 减去当前状态对它的预测. 这一步正是对重构损失 做一步学习率为 的梯度下降.
而 出现在梯度步之前, 由此可以说清 KDA 相对 GDN 的表达力优势: GDN 用逐 head 标量门, 等价于假设状态空间各向同性; KDA 的 channel-wise 门让在线学习的有效学习率逐坐标自适应, 允许状态流形各向异性.
输出
注意读的是 而不是 , 即每个 token 读的是"包含自己写入之后"的状态. 这解释了 chunkwise 并行形式里为什么 Tril 要保留对角线.
chunkwise 并行形式与两条执行路径
项 ① (跨 chunk): query 先乘上自己在 chunk 内的累积衰减 , 再一次性读入 chunk 起始状态, 承载全部更早历史; 成本与序列长度无关.
项 ② (chunk 内): 的因果交互矩阵, 就是那个会溢出的倒数重标定项, 后面一小节的下界有界处理正是为了让这一块能整体走稠密 GEMM. Tril 含对角线, 因为读的是本 token 写入后的状态.
来自 UT 变换 (把 chunk 内的 delta 递推展开为矩阵形式).
下界有界衰减. 上述形式中每个 chunk 的 key 要除以累积衰减 进行重标定. 由于 是 区间内保留因子的乘积, 其倒数可以无界增长并在有限精度下溢出. Kimi Linear 通过在 log 空间计算相对衰减、并将每个 chunk 细分为 16 token 的次级 tile 来控制数值范围. 非对角 tile 随后可以直接用 Tensor Core 上的稠密矩阵乘法计算; 而对角 tile 仍需要显式的逐位置对 (position-pair) 计算, 这构成 chunk 内计算的主要瓶颈.
imageKimi K3 通过改变从衰减 logit 到每步 log-衰减 的映射来解决这一瓶颈. 遵循 GDN 与 Mamba-2, Kimi Linear 使用负 Softplus 映射 . Kimi K3 则使用 scaled sigmoid 将 log-衰减从下界封住:
这是 K3 相对 Kimi Linear 最有代表性的一处改动, 动机链条完整地从数学形式推到内核路径:
image其中 是可学习的逐头 log-尺度, 固定.取 时, 每个保留因子满足 , 16 token tile 上的累积 log-衰减落在 内. 相应的倒数重标定因子因此小于 , 保持在 BF16 动态范围内. 这一有限范围使对角 tile 与非对角 tile 都能使用稠密 Tensor Core 矩阵乘法, 消除了逐位置对的对角路径.
1.2.2 Gated MLA
首先, 相对于标准的MLA, K3 对所有 MLA 层应用无位置编码 (NoPE). 因此这些层的 query 与 key 不施加任何显式位置编码. 夹在中间的 KDA 层提供位置敏感且感知近因的序列混合, 而 MLA 层提供不受限的全局内容交互.
此外, Kimi K3 为 MLA 增加了输入依赖的 channel-wise 全秩输出门. 记 为位置 处未门控的 MLA 输出, 门控输出为:
门投影 为全秩(7168->12288), 该门允许每个 token 调制从全局注意力读出的通道.
1.2.3 Block AttnRes
AttnRes以前写过一篇《谈谈Kimi Attention Res的工作》 就不额外展开了.
- 关于Linear Attention的一些分析
2.1 为什么要用Linear Attention?
其实回顾一下 Linear Attention 的开端, 很大程度上有两个因素:
的复杂度, 其中 是序列长度, 特别是这几年的快速发展 Context window 很多模型已经扩展到了 1M . 可以预期的是未来还会很快的扩展到 3M ~ 5M.
另一个因素很大程度上来自于 Softmax , 能否有更低代价的运算, 使注意力矩阵具有低秩结构成为一个探索方向.
其实这也是2020年关于Linear Attention 论文《Transformers are RNNs:Fast Autoregressive Transformers with Linear Attention》[2]出现的原因. 这篇文章从标准注意力:
演进到线性注意力:
并且可以写成因果递推 (RNN 形式):
核心观点:
核特征映射线性化: 将 softmax 注意力中的 替换为可分解核 , 使注意力矩阵具有低秩结构
结合律加速: 利用 改变计算顺序, 先算 (与 无关), 将复杂度从 降至
Transformer-RNN 等价性: 证明因果线性注意力可以写成递推形式 , 本质上是一个隐状态为 矩阵的 RNN
常数内存梯度: 推导出前向/反向传播都可以用累积和在线性时间、常数内存内完成
渣注
其实上面这几点都会让很多人觉得Linear Attention非常的Promising, 的复杂度, 常数的内存消耗, 还避免了Softmax这些相对较慢的运算. 哪一点都非常的吸引人.. 但是哪有这样一本万利的买卖? 故事的发展就是东西越加越多, 越来越重... 其实就像RDMA一样, 一开始很简单的搞个无损, 硬件也简单速度也快...最近几年也是反反复复加了好几年补丁还是搞不定, 为什么没人怀疑一开始就错了呢?
2.2 越来越厚的补丁
正如前面一开始说的, Linear Attention的一些问题导致 必须要加一个 conv 来修复一下, 然后 加了, 也得加, 加完还得整个非线性的SiLU, 这不想省的指数运算又被加回来了一些, 即便如此, 状态仍会累积和碰撞.
然后Linear Attention只能一直往状态矩阵里面输入, 没法让它遗忘一些东西. 于是在 Mamba-2 里面引入 , 这是一个输入相关的记忆寿命, 但遗忘过于粗粒度, 写入仍是相加. 于是出现了 DeltaNet, 即 , 可以沿当前 key 定向改写, 但是缺少快速清空全局旧状态的机制. 于是我们又搞出了Gated DeltaNet , 即 , 此时增加了全局遗忘和定向改写结合的能力, 但是每个 head 只有一个 decay. 接着就出现了KDA, , 引入了每个 key channel 独立 decay, 但是固定状态仍不等于完整 token-addressable memory. 大致整理如下:
image另一方面, 考虑 transition . 它有 个特征值为 , 沿 方向的特征值为如果不约束 , 即使 , 也可能出现导致该方向在递推中被放大或反向过冲.
接着, 继续打补丁. 下面来谈谈为什么 Q/K 要加 L2Norm
Q, K 为什么要加 L2 Norm
Q 不参与状态转移, 所以只看递归的稳定性时, 关键是 K. 但输出和 chunk 内都包含. 如果只归一化 K,
也就是说, query 投影出来的模长没有任何约束, 却直接充当了读取时的放大倍数: query 越长, 这次读出的结果就被整体放大越多. Softmax Attention 不怕这件事, 因为它每一行都要做一次 softmax 归一化, 权重之和恒为 1, query 变长只会让注意力分布更尖锐, 输出始终是 V 的加权平均, 整体尺度不会跟着变大. KDA 缺少这一步归一化, query 的模长会原样乘进结果里: 既放大状态读出, 也放大 chunk 内 token 之间的相似度, 反向传播时梯度的量级也跟着漂移, 训练更难稳定.
同时归一化 Q 和 K 后,
此时 Q/K 主要表达地址方向, 相似度有界.
那么为什么 V不需要?
Q 和 K 表示'从哪里读'和'向哪里写'. 它们的模长会与 和 attention affinity 重复控制强度, 因而应该消除这个自由度. V 表示'写入什么'. Value magnitude 本身可以携带内容强度, 不应强制压到单位球面. 状态读出后还有 head-wise RMSNorm 和 output gate 控制最终尺度.
但这些补丁还没加完, K3 KDA又添加了下界有界衰减和全局Output Gate
虽然使用固定状态矩阵是 KDA 高效的来源, 但也是它的结构性限制. 一个 state 必须压缩任意长历史, 无法像 full attention 一样保留所有 token 的独立地址.
Kimi Linear 和 K3 因此采用 hybrid architecture. K3 的基本 pattern 是
K3 共使用 个 KDA layer 和 个 Gated MLA layer, 并在 backbone 最后再保证一次 global mixing. 两者职责互补:
KDA 以固定状态承担大多数长序列 mixing, 降低 KV cache 容量和历史读取带宽.
MLA 周期性提供 token-addressable global interaction, 修复纯固定状态在精确 retrieval 上的上限.
这样3:1的配比, 实际上KV-Cache的用量也并没有节省太多, 整个模型的93层排布及KVCache开销如下 , 可以看到 MLA 的KVCache用量影响也是非常大的.
image104B 激活参数分布, 总体来看还是稍微偏大的. 我原来的估计大概激活参数在80B左右, 最终开源后比预期的结果多了快20B...
image另一方面为了和KDA配合, MLA也需要再加一个Gated Output.. 很简单的估算了一下, 光是Gated Output大致就多了8B的激活参数, 这样做值得么? 说实话整个系统的复杂度越来越高, 也难怪有这样一张图
image其实Kimi为了走通 Linear Attention这条路, 在K3里面还是花了很多功夫的, 直觉上例如 Gated Output / AttnRes 以及后面的per-head moun等都是在训练稳定性上遇到问题后逐渐打的一些补丁. 但似乎加的太重, 实际上又没拿到 Linear Attention的收益. 倒是内部一堆小算子融合起来复杂度也挺高的. anyway.. 这一节希望单纯的从数学上分析一下这三者的协同.
2.3 重新解读KDA: 代数的视角
首先从代数结构上重新解释KDA是非常有价值的, 那么KDA是什么? 先说答案:
我们可以把KDA公式记为:
则 KDA 更新 构成 仿射收缩半群. 我们后续的分析都会基于这个代数结构的性质展开.
首先我们来看这次改写, 虽然只是一个简单的记号 引入, 但是这个改写的价值在于如下分离:
image这个分离是后文分析的基础:
稳定性问题几乎全部落在 上 (状态会不会爆炸)
表达力问题几乎全部落在 上 (能写进多少东西)
显然, 是一个 rank=1 的矩阵.按列切开就一目了然:全部 个列都是同一个向量 的标量倍
第列第列第列
2.3.1 的特征值
Rank=1 矩阵只有一个非零奇异值, 等于 . 对 直接计算:
又是一个 Rank=1 矩阵, 它唯一的非零特征值是 . 于是 唯一的非零特征值是
开方得唯一的非零奇异值
最后一步用了 L2Norm 保证的 . 这再次说明归一化不是可有可无的修饰, 它让写入幅度只由 和 决定, 与 key 方向无关.
只有一个非零奇异值, 于是得到谱范数 和 Frobenius 范数
谱范数 是分析稳定性的正确工具 (它是算子增益, 满足次乘性 ), 但它一般要解特征值问题才能得到. Frobenius 范数 有逐元素的闭式, 好算. Rank=1 让二者相等, 于是我们可以用好算的 的闭式, 却享受 的算子性质.
2.3.2 关键结构: 列方向完全解耦
注意 从左乘. 对矩阵乘法, 左乘只混合行, 不混合列. 把 按列写开, 记第 列为 , . 取递推式的第 列:
推导: 的第 列是 , 其中 是标量. 于是得到一个重要结论:
KDA 的状态递推是 份彼此独立的 维仿射动力系统, 它们共享同一个转移矩阵 , 只在写入项的标量系数 上不同.
这解释了三件事:
为什么谱分析只需研究 . 128 个列共用一个转移算子, 稳定性是这一个算子的性质.
为什么 不需要归一化. 只出现在写入项的标量系数里, 它影响的是 的幅度, 不影响 的谱. 稳定性对 的依赖是加性的, 不是乘性的. 与之对比, 同时出现在 和 中, 所以它必须被归一化.
为什么 是 维而不是 维. 衰减作用在地址空间的坐标上, 语义是"这个 key 通道的记忆有多长", 而不是"这个 value 分量记多久".
2.3.3 仿射变换
是一个仿射变换, 则有如下三个问题需要处理:
- 不能只研究谱, 必须追踪写入的累积. 纯线性系统 的长期行为由转移积 完全决定, 谱衰减到零则状态衰减到零. 仿射系统的通解分成两部分:
齐次解初值的遗忘写入的累积
谱 (即 的收缩性) 只管第一项, 它决定初始状态多快被忘掉; 第二项是外部输入持续灌入的结果, 谱再小它也不消失.简而言之 一个纯谱分析会漏掉状态的整个稳态部分. 后续我们将详细展开分析.
2: 复合律带一个交叉项, 它是 chunkwise 并行的核心. 两步复合的写入项是 而非简单的 , 前一段的写入 必须先被后一段的转移 作用, 才能与 相加. 这个 交叉项就是"先写入的信息会被后续 token 继续衰减/擦除"的代数表达. 若没有它 (即纯加性线性注意力, ), 复合退化为 , 各段可以无序求和; 正因为有它, KDA 的段间归约必须保序. 一句话: 这个交叉项是 KDA 比纯线性注意力表达力更强, 也更难并行的根源.
3: 不动点非零. 线性系统 的不动点在 时只有平凡解 . 仿射系统 的不动点则是
它的意义是: 反复喂同一个输入, 状态不会衰减到零, 而是收敛到一个由该输入决定的非零"记忆" , 这才是"联想记忆"该有的行为. 纯线性系统会把一切都忘成零, 恰恰不能当记忆用. 写入项 正是让 KDA 成为记忆而非单纯衰减器的那部分.
三个问题指向同一件事:
谱 (来自 ) 管的是"忘得多快",
写入 (来自 ) 管的是"记住什么".
仿射结构把这两者分开, 而线性结构只有前者.换句话说:
稳定性问题几乎全部落在 上 (状态会不会爆炸)
表达力问题几乎全部落在 上 (能写进多少东西)
2.3.4 仿射幺半群: 代数骨架
把每个 token 看成一个仿射映射, 那么"处理一段 token 序列"就是这些映射的复合, 而这个复合运算构成良好的代数结构.
2.3.4.1 仿射变换的复合运算封闭
考虑两个仿射映射
直接计算复合:
结果仍是仿射映射. 所以如果我们用二元组 表示仿射映射, 复合运算的表达式是
封闭性成立. 这是半群的第一个要求.
请特别注意第二个分量里的 : 前一段的写入必须先经过后一段的衰减和擦除, 才能与后一段的写入相加. 这正是"先写入的信息会被后续 token 继续遗忘"的代数表达.
2.3.4.2 结合律的逐步验证
半群的第二个也是唯一实质的要求是结合律. 设三个仿射对 .
先算 . 内层:
再与 复合:
再算 . 内层:
再与 复合:
两式逐项相同. 所以
结合律成立.
结合律的深层来源值得指出: 它继承自矩阵乘法的结合律. 第一分量是纯矩阵乘积, 显然结合; 第二分量的三项 , , 是"从第 段写入出发, 依次经过后续所有段的转移"这一路径求和, 两种加括号方式只是改变求和的分组顺序, 不改变每条路径本身.
2.3.4.3 单位元: 从半群升级为幺半群
取 , 即恒等映射. 对任意 :
双侧单位元存在. 所以严格说这是幺半群 (monoid), 不只是半群. 记为
单位元的语义: 空 token 序列对状态不做任何事. 这是 chunkwise 算法中"空 chunk 是合法 chunk"的代数保证, 边界情况因此不需要特殊分支.
2.3.4.4 为什么不是群: 遗忘的不可逆性
前面已经验证了幺半群的三个条件: 复合封闭, 结合律, 存在单位元. 群比幺半群只多一条要求: 每个元素的逆元也必须落在这个集合里.. 这是最容易被忽略, 但对理解 KDA 语义最关键的一点. 幺半群 可逆当且仅当 可逆, 此时
那么 KDA 的单步 可逆吗? 先确认可逆性. 由行列式公式
每个单步转移矩阵都非奇异, 因此在所有可逆矩阵构成的群 中确实有逆元, 看起来是群? 但实际上并不是. 关键在于可逆元的逆不落在可行族内. 设 , 代入:
其中用了 . 令括号为零:
所以
现在把逆元与可行族 的要求逐项对照:
image因此:
KDA 生成的元素集合在复合下封闭 (子幺半群), 但不在取逆下封闭. 它是幺半群而非群. 且当 时 , 逆元在数值上任意病态; 闭包中 处出现真正的奇异元.
这就是"遗忘不可逆"的代数根源. 不是因为实现丢弃了数据, 而是因为架构只给了模型收缩方向的生成元, 没有给放大方向的生成元. 前向计算可以任意组合遗忘, 但没有任何 token 序列能撤销一次遗忘, 因为撤销需要一个放大型转移, 而模型无法生成这样的转移. 信息一旦被 衰减或被 沿 擦除, 在序列轴上就不可恢复.
2.3.4.5 自由幺半群同态: 工程上先分段算, 再拼起来
前面证明了仿射对满足复合封闭 + 结合律 + 有单位元. 这一节把这套代数结构翻译成一句能直接落地的话.
核心观察. KDA 处理一段 token 序列, 无非是把每个 token 的仿射映射 按顺序复合起来. 而复合满足结合律, 于是把序列切成几段, 每段各自算出"这段对状态的净效果" (一个仿射对), 再把这些仿射对复合起来, 结果和从头到尾一个一个处理完全相同.
这就是 KDA 能并行的全部原因, 一段序列可以浓缩成一个仿射对 , 就像一串数字可以先分组求和再汇总一样.
形式化表述: 设 token 的输入空间为 (即产生 的那些层输入), 是 上的自由幺半群 (所有有限序列, 运算是拼接, 单位元是空串). 定义
把"一段 token 序列"记作 , 空序列记作 . 定义一个映射 , 把序列送到"它对状态做的仿射变换":
三条分别是说: 空序列什么都不做 (恒等); 单个 token 就是它那一步的仿射对; 两段拼接的净效果 = 两段各自净效果的复合 (后处理的 写在左边, 因为它后作用). 第三条就是"分段再拼"的形式, 数学上称 为幺半群同态
工程价值. 正因为可以"分段算再拼", 且拼接顺序无论怎么加括号都一样 (结合律), 才有了FlashKDA和KCP这样的并行策略.
2.3.4.6 非交换性: 结合律不等于可换序
KDA 满足结合律, 但是不满足交换律, 一般地:
原因: 的特征基由 决定 (特征方向 与其正交补), 的特征基是固定的坐标轴. 不同 token 的 方向不同, 因此 与 一般不共享特征基; 与 也不共享特征基 (除非 恰好是坐标向量). 只有衰减因子之间是可交换的:
所以纯衰减线性注意力 (标量或对角遗忘, 无 delta 项) 的转移是交换的, 而 KDA 因为引入了数据依赖的 Rank=1 方向修正而破坏了交换性. 当然这不是坏事, 交换性会让模型对 token 顺序不敏感. KDA 的非交换性正是它编码时序的方式, 也就是说, 精确顺序语义被完整保留. 这正是它能替代显式位置编码的前提.
2.3.5 位置度量内生于转移积
我们进一步展开这个问题, 从 出发, 反复代入:
归纳可得通解:
其中矩阵连乘按下标从大到小从左往右书写, 即 , 空乘积为 . 定义两参数转移算子
则通解简写为
满足: 对任意 ,
把 代入通解, 取 , 再做读出:
于是
这个式子说明 KDA 在数学上也算是一种注意力, 只是核函数不同:
image位置度量内生于转移积 是这里最值得关注的一点: token 到 的可达性完全由中间所有转移矩阵的乘积决定, 而这些矩阵由数据生成. 所以 KDA 提供的是数据依赖的相对位置度量.
这个隐式核能否解释 Gated MLA 为何不需要 RoPE ?
报告怎么说: K3 技术报告 §2.1.2 对所有 MLA 层用 NoPE, 理由是一句分工:
夹在中间的 KDA 层提供位置敏感且感知近因的序列混合, 而 MLA 层提供不受限的全局内容交互.
技术报告 §3.4 进一步说 NoPE "通过 KDA 的循环门控与衰减机制隐式编码位置信息", 于是外推到 1M 无需任何位置编码手术. 这里"隐式编码位置信息"这句话没有展开, 而前面位置度量内生于转移积 恰好是它的数学形式.
位置信息全部装在转移积 里. 取纯衰减近似 , 若某通道的衰减率稳定为 , 则该通道的核因子
只依赖距离 这就是一个不折不扣的相对位置偏置, 且是指数衰减型的. 当衰减率数据依赖时, 同样距离的度量随中间 token 内容而变, 于是升级为数据依赖的相对位置度量. 由 和算子范数的相容性, 立即得到核的指数包络:
这就是报告那句"感知近因的序列混合"的确切含义: KDA 的核天生是一个学出来的, 逐通道多尺度的相对位置核. 核幅度被一个数据依赖的指数衰减包络控制. 注意这个干净的界完全依赖 的 L2 归一化, 否则右侧还要乘上两个无约束的范数.
关键的一步: 这个位置信息如何到达 MLA. 这是核展开本身不能直接给出, 必须补的一环. 前面描述的是 KDA 层自己的输出; MLA 是另一类层. 桥接靠的是残差流:
层把近因性写进门控残差流内容已被烙印时序读取层对含序内容做纯内容注意力
另一个视角是, 由 KDA 的非交换性, 交换任意两个 token 的顺序会改变 KDA 状态, 因此 KDA 的输出携带顺序信息. 这个输出经输出门与 写回残差流后, 下游 MLA 读到的 content 表示已经含序. 于是 MLA 可以只做 这样的纯内容打分 (NoPE), 而其 query/k
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み