DeepSeek-V4 模型结构(1):序列维度(上),从 MLA 到压缩 KV

DeepSeek-V4 模型结构(1):序列维度(上),从 MLA 到压缩 KV

💡 原文中文,约11400字,阅读约需28分钟。
📝

内容提要

本文介绍DeepSeek-V4的注意力机制,从MHA到CSA/HCA的演进,重点分析压缩KV缓存的方法。V4将每4或128个token压缩为一条512维KV向量,采用重叠窗口和逐通道softmax加权,K与V共享单头,配合分组输出投影降低参数。相比前代,V4首次压缩缓存条目数,以支持1M上下文的高效推理。

🔎

延伸解读

压缩算子的设计动机

V4 的压缩算子并非简单平均池化,而是通过逐通道 softmax 加权和可学习的位置偏置,让每个 token 对压缩条目的贡献由内容决定。这种设计保留了块内 token 的相对重要性,并引入位置先验,弥补了平均池化丢失信息的缺陷。

重叠窗口的边界处理

CSA 采用重叠窗口,每个 token 参与两个相邻条目,使条目感受野从 4 个 token 扩展到 8 个,缓解了硬切块带来的边界效应。HCA 因压缩率高达 128,无需重叠。实现上,重叠仅在 m=4 时启用,与论文一致。

分组输出投影的权衡

为降低 128 头 × 512 维输出投影的巨额参数,V4 将头分为 16 组,每组独立降维后再拼接投影。这相当于分组低秩分解,参数从 470M 降至约 184M,但跨组信息混合仅发生在最终投影中,可能限制组间交互。

Q&A

DeepSeek-V4 的 CSA 和 HCA 在 KV 缓存压缩上有什么区别?

CSA(压缩稀疏注意力)将每 4 个 token 压缩成一个 KV 条目,并使用 indexer 选择 top-1024 个条目,同时保留 128 个滑窗条目;HCA(重度压缩注意力)将每 128 个 token 压缩成一个条目,且不进行稀疏选择,而是查看所有条目。

DeepSeek-V4 的 KV 缓存压缩是如何实现的?

V4 将连续的 m 个 token 的 KV 向量压缩成一条 512 维的向量。压缩算子首先对每个 token 计算与 KV 同维的权重向量,然后进行逐通道 softmax 加权求和,并加入可学习的位置偏置。对于 CSA(m=4),采用重叠窗口,每个 token 参与两个条目,以缓解边界效应。压缩后的条目经过 RMSNorm,并添加 RoPE 位置编码。

DeepSeek-V4 中为什么 K 和 V 可以共享同一个向量?

V4 的 KV 只有一条 512 维向量,同时作为 K 和 V。这源于 MLA 的 MQA 模式:推理时 latent 同时充当所有头的 K 和 V,展开矩阵被吸收进 query 和输出投影。V4 将这一做法固化为训练结构,去掉了 K/V 展开矩阵,让 KV 向量直接与 query 头内积,并由 query 上投影和分组输出投影分别学习每个头的“K 展开”和“V 展开”。

DeepSeek-V4 的分组输出投影是如何降低参数量的?

V4 将 128 个注意力头分成 16 组,每组 8 个头(共 4096 维),每组独立投影到 1024 维,拼接后得到 16384 维,再通过一个矩阵投影到 7168 维。这样参数从 470M 降至约 184M(67M + 117M),大幅减少了计算量。

DeepSeek-V4 的注意力机制相比前代(如 MLA、DSA)主要改进了什么?

V4 首次在 KV 缓存上压缩条目数:将每 m 个 token 的 KV 压缩成一条,使缓存和注意力的条目数同时除以 m。相比 MLA 只压缩维度、DSA 只减少查看的 token 数,V4 直接减少了存储的条目数,从而支持 1M 上下文的高效推理。

DeepSeek-V4 中 CSA 的重叠压缩是如何工作的?

CSA 的 m=4,每个 token 参与两个条目:每个 token 计算两套 KV 和权重(a 系列和 b 系列),条目 i 由块 i 的 b 系列和块 i-1 的 a 系列共 8 个槽做一次逐通道 softmax,然后加权求和。这样每个条目的感受野变为 8 个 token,窗口宽 8、步长 4,缓解了硬切块的边界效应。

DeepSeek-V4 的压缩算子在实现上有哪些细节?

实现细节包括:压缩在 FP32 下计算以保证精度;decode 时每层维护 kv_state 和 score_state 缓冲,凑满 m 个 token 才输出一个条目;重叠只在 m=4 时启用;序列长度不是 m 的倍数时,剩余 token 不单独成条目(训练时直接丢弃);indexer 有自己独立的压缩器,头维 128,并做 Hadamard 旋转和 FP4 量化。

🏷️

标签

➡️

继续阅读