模型: Qwen3.5-9B
机构: 阿里巴巴 / 通义实验室
Gated DeltaNet 论文: Gated Delta Networks: Improving Mamba2 with Delta Rule (ICLR 2025) | arXiv:2412.06464

一句话总结: Qwen3.5 用 3 层 Gated DeltaNet(线性注意力)+ 1 层 Full Attention 的混合架构,在保持模型质量的前提下大幅压缩 KV cache 和推理开销,并内置 MTP module 支持投机解码。

一、Qwen3.5-9B 参数概览

以 Qwen3.5-9B 为例,核心配置如下:

参数
总层数 32
隐藏维度 4096
FFN 中间维度 12288
词表大小 248,320
最大上下文 262,144(原生),1,010,000(YaRN 扩展)
MTP module 1 层
架构布局 8 × (3 × Gated DeltaNet + 1 × Full Attention)

32 层里有 24 层是 Gated DeltaNet(线性注意力),只有 8 层是标准的 Full Attention——3/4 的层不需要维护随序列增长的 KV cache。


二、宏观架构:3+1 混合设计

Qwen3.5 的 32 层按固定模式排列:每 4 层为一个 block,前 3 层是 Gated DeltaNet,第 4 层是 Full Attention。

1
2
3
4
5
6
7
8
9
10
11
Block 0:  [GDN] [GDN] [GDN] [FullAttn]    Layer  0- 3
Block 1: [GDN] [GDN] [GDN] [FullAttn] Layer 4- 7
Block 2: [GDN] [GDN] [GDN] [FullAttn] Layer 8-11
Block 3: [GDN] [GDN] [GDN] [FullAttn] Layer 12-15
Block 4: [GDN] [GDN] [GDN] [FullAttn] Layer 16-19
Block 5: [GDN] [GDN] [GDN] [FullAttn] Layer 20-23
Block 6: [GDN] [GDN] [GDN] [FullAttn] Layer 24-27
Block 7: [GDN] [GDN] [GDN] [FullAttn] Layer 28-31

GDN = Gated DeltaNet(线性注意力,固定状态,O(1) 推理)
FullAttn = 标准注意力(KV cache,精确检索)

为什么用混合而不是纯用一种?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
纯 Full Attention:
✓ 质量最好,精确检索
✗ KV cache 随序列线性增长,262K 上下文时显存爆炸
✗ 每个 token 要和所有历史做 attention,推理慢

纯 Linear Attention:
✓ 固定状态大小,O(1) 推理
✗ 状态是压缩的,检索精度不足
✗ 长序列信息丢失严重

混合 3:1:
✓ 大部分层用 GDN 省开销
✓ 每 4 层插一层 Full Attention 补回精确检索能力
✓ 兼顾效率和质量

三、Full Attention 层

Qwen3.5 的 Full Attention 层使用 Grouped-Query Attention (GQA) + Partial RoPE + 输出门控:

参数
Q heads 16
KV heads 4(GQA 4:1)
head_dim 256
位置编码 Partial RoPE(25% 维度)
输出门控 attn_output_gate = true

GQA:4 个 Q head 共享 1 个 KV head

16 个 Q head,只需要 4 个 KV head。KV cache 的显存直接省 4 倍。

Partial RoPE:只编码 25% 的维度

head_dim=256,但只有 64 个维度(25%)做旋转位置编码。其余 192 个维度不带位置信息,专注于内容语义。

1
2
3
head_dim = 256
├─ 前 64 维:RoPE 位置编码 → 感知 token 之间的相对距离
└─ 后 192 维:无位置编码 → 纯语义匹配

这样做的好处是:位置信息和语义信息解耦,模型在做长距离检索时不会被位置编码干扰。

M-RoPE:多模态位置编码

Qwen3.5 是原生多模态模型,RoPE 的 64 个位置维度进一步拆成三段:

1
2
3
4
5
6
mrope_section = [11, 11, 10]
├─ 11 对频率 → 空间 H(图像/视频的高度方向)
├─ 11 对频率 → 空间 W(图像/视频的宽度方向)
└─ 10 对频率 → 时间 T(视频帧序 / 文本序列位置)

总计:(11 + 11 + 10) × 2 = 64 维

文本输入时三段使用同一个位置索引;图像输入时 H 和 W 段使用 2D 空间位置;视频输入时三段分别编码高度、宽度和帧号。


四、Gated DeltaNet:核心创新

Gated DeltaNet 是 Qwen3.5 中 24 层线性注意力的核心。要理解它,先从标准 linear attention 一步步演进。

4.1 标准 Linear Attention

去掉 softmax 后,attention 可以写成 RNN 形式——维护一个状态矩阵 ,每步累加更新:

是一个 的矩阵,相当于一个关联记忆: 是地址, 是内容, 是查询。

问题是:只能加,不能删。旧的 KV 对永远留在状态里,信息越积越多,最终互相干扰(”记忆碰撞”)。

4.2 Mamba2:加入衰减门控

Mamba2 引入一个衰减因子 ,每步把旧状态整体缩小:

接近 0 时快速清空记忆,接近 1 时保留历史。

问题是:衰减是全局的。如果想忘掉某个特定的 KV 对,必须把所有记忆一起衰减——“为了忘掉一个人,忘掉了整个世界”。

4.3 DeltaNet:精准替换

DeltaNet 走了另一条路——不做全局衰减,而是用 delta rule 精准修改特定的 KV 关联:

是写入强度。这个公式做了两件事:

1
2
3
4
1. S_{t-1} (I - β_t k_t k_t^T):先把 k_t 对应的旧 value 擦除
2. + β_t v_t k_t^T: 再写入新的 value

类比数据库:先 DELETE WHERE key = k_t,再 INSERT (k_t, v_t)

问题是:只能改,不能批量清。当上下文切换时(比如从一段话跳到另一段话),需要快速清空所有旧记忆,但 delta rule 只能一个一个替换。

4.4 Gated DeltaNet:两者结合

Gated DeltaNet 把衰减门控和 delta rule 合并成一个公式:

1
2
3
α_t → 控制全局衰减(Mamba2 的能力):需要清空记忆时 α_t → 0
β_t → 控制精准替换(DeltaNet 的能力):需要更新特定 KV 时 β_t → 1
两者互补,一个管"批量遗忘",一个管"精准修改"

论文在 Needle-in-a-Haystack 测试中验证了这种互补性:

能力 Mamba2 DeltaNet Gated DeltaNet
长期记忆保持 差(衰减太快)
信息过滤(去噪) 差(无法清空)
复杂模式记忆

4.5 Qwen3.5 中的具体配置

参数 含义
linear_num_key_heads 16 Key head 数量
linear_num_value_heads 32 Value head 数量(比 Key 多一倍)
linear_key_head_dim 128 每个 Key head 的维度
linear_value_head_dim 128 每个 Value head 的维度
linear_conv_kernel_dim 4 短卷积核大小

几个值得注意的设计选择:

Value head 比 Key head 多一倍。 状态矩阵 ,Key 是检索地址,Value 是存储内容。Key head 少意味着检索空间更紧凑(靠 delta rule 的精准替换保证检索精度),Value head 多意味着输出表示更丰富。

短卷积(kernel=4)。 在 Q, K 投影之后加一个长度为 4 的因果卷积,捕获局部 n-gram 模式。Linear attention 擅长全局记忆但弱于局部模式,短卷积正好补上这个短板。


五、推理时的状态开销对比

32 层中两种层的推理开销差异很大:

1
2
3
4
5
6
7
8
Full Attention(8 层):
KV cache = 8 × 2 × 4(KV heads) × 256(head_dim) × seq_len × 2(bytes)
= 32,768 × seq_len bytes
262K 上下文时 ≈ 8 GB

Gated DeltaNet(24 层):
状态矩阵 = 24 × 16(K heads) × 128(K dim) × 128(V dim) × 2(bytes)
= 12.6 MB(固定,不随序列增长)

GDN 层的状态开销是固定的 ~13 MB,不管上下文是 1K 还是 262K。而 8 层 Full Attention 的 KV cache 会随序列线性增长。混合架构的设计意图就是:用 3/4 的层做固定开销推理,只让 1/4 的层承担 KV cache 的增长


六、MTP Module:内置投机解码

Qwen3.5 内置了 1 个 Multi-Token Prediction module(mtp\_num\_hidden\_layers: 1),可直接用于投机解码加速推理。

1
2
mtp_num_hidden_layers: 1        → 1 个 MTP module
mtp_use_dedicated_embeddings: false → 与主模型共享 embedding

串行设计意味着这个 module 可以自回归循环复用——和 EAGLE 的 Autoregression Head 本质相同,支持树形草稿展开和动态剪枝。

主流推理框架已经支持 Qwen3.5 的 MTP 投机解码:

1
2
3
4
5
6
7
8
# SGLang
python -m sglang.launch_server --model-path Qwen/Qwen3.5-9B \
--speculative-algo NEXTN --speculative-num-steps 3 \
--speculative-eagle-topk 1 --speculative-num-draft-tokens 4

# vLLM
vllm serve Qwen/Qwen3.5-9B \
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":2}'

需要注意的是,Gated DeltaNet 层在树形验证时不能直接用 tree attention mask——因为线性注意力的 RNN 状态是累加的,不支持 mask 隔离分支。需要在分支点 fork 状态矩阵,每个分支独立演化。详细讨论参见投机解码系列。


七、位置编码与长上下文

RoPE 配置

1
2
3
rope_theta:            10,000,000(10M,比 LLaMA 的 10K 大 1000 倍)
partial_rotary_factor: 0.25(只有 25% 的维度做 RoPE)
max_position_embeddings: 262,144(256K 原生上下文)

rope\_theta 越大,RoPE 的频率越低,位置编码的”衰减”越慢——模型在更远的距离上仍能感知位置差异。10M 的 theta 配合 256K 上下文是标准配置。

YaRN 扩展到 1M+

通过 YaRN(Yet another RoPE extensioN)可以将上下文从 262K 扩展到 1,010,000:

1
2
3
4
5
{
"rope_type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 262144
}

factor=4.0 意味着把位置编码的有效范围拉伸 4 倍:262K × 4 ≈ 1M。


八、Vision Encoder

Qwen3.5 是原生多模态模型,Vision Encoder 的结构:

参数
架构 ViT
层数 27
隐藏维度 1152
注意力头数 16
Patch 大小 16 × 16
空间合并 2 × 2(4 倍压缩)
输出维度 4096(对齐文本隐藏维度)

视觉 token 经过 ViT 编码后,通过 spatial\_merge\_size=2 的 2×2 合并,将视觉 token 数量压缩到 1/4,再投影到 4096 维与文本 token 对齐后送入主干网络。


九、总结

Qwen3.5 的架构设计围绕一个核心取舍展开:用 Gated DeltaNet 的固定状态换取推理效率,用穿插的 Full Attention 层补回精确检索能力

1
2
3
4
5
6
7
8
9
10
11
12
13
核心架构选择:
├─ 3/4 的层用 Gated DeltaNet
│ ├─ 固定状态(~13 MB),不随序列增长
│ ├─ 门控(α)+ Delta Rule(β)= 批量遗忘 + 精准修改
│ └─ 短卷积补局部模式
├─ 1/4 的层用 Full Attention
│ ├─ GQA 4:1 压缩 KV cache
│ ├─ Partial RoPE 解耦位置与语义
│ └─ M-RoPE 支持多模态
├─ 1 个 MTP module
│ └─ 串行设计,支持投机解码的树形展开
└─ ViT Vision Encoder
└─ 4 倍压缩视觉 token,原生多模态

这套设计在端侧推理场景下尤其有价值:固定状态的 GDN 层不吃 KV cache 显存,Full Attention 层通过 GQA 进一步压缩,加上内置的 MTP module 支持投机解码——是目前对端侧部署最友好的大模型架构之一。