模型架构(Model Architecture)

本分类包含两类内容:

  • 横向对比:从 config.json + 官方实现源码推导结构,把几个"只有模型卡、 没有论文"的模型放在一起比(Spark-X2.5 / Qwen3.5 / Gemma4);

为什么以 config + 源码为准

Spark-X2.5、Qwen3.5、Gemma4 都没有公开发表技术报告(截至 2026-10), 能核实的架构事实只有两类来源:

  1. Hugging Face 模型卡里的 config.json——超参、layer_types、RoPE 参数;
  2. 随权重发布(或框架内)的 modeling_*.py / configuration_*.py——前向逻辑。

所以本分类的写法是:由配置字段 + 源码行号推导结构,而不是转述论文口径。 凡是只出现在模型卡 / 官方博客里的数字(参数量、benchmark),都单独标注来源, 并注明是官方自测而非第三方复现。

收录条目

模型 规模 上下文 模态 页面
Spark-X2.5 4B / 1.7B 1M 纯文本 架构详解
Qwen3.5 4B(2B / 9B 同构) 256K 文本 + 图像 + 视频 架构详解
Gemma4 12B(E4B / E2B 为 MoE) 256K 文本 + 图像 + 音频 架构详解

每个模型页都有一张逐层架构图(色块区分 attention 类型,实线框表示模块, 嵌套虚线框与 ×n 表示层组的重复范围和次数),三张图取同一套画法,便于对照:

模型页 逐层架构图
Spark-X2.5-4B assets/spark-x2.5-4b-architecture.svg
Qwen3.5-4B assets/qwen3.5-4b-architecture.svg
Gemma4-12B assets/gemma4-12b-architecture.svg

横向对比:Spark-X2.5 / Qwen3.5 / Gemma4

三者共用同一个骨架——少数全注意力层 + 多数廉价层的混合(hybrid)结构—— 差别在三点:廉价层用什么、按什么比例混、全注意力层本身再怎么省。 下表以 Spark-X2.5-4B [1] 的配置为主(1.7B [2] 与它同构,只是层数与 hidden 更小)。

维度 Spark-X2.5-4B [1] Qwen3.5-4B [3] Gemma4-12B [4]
层数 / hidden 36 / 2560 32 / 2560 48 / 3840
廉价层机制 SWA,窗口 512 GDN 线性注意力(卷积核 4) SWA,窗口 1024
层型配比(廉价 : 全) 3 : 1 3 : 1 5 : 1
全注意力层数 9 / 36 8 / 32 8 / 48
全注意力 KV 头 / head_dim 4 / 256 4 / 256 1(K≡V 共用投影)/ 512
MLP 激活 GELU(门控,即 GeGLU) SiLU(门控,即 SwiGLU) gelu_pytorch_tanh
注意力输出门控 逐头 sigmoid 门控 逐头门控(q_proj 双倍输出) 无
QK-Norm 无 有(q / k,作用在 head_dim) 有(q / k,另加无参数 v_norm)
位置编码 分层:全层 θ=5e6 + 部分旋转 0.25;滑窗层 θ=1e4 + 全旋转 mRoPE,θ=1e7 + 部分旋转 0.25 分层:全层 θ=1e6(proportional)+ 部分旋转 0.25;滑窗层 θ=1e4
词表 131072 248320 262144
权重共享 tied(embedding ≡ LM head) tied(4B) tied
上下文 1,048,576 262,144 262,144
模态 纯文本 文本 + 图像 + 视频 文本 + 图像 + 音频
附带模块 融合 QKV 单投影 1 层 MTP(推理时忽略) 输出 logit softcap 30

1. 廉价层:滑窗注意力 vs 线性递归

两种"便宜"的路线本质不同:

  • SWA(Spark-X2.5 / Gemma4) 仍然是注意力,只是把每个 token 的可见范围截到 固定窗口(512 / 1024)。因此它的 KV cache 有上界但不为零,且每步仍要做 一次窗口内 attention。它省的是"看得少"。
  • GDN(Qwen3.5) 是带门控的 Delta 规则线性注意力:每层维护一个 [num_v_heads, k_head_dim, v_head_dim] 的递归状态矩阵,逐 token 递推更新 (Qwen3_5GatedDeltaNet [5])。它的"cache"大小与序列长度完全无关, 代价是容量受状态维度限制(多条 key-value 会相互碰撞,见 Gated Delta Network)。它省的是 "记在固定矩阵里"。

一句话:SWA 买的是局部保真,GDN 买的是常数显存。

2. 混合比例:3 : 1 与 5 : 1

Spark-X2.5 与 Qwen3.5 都是每 4 层放 1 层全注意力(全注意力占 25%); Gemma4 是每 6 层放 1 层(约占 17%)。Gemma4 的比例沿用 Gemma3 的 sliding_window_pattern = 6 默认值 [6]——这是 Gemma 系列的一贯选择, 比前两者更"敢"把长程依赖压给少量全注意力层。

3. 全注意力层本身的三种省法

比例之外,三者对剩下的全注意力层还做了不同程度的削:

  • Spark-X2.5:减层数。全注意力层只占 1/4,但层内是完整 GQA (4 个 KV 头 × 256 维),不做额外压缩。
  • Qwen3.5:减层数 + 线性化。全注意力层同样只占 1/4,长程开销主要靠 占 3/4 的线性层摊薄;全注意力层自身带 q/k RMSNorm 与逐头输出门控 [5]。
  • Gemma4:减层数 + 减头数。全注意力层只占 1/6,且层内把 KV 头压到 1 个 (num_global_key_value_heads = 1 [8]),并让 K 与 V 共用同一个投影 (attention_k_eq_v 触发 use_alternative_attention,全注意力层干脆不建 v_proj [7]),head_dim 反而放大到 512。

三条路线的 KV 削减方向可以概括为:减层数 / 减层数 + 线性化 / 减层数 + 减头数。

4. 模态与上下文

  • 模态:只有 Spark-X2.5 是纯文本模型(4B [1] 与 1.7B [2] 同构,只是层数与 hidden 不同)。Qwen3.5 带一个 ViT (depth 24、patch 16),通过 image_token_id / video_token_id 接入; Gemma4 是 text + vision + audio 的 unified 模型(audio 嵌入 640 维、 每 token 640 采样点)。这也意味着 Qwen3.5 / Gemma4 的"4B / 12B"里 含视觉/音频塔的参数,而 Spark-X2.5 的参数全是语言部分。
  • 上下文:Spark-X2.5 原生 1M,另两者 256K。但 1M 的 KV 依然很大—— bf16 下 Spark-X2.5-4B 全注意力层在 1M token 就约 37 GB (估算过程见 Spark-X2.5 详情页), 官方 SGLang 启动示例也把 --context-length 1048576 标注为"需要充足显存"。
⚠️ 口径提醒:三家 benchmark 均为官方自测,无独立复现;

本页只比较结构,不比较能力。另外 Gemma4-12B 是稠密模型 (enable_moe_block = false),Gemma4 家族里的 E4B / E2B 才是 MoE 变体。

参考文献

[1] XHToken. Spark-X2.5-4B model card[EB/OL]. (2026-09-01)[2026-10-11]. https://huggingface.co/XHToken/Spark-X2.5-4B/tree/0bcb35678590218655dff3765b9e61c83b35e9c4.

[2] XHToken. Spark-X2.5-1.7B model card[EB/OL]. (2026-09-01)[2026-10-11]. https://huggingface.co/XHToken/Spark-X2.5-1.7B/tree/14d6e83c13c7add2b62a7c39b2131f4ed1cddcf8.

[3] Alibaba Qwen Team. Qwen3.5-4B model card[EB/OL]. (2026)[2026-10-11]. https://huggingface.co/Qwen/Qwen3.5-4B/tree/851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a.

[4] Google DeepMind. Gemma 4 12B IT model card[EB/OL]. (2026)[2026-10-11]. https://huggingface.co/google/gemma-4-12B-it/tree/707f0a3b8a3c7ad586ed01e27eafbad8a27dd0f7.

[5] Hugging Face. transformers: modeling_qwen3_5.py[EB/OL]. (2026)[2026-10-11]. https://github.com/huggingface/transformers/blob/536ecc007387a50e77603bb5d92100e9b07514cc/src/transformers/models/qwen3_5/modeling_qwen3_5.py#L490.

[6] Hugging Face. transformers: configuration_gemma3.py[EB/OL]. (2026)[2026-10-11]. https://github.com/huggingface/transformers/blob/536ecc007387a50e77603bb5d92100e9b07514cc/src/transformers/models/gemma3/configuration_gemma3.py#L106-L111.

[7] Hugging Face. transformers: modeling_gemma4.py[EB/OL]. (2026)[2026-10-11]. https://github.com/huggingface/transformers/blob/536ecc007387a50e77603bb5d92100e9b07514cc/src/transformers/models/gemma4/modeling_gemma4.py#L1151-L1244.

[8] Hugging Face. transformers: configuration_gemma4.py[EB/OL]. (2026)[2026-10-11]. https://github.com/huggingface/transformers/blob/536ecc007387a50e77603bb5d92100e9b07514cc/src/transformers/models/gemma4/configuration_gemma4.py#L210-L223.


© 2026 Yang Huan · yanghuan9812@qq.com

results matching ""

    No results matching ""