AI学习笔记(四):DeepSeekV4的混合注意力机制CSA和HCA是怎样实现的?
当前大模型主要还是针对MOE和注意力层这两部分做优化,提出一些新的想法。先回顾V3版本的MLA/DSA思想。
前言:当前大模型主要还是针对MOE和注意力层这两部分做优化,提出一些新的想法。先回顾V3版本的MLA/DSA思想
一DeepSeekV3版本的MLA(V3)和DSA(V3.2)
1.MLA与DSA的关系
MLA是高效的“地基”:MLA(Multi-head Latent Attention,多头潜在注意力)的核心思路是通过低秩压缩技术,把需要缓存的KV信息压缩到一个更小的低维空间中,以此来降低内存占用。
DSA是聪明的“调度系统”:DSA(DeepSeek Sparse Attention,DeepSeek稀疏注意力)是在MLA这个高效地基上,引入了一个聪明的“筛选系统”。它会快速筛选出每个token最相关的信息,然后只对这些最相关的信息进行计算,从而显著降低计算量
2.DeepSeek MLA(Multi-Head Latent Attention)(KV 低秩降维+QK 拆分 + 部分 RoPE)
核心思想:对 K 和 V 进行低秩分解与压缩,同时对 Q 和K做张量拆分,仅对部分子张量执行 RoPE 位置编码,从而减少 Attention 计算的内存带宽压力和 FLOPs 开销。
2-1具体步骤:KV低秩压缩,Q与低秩压缩的Kr拆分计算
①对输入的h进行低维投影(通过线性层来减少参数计算量)得到c_KV,1000*8192压缩到1000*512+512*8192
例如:c_KV = W_DKV × h (8192 → 512)
[B, 1000, 512]=[8192, 512]×[B, 1000, 8192]
(将高维的 K=8192(维度d)投影到低秩空间r=512(r≪d))
②Q K投影生成为两个q_C/q_R,k_C/k_R
③ 取q_R和k_R来做RoPE位置编码 ,得到RoPE(q_R) /RoPE(k_R)
④将两个q拼接成Q_final,两个k拼接成K_final
⑤Q与K做attention
目的:在几乎不损失精度的前提下,大幅提升训练和推理的吞吐量
2-2流程图:
h : [B, 1000, 8192]
│
├─► ①Q 的生成:
│ - c_Q = W_DQ * h → [B, 1000, 1536] (压缩表示)
│ - q_C = W_UQ * c_Q → [B, 1000, 128] (内容部分恢复)
│ - q_R = W_QR * h → [B, 1000, 64] (位置部分,未经压缩)
│ - Q_final = [q_C; RoPE(q_R)] → [B, 1000, 192]
│
├─► ②K 的生成(缓存关键):
│ - c_KV = W_DKV * h → [B, 1000, 512] ★ 压缩比 8192→512
│ - k_C = W_UK * c_KV → [B, 1000, 128] (内容部分恢复)
│ - k_R = W_KR * h → [B, 1000, 64] (位置部分,未经压缩)
│ - K_final = [k_C; RoPE(k_R)] → [B, 1000, 192]
│
其中这三个矩阵都是 可训练的参数,在模型初始化时随机生成(如采用正态分布或 Xavier 初始化),然后在训练过程中通过反向传播不断更新,使得压缩 / 解压过程能最大程度保留对注意力有用的信息。
W_DKV(压缩投影矩阵):形状为 [512, 8192]
W_UK(内容上投影矩阵):形状为 [128, 512]
W_KR( 位置投影矩阵):形状为 [64, 8192]
└─► ③V 的生成:
│-直接复用 c_KV
│- V_final = W_UV * c_KV → [B, 1000, 128]
注:推理时 KV 缓存只存 c_KV(512维)和 k_R(64维),每个 token 仅 576 维。
2-3思考:为什么不直接对c_KV或者k_C加 RoPE?
回答:RoPE 的旋转操作会使“把解压矩阵W_UK吸收进 Query 投影”这一加速技巧无法执行,从而让 MLA 在推理时不得不现场解压并旋转完整的 Key 向量,损失计算效率。因此 MLA 把无需旋转的语义内容(走吸收路线)和需要旋转的位置信息(走独立低维路线)分离开,既保住了吸收加速,又极低成本地注入了位置感知。
①“把解压矩阵W_UK吸收进 Query 投影”怎么理解?

②“不得不现场解压并旋转完整的 Key 向量”怎么理解?

3.DeepSeek DSA
核心思想:在高效的多头潜在注意力(MLA)机制基础上,引入一个轻量级的闪电索引器(Lightning Indexer),为每个查询(Query)从所有历史Token中动态筛选出相关性最高的少部分Token。随后,利用MLA组件仅对这些被选中的Token执行完整的、高维度的注意力计算,从而将原始平方级复杂度的注意力计算(O(L²))降低至近似线性复杂度(O(Lk))。
具体步骤:基于压缩后的低维Key(即c_KV),闪电索引器快速计算Query与所有Token的初步相关性,筛出K个Token,做后续的MLA
① 向量投影与动态权重生成 (Query & Key Projection):输入状态投影为查询(Query)、键(Key)和值(Value)向量。在此过程中,DSA不仅会融入旋转位置编码,还会为每个注意力头额外生成一组动态权重,用于后续自适应地调整各头的注意力得分。
② 索引器快速评分 (Lightning Indexer Scoring):闪电索引器(Lightning Indexer)凭借其小维度的键向量,计算查询与所有键的初步注意力得分,并乘上之前生成的逐头权重(per-head weights)。
③ 精准Top-k选择 (Top-k Selection):在获得所有位置的初步评分后,索引器为每个查询,从整个上下文中精准定位出得分最高的 k 个Token(例如k=2048)。
④ 执行稀疏MLA (Sparse MLA):在这些筛选出来的Token计算MLA。
总结:MLA与DSA完整步骤:本质上V3是在全序列上用MLA的低秩表示做DSA筛选,再对选出的子集做完整的MLA注意力。
二DeepSeekV4版本的HCA与CSA:DeepSeekV4的混合注意力机制 (Hybrid Attention Architecture)主要核心思想是HCA (Heavily Compressed Attention)和CSA (Compressed Sparse Attention),CSA/HCA架构是DSA思想在模型规模和上下文长度上的飞跃性应用。
1.HCA与CSA的关系:
①一个Token进入V4后,会经过多层Transformer
├── 某些层使用 CSA 机制处理
├── 某些层使用 HCA 机制处理
└── 两种层的输出维度完全一致,可无缝交替堆叠
②V4的Transformer层堆叠方式
第1层: CSA (精细语义提取)
第2层: CSA
第3层: HCA (全局语义压缩整合)
第4层: CSA
第5层: HCA
...
第N层: HCA
-低层多用CSA:此时特征还比较底层,需要精细捕捉长距离依赖,用4:1保守压缩+稀疏筛选更安全。
-高层多用HCA:特征已经比较抽象高级,可以承受128:1的激进压缩,用于全局语义整合和存储优化。
-关键设计约束:每一层的输出维度都是与输入完全一致。所以无论上一层是CSA还是HCA,下一层都可以无缝切换成另一种。
2.HCA (Heavily Compressed Attention):极致压缩,存得更省
核心思想:HCA继承了DeepSeek的MLA (Multi-head Latent Attention,多头潜在注意力) 技术,它会将需要记忆的高维信息向量,映射到一个低维的“潜在空间”中存储。当需要用到这些历史信息时,再从低维状态解压还原。这就像一个高效的文件压缩软件,能在不丢失核心信息的前提下,极大地节省存储空间。此外,V4革命性地引入了FP4+FP8混合精度(专家网络参数用FP4,其余用FP8),使得KV Cache的显存占用又被砍掉了一半。
具体步骤:先生成低秩KV,再极度压缩合并,但不丢弃,最后用Query跟这8个浓缩块做完整计算。
①先生成低秩Kr, Vr [B,1000,8192]→Kr, Vr 各 [B,1000,低维度]
②每128个连续Token合并为一个entry [B,1000,低维度]→[B,8,低维度] 极度压缩
③压缩后的entry以FP4精度存入KV Cache [B,8,低维度]存储占用≈传统2%
④Query保持原始长度(1000个),不做合并 [B,1000,8192]
⑤Query与这8个entry做全对全稠密注意力 Q:[B,1000,...] K/V:[B,8,...]→[B,1000,8192]
补充过程:
原始: Q [1000, 8192], K [1000, 8192], V [1000, 8192]
↓ 低秩投影
低秩: Q_low [1000, d], K_low [1000, d], V_low [1000, d] (d=512)
↓ 沿长度压缩 (每128个合并)
压缩后: K_comp [8, d], V_comp [8, d]
↓ 注意力计算 (Q_low 与 K_comp 点积)
attn_scores = softmax( Q_low @ K_comp^T ) → [1000, 8]
out_low = attn_scores @ V_comp → [1000, d]
↓ 升维恢复
out = up_proj(out_low) → [1000, 8192]
3.CSA (Compressed Sparse Attention):智能精简,算得更少
核心思想:CSA引入了一个轻量级“索引器”(Indexer)。当处理一个句子时,索引器先对所有信息做一次快速粗筛,预估内容间的相关性。随后,它会精选出最相关的一小部分信息(top-k)进行正式的、高精度的注意力计算,而将大部分无关内容直接丢弃。
具体步骤:先把Token合并成块,索引器打分丢掉不相关的块,只对留下的做MLA+注意力。
①线性映射生成初始KV + 压缩权重 [B,1000,8192]→ [B,1000,512]
②每4个连续Token加权合并 [B,1000,512]→[B,250,512]
③索引器对250个压缩块打分 [B,250,512]→[B,250,1]
④Top-K选择,只保留128个 [B,250,512]→[B,128,512] 丢弃了122个
⑤对这128个做MLA(低秩投影→拆分→部分RoPE) [B,128,512]→K', V' 低秩版
⑥Query(保持原始1000长度)与这128个K'做注意力 Q:[B,1000,...] K':[B,128,...]→输出 [B,1000,8192]
补充过程:
原始: Q [1000, 8192], K [1000, 8192], V [1000, 8192]
↓ 线性映射 + 低秩投影(生成初始 KV 和压缩权重)
低秩: K_low [1000, d], V_low [1000, d] (d=512)
↓ 每4个连续Token加权合并(沿长度维度压缩)
压缩块: K_blocks [250, d], V_blocks [250, d] (250 = 1000/4)
↓ 索引器打分(轻量级线性层,每个块输出一个标量分数)
scores [250, 1]
↓ Top-K选择(保留分数最高的128个块,丢弃其余122个)
selected_K [128, d], selected_V [128, d]
↓ 对选中的128个块做MLA(低秩投影→拆分→部分RoPE)
MLA 压缩: K'_low [128, c], V'_low [128, c] (c 为 MLA 潜在维度,例如 c=128)
↓ Query 也降维到相同低维空间(保持原始长度)
Q_proj [1000, c] (由原始 Q 经过低秩投影得到)
↓ 注意力计算(Q_proj 与 K'_low 点积)
attn_scores = softmax( Q_proj @ K'_low^T ) → [1000, 128]
out_low = attn_scores @ V'_low → [1000, c]
↓ 升维恢复(上投影回原始维度)
out = up_proj(out_low) → [1000, 8192]
总结:最终CSA与HCA的协同效应带来了惊人的实际收益:相比前代V3.2,在 100万Token上下文 的设置下,V4-Pro的单token推理计算量 (FLOPs) 仅为前者的27%,同时KV Cache占用也骤降至10%。
哲学视角
“压缩不是丢失,而是为了在无限序列中,用最轻的足迹抓住最真的关联。”
—— 从 MLA 的低秩降维到 DSA 的稀疏筛选,再到 V4 中 HCA 的激进合并与 CSA 的块级索引,这一层层递进的注意力设计,正是对“有限资源如何逼近无限上下文”这一工程哲学的精妙回答:用低维承载高维,用筛选取代遍历,在不完美的记忆中重塑近乎完美的连贯。
更多推荐



所有评论(0)