摘要 :本文基于 Qwen3 Technical Report(arXiv:2505.09388),按数据流自洽展开 :§2 给出 整体架构总览 (Decoder-only 数据流、单 Block 示意,便于与社区导读对照);继而从 Tokenizer、Embedding、绑权 写到 单层 Decoder 内的 RMSNorm、GQA、RoPE、QK-Norm、因果注意力、SwiGLU FFN、输出层 ,并说明 长上下文(三阶段预训练、RoPE 基频 ABF、YARN、DCA) 、MoE(128 路由专家、top-8、无共享专家) 与 思考 / 非思考模式 。文中在相应位置直接写出 Qwen 1、Qwen 2、Qwen 3 的差异对照,读者无需依赖系列其它篇即可读懂骨干;文末仍给出同系列链接便于延伸阅读。
关键词:Qwen3;QK-Norm;GQA;RoPE;RMSNorm;YARN;DCA;MoE;思考模式;大语言模型
同系列博文(延伸阅读):
💡 理解要点 :可以把 Qwen3 想成:仍是 Decoder-only (只有「因果自注意力 + 前馈」,没有 Encoder),整体仍是 Pre-Norm + RMSNorm + RoPE + SwiGLU + GQA 这一现代主流骨架。相对 Qwen2 ,报告强调的硬变化主要是:去掉 QKV 线性层的 bias ,改成在注意力里对 Q、K 做 QK-Norm 稳住尺度;词表 从 Qwen2 报告的 151,646 扩到 151,669 ;MoE 改为 128 个路由专家、每 token 激活 8 个、不设共享专家 ,并加 global-batch 负载均衡 。思考 / 非思考 是后训练与聊天模板塑造的行为,不是多出来的神经网络层。
1. 概述:Qwen3 在系列中的位置
Qwen3 Technical Report 将 Qwen3 定位为通义千问家族新一代 开放权重 大语言模型:含 稠密/Dense 与 MoE ,总参约 0.6B~235B ;旗舰 Qwen3-235B-A22B 为 MoE(总参约 235B,每 token 激活约 22B )。许可证 Apache 2.0 。预训练数据约 36T tokens ,覆盖约 119 种语言与方言;后训练突出 思考(thinking)与非思考(non-thinking) 融于 同一套权重 ,以及 思考预算(thinking budget)。
💡 稠密与 MoE 是什么?
- 稠密(Dense) :每一层里 FFN(前馈子层)只有一套权重 ,每个 token 前向时这套参数全部参与计算 。可以粗略理解成:模型有多大,每一步就算多大 ------显存里的权重规模与单次算量基本同量级。日常说的 Qwen3-8B、14B、32B 等,指的就是这种「整网共享同一条 FFN」的稠密型号。
- MoE(Mixture of Experts,混合专家) :把 FFN 换成 很多个结构相同、参数彼此独立的小网络(专家) ,再配一个 门控(路由器) :对当前这个 token 只挑出 其中少数几个专家 来算,其余专家本步不算。效果是:仓库里可以装下非常大的总参数量 (例如 235B),但 每生成一个 token 实际用到的计算量只和「被激活的那几条支路」相当 (报告里的 A22B 就表示这类「每 token 激活约 22B」的量级)。像一家大医院有很多科室,问诊时不会每个科室都跑一遍 ,只请相关专家会诊。注意力层 在 MoE 型号里通常仍是 共享、全量计算 的;稀疏 主要发生在 FFN 上。更细的公式与 Qwen3 的 128 专家、top-8 设定见 §9。

与 Qwen 1 / Qwen 2 对照:
| 代际 | 注意力与归一 | 词表(报告口径) | 稠密注意力头 | 长上下文主线 |
|---|---|---|---|---|
| Qwen 1 | MHA 为主 + QKV bias ;FFN 中间维常取 8 3 d \frac{8}{3}d 38d | 约 152K | 每头一套 KV | 预训练较短 + 推理期 NTK 等技巧 |
| Qwen 2 | 全系 GQA + QKV bias ;FFN 中间维按表 Intermediate Size | 151,646 | h q > h kv h_q>h_{\text{kv}} hq>hkv | 训练末段 32K + RoPE 基频 10 6 10^6 106 + YARN + DCA |
| Qwen 3 | 全系 GQA + 无 QKV bias + QK-Norm;FFN 同「按配置表」 | 151,669 | h q > h kv h_q>h_{\text{kv}} hq>hkv | 三阶段预训练 + 长阶段 32K + ABF + YARN + DCA (推理约 4× 训练窗容量) |
🔍 读配置的提醒 :各型号 hidden_size、intermediate_size、num_key_value_heads、head_dim 等以 Hugging Face
config.json与官方发布 为准;下文稠密 / MoE 表摘自技术报告,若与某一 checkpoint 略有出入,以权重为准。
2. 整体架构总览
2.1 Decoder-only:只有「解码堆栈」
Qwen3 与 GPT / LLaMA / Qwen 前两代一样,是 Decoder-only 因果语言模型:
- 没有 Encoder ,也 没有 Encoder--Decoder 之间的 交叉注意力。
- 每一层只有 带因果掩码的自注意力 + 前馈网络(FFN)。
- 训练目标:只看当前位置之前的 token,预测下一个 token(自回归)。
💡 直觉 :像只带「已读部分高亮」的阅读灯从左扫到右------每一步只能利用已经出现的词来猜下一个词,不能偷看未来。
2.2 宏观看:从字符串到 logits
整体数据流(可先假设 Batch=1):
纯文本
→ Tokenizer(BBPE)→ token ID 序列,长度 L
→ Embedding 查表 → 矩阵 X ∈ ℝ^(L × d_model)
→ 堆叠 N 个「Transformer Block」(每层结构相同,参数不同)
→ 最后一层隐藏状态 H → 取最后一个位置 h(预测下一词)
→ LM Head(线性层;可与 Embedding 绑权或分开)
→ 词表 logits → Softmax → 下一 token 概率
位置信息 不写成「词嵌入 + 正弦位置向量」叠在 X X X 上,而是在 每一层注意力里 对 Q、K 施加 RoPE (详见 §3.4 );超长输入 上的 YARN、DCA 等与 RoPE 配合,见 §7。
2.3 单个 Transformer Block(稠密 Qwen3)
一个 Block = 注意力子层 + FFN 子层 ,两边都是 Pre-Norm + 残差。
| 顺序 | 组件 | 作用(一句话) |
|---|---|---|
| 1 | RMSNorm | 在进注意力前,把每个位置的向量尺度拉稳 |
| 2 | 因果 GQA | 自注意力:多组 Query 共享较少组 Key/Value,省 KV Cache |
| 3 | RoPE | 旋进 Q、K,编码 相对位置 |
| 4 | QK-Norm | Qwen3 特有 :点积 前 对 Q、K 归一化;与「去掉 QKV bias」配套 |
| 5 | 掩码 + Softmax + V + 拼接 + W O W_O WO | 标准注意力输出,形状仍为 L × d model L \times d_{\text{model}} L×dmodel |
| 6 | 残差 | 与进入本子层前的 hidden 相加 |
| 7 | RMSNorm | 再归一化后进 FFN |
| 8 | SwiGLU FFN | 门控前馈,提供主要非线性 |
| 9 | 残差 | 得到本 Block 输出,作为下一层输入 |
MoE Qwen3 :自注意力整段 + 两侧 RMSNorm 与残差 与稠密相同;FFN 段 把「单个 稠密 SwiGLU」换成 门控 + 多专家 ,每个 token 只算其中 top- k k k 个专家 (§9)。
用 ASCII 画成单块数据流:
┌──────────────────────────────────────────────┐
本层输入 │ 形状 (Batch, SeqLen, d_model) │
↓ │ ↓ │
RMSNorm │ Pre-Norm,逐行归一化,形状不变 │
↓ │ ↓ │
因果 GQA │ 线性得 Q,K,V → RoPE(Q,K) → QK-Norm → │
│ QK^T/√d_k → 因果掩码 → softmax → 乘 V │
│ → 多头拼接 → W_O │
↓ │ ↓ │
+ ←──────┼── 残差(加「进注意力前」的 hidden) │
↓ │ ↓ │
RMSNorm │ ↓ │
↓ │ ↓ │
FFN │ 稠密:SwiGLU;MoE:门控 + 稀疏专家(§9) │
↓ │ ↓ │
本层输出 │ + 残差 → 下一层 或 最后的 LM Head(§10) │
└──────────────────────────────────────────────┘
💡 和 2017 年「经典 Transformer Decoder」示意图差在哪? 经典图常是 Post-Norm 、在 Embedding 上加绝对位置 、FFN 用 ReLU 。Qwen3 用的是 Pre-Norm + RMSNorm + RoPE + SwiGLU + GQA + QK-Norm ,且 无 Encoder------这是当前开源 LLM 常见配方。
2.4 推理时的形状与复杂度直觉
- 每一层主路径上,每个 token 仍是 d model d_{\text{model}} dmodel 维 ;整句可记为 L × d model L \times d_{\text{model}} L×dmodel ,进出一层形状不变。
- 自注意力 在长度 L L L 上两两算相似度,主项 O ( L 2 ) O(L^2) O(L2) ;工程上常用 FlashAttention 等融合实现,避免显式存满 L × L L \times L L×L 矩阵。
- FFN 对每个位置 独立 计算,不混合不同位置;GQA 让 KV Cache 随 KV 头数 增长,而非随 Query 头数满额增长。
🔍 实际例子 :Qwen3-8B 常见配置 d model = 4096 d_{\text{model}}=4096 dmodel=4096, N = 36 N=36 N=36 ,32 个 Q 头 / 8 个 KV 头 。若 L = 2048 L=2048 L=2048,每层主路径张量多为 2048×4096 ;缓存里 K、V 只按 8 组 存,而不是 32 组。
下文 §3 起按模块拆开,写公式并与 Qwen 1 / Qwen 2 对照。
3. 从文本到第一层 Decoder:Tokenizer、Embedding、绑权与位置
模型不直接读字符串,只读 token ID 序列 。流程可记为:字符串 → Tokenizer → ID 序列 → Embedding 矩阵 X X X ;位置 不写在 X X X 上,而在后面每一层的 RoPE 里旋进 Q、K。
3.1 Tokenizer:BBPE 在做什么
直觉 :像把一句话切成一块块「乐高」;每块对应词表里一个 token ,计算机里是一个整数 ID。
Qwen3 沿用 Qwen 系列的 byte-level BPE(BBPE) :先在 UTF-8 字节 上建立可合并单元,再迭代合并高频片段,减轻多语 OOV(词表外) 问题,并兼顾 压缩率(同样字数用更少 token,推理常按 token 计费)。
来源:Qwen3 Technical Report §2 写明词表规模为 151,669 ,相对 Qwen2 报告中的 151,646 多出 23 个 token(系列迭代中新增特殊符号等)。
💡 理解要点 :词表越大,同样文本往往 token 数越少 ,但 Embedding 矩阵 与(若 untied)输出层 的参数量随词表维 线性变大,是显存大户之一。
工程注记 :你看到的 config.json 里 vocab_size 有时是 151936 等 大于 151669 的整数 ,多为 张量对齐 / padding (方便 GPU 块对齐),与 Qwen2 技术报告里「分布式下嵌入行数可能大于名义词表」是同一类现象------算参数量、建 nn.Embedding 行数时,以该 checkpoint 的配置为准。
补充阅读 :社区博文 Qwen3 架构深度解析(Cialtion) 对 控制 token、ChatML 模板、动态 batch / packing 有入门向整理;其中参数表若与官方不一致,以 arXiv:2505.09388 与 config.json 为准。
3.2 Embedding:从 ID 到矩阵 X X X
词表大小记为 V V V(叙述 Qwen3 报告时用 151669 ;实现上可能按 vocab_size 取更大嵌入表)。嵌入矩阵
E ∈ R V × d model . E \in \mathbb{R}^{V \times d_{\text{model}}}. E∈RV×dmodel.
将 第 w w w 行 转置为列向量 e w = E w , : ⊤ ∈ R d model \mathbf{e}w = Ew,:^\top \in \mathbb{R}^{d{\text{model}}} ew=Ew,:⊤∈Rdmodel。长度为 L L L 的序列 ( w 0 , ... , w L − 1 ) (w_0,\ldots,w_{L-1}) (w0,...,wL−1) 堆成
X = e w 0 ⊤ ⋮ e w L − 1 ⊤ ∈ R L × d model . X = \begin{bmatrix} \mathbf{e}{w_0}^\top \\ \vdots \\ \mathbf{e}{w_{L-1}}^\top \end{bmatrix} \in \mathbb{R}^{L \times d_{\text{model}}}. X= ew0⊤⋮ewL−1⊤ ∈RL×dmodel.
进入第一层 Decoder 的就是 X X X :没有 在 X X X 上加「正弦位置向量」(那是经典 GPT 式做法)。
3.3 绑权(Weight Tying)与 Qwen 三代策略
预测下一 token :堆叠 N N N 层后得 H ∈ R L × d model H \in \mathbb{R}^{L \times d_{\text{model}}} H∈RL×dmodel,取 最后一个位置 h = H L − 1 , : ⊤ \mathbf{h} = HL-1,:^\top h=HL−1,:⊤。
- 未绑权(untied) :单独有 W out ∈ R d model × V W_{\text{out}} \in \mathbb{R}^{d_{\text{model}} \times V} Wout∈Rdmodel×V, s = W out ⊤ h + b out \mathbf{s} = W_{\text{out}}^\top \mathbf{h} + \mathbf{b}_{\text{out}} s=Wout⊤h+bout,再 s o f t m a x ( s ) \mathrm{softmax}(\mathbf{s}) softmax(s)。
- 绑权 :令 W out = E ⊤ W_{\text{out}} = E^\top Wout=E⊤,则 s w = h ⊤ e w + ( b out ) w s_w = \mathbf{h}^\top \mathbf{e}w + (b{\text{out}})w sw=h⊤ew+(bout)w,省一整块 d model × V d{\text{model}} \times V dmodel×V 的输出权重。
三代对照(概括):
- Qwen 1 :报告明确 untied(大词表下换表达自由度)。
- Qwen 2 :小模型 tied,大模型 untied(如 0.5B/1.5B True,7B/72B False)。
- Qwen 3 (报告表 1):0.6B / 1.7B / 4B → Tie Yes ;8B / 14B / 32B → No ;MoE 以
config.json为准。
3.4 位置编码:经典方式 vs Qwen 系列(RoPE)
经典 Decoder-only (如原版 GPT 叙述):在 Embedding 之后只做一次 , I n p u t p o s = E m b p o s + P E ( p o s ) \mathrm{Input}pos=\mathrm{Emb}pos+\mathrm{PE}(pos) Inputpos=Embpos+PE(pos),正弦形式可写为
P E ( p o s , 2 i ) = sin ( p o s 10000 2 i / d model ) , P E ( p o s , 2 i + 1 ) = cos ( p o s 10000 2 i / d model ) . \mathrm{PE}{(pos,\,2i)} = \sin\Big(\frac{pos}{10000^{2i/d{\text{model}}}}\Big), \quad \mathrm{PE}{(pos,\,2i+1)} = \cos\Big(\frac{pos}{10000^{2i/d{\text{model}}}}\Big). PE(pos,2i)=sin(100002i/dmodelpos),PE(pos,2i+1)=cos(100002i/dmodelpos).
Qwen 1 / 2 / 3 共同点 :不在 X X X 上加绝对 PE ;在 每一层 、算 Q K ⊤ QK^\top QK⊤ 之前 ,对 Q、K 施加 RoPE(旋转位置编码) :让每个位置的 Q、K 向量在 d k d_k dk 维里按位置旋转,使得注意力分数 S i j S_{ij} Sij 能体现 相对位置 (如依赖 i − j i-j i−j),利于 外推更长序列 。旋转 不改变 Q , K Q,K Q,K 的形状,仍是 L × d k L \times d_k L×dk。
长上下文上的演进:
- Qwen 1 :预训练上下文相对短,报告侧重 推理期 NTK-aware RoPE、LogN、窗口等 组合技巧。
- Qwen 2 :预训练 末段拉到 32K ,RoPE 基频 常从 10 4 10^4 104 调到 10 6 10^6 106 ,再配合 YARN 、DCA 扩到约 128K 量级。
- Qwen 3 :三阶段预训练 (见 §7 ),长阶段 32K ;同样用 ABF 把基频抬到 10 6 10^6 106 ,配合 YARN + DCA ,报告称推理上可获得相对训练窗约 4 倍 的序列容量。
3.4.1 位置与注意力线性层:Qwen 1 vs 2 vs 3
| 项目 | Qwen 1 | Qwen 2 | Qwen 3 |
|---|---|---|---|
| RoPE 作用于 | Q、K | Q、K | Q、K |
| QKV 线性层 bias | 有 | 有 | 无 |
| Q/K 额外归一化 | 无(靠 bias 等) | 无单独 QK-Norm | QK-Norm (§5) |
4. RMSNorm 与 Pre-Norm:每层先归一化再进子层
Pre-Norm 指:先 RMSNorm,再进注意力或 FFN,再与残差流相加;相对 Post-Norm(先子层再 LN),深层训练往往更稳。
对单行向量 x ∈ R d model \mathbf{x} \in \mathbb{R}^{d_{\text{model}}} x∈Rdmodel,RMSNorm 先算均方根尺度( ε \varepsilon ε 防除零):
R M S ( x ) = ε + 1 d model ∑ j = 1 d model x j 2 , \mathrm{RMS}(\mathbf{x}) = \sqrt{\varepsilon + \frac{1}{d_{\text{model}}}\sum_{j=1}^{d_{\text{model}}} x_j^2}, RMS(x)=ε+dmodel1j=1∑dmodelxj2 ,
再
R M S N o r m ( x ) = x R M S ( x ) ⊙ γ , \mathrm{RMSNorm}(\mathbf{x}) = \frac{\mathbf{x}}{\mathrm{RMS}(\mathbf{x})} \odot \boldsymbol{\gamma}, RMSNorm(x)=RMS(x)x⊙γ,
其中 γ \boldsymbol{\gamma} γ 为可学习缩放。不减均值、无平移 β \boldsymbol{\beta} β,比 LayerNorm 更省算。
矩阵形式 : X ∈ R L × d model X \in \mathbb{R}^{L \times d_{\text{model}}} X∈RL×dmodel 逐行 RMSNorm,输出仍为 L × d model L \times d_{\text{model}} L×dmodel。
💡 理解要点 :RMSNorm 像「只按长度把向量拉到相似尺度,不管重心在哪」,配合 Pre-Norm,让后面的注意力与 FFN 输入分布更稳定。Qwen 1 / 2 / 3 在这一点上是一致的。
5. 分组查询注意力(GQA):MHA、GQA、MQA 与 Qwen 三代
本节三个缩写对应的全称如下(后文仍多用缩写书写):
| 缩写 | 英文全称 | 中文常称 |
|---|---|---|
| MHA | Multi-Head Attention | 多头注意力 |
| GQA | Grouped-Query Attention | 分组查询注意力 |
| MQA | Multi-Query Attention | 多查询注意力 |
GQA 作为 MHA 与 MQA 之间的折中,由 Ainslie et al.(2023)系统讨论;直观上:MHA 每头自有 K/V,MQA 全头共享一套 K/V,GQA 则是多组 Q 头分组共用较少的 K/V 头。
5.1 为什么需要「分组」
自回归推理每一步都要缓存历史位置的 K、V (KV Cache)。多头注意力 若让每个 Query 头各自对应一套 K、V(MHA ),缓存随 头数 线性涨。GQA 让 多个 Q 头共用同一组 K、V ,在 输出形状仍是 L × d model L \times d_{\text{model}} L×dmodel 的前提下,减少 KV 参数量与缓存体积。
- MHA : h q = h kv = h h_q = h_{\text{kv}} = h hq=hkv=h,每个 Q 头有自己的 K ( t ) , V ( t ) K^{(t)}, V^{(t)} K(t),V(t)。
- GQA : h q > h kv h_q > h_{\text{kv}} hq>hkv,常令 g = h q / h kv g = h_q / h_{\text{kv}} g=hq/hkv 为整数;连续 g g g 个 Q 头 共用 一组 K ( u ) , V ( u ) K^{(u)}, V^{(u)} K(u),V(u)。
- MQA : h kv = 1 h_{\text{kv}}=1 hkv=1,所有 Q 头共用 一套 K、V(最省缓存,容量最紧)。
| 项目 | MHA | GQA |
|---|---|---|
| Q 头 / KV 头 | h q = h kv h_q = h_{\text{kv}} hq=hkv | h q > h kv h_q > h_{\text{kv}} hq>hkv |
| 约束 | d model = h q d k d_{\text{model}} = h_q\, d_k dmodel=hqdk | 同左 |
| 单层 Attn 输出形状 | L × d model L \times d_{\text{model}} L×dmodel | 同左 |
| KV Cache(粗) | ∝ h q \propto h_q ∝hq | ∝ h kv \propto h_{\text{kv}} ∝hkv |
Qwen 三代 :Qwen1 报告基线以 MHA 为主;Qwen1.5 起部分规格引入 GQA;Qwen2 稠密全系 GQA ;Qwen3 稠密全系仍为 GQA (报告表 1:如 8B 为 32 Q / 8 KV)。
5.2 分组规则
记 t = 1 , ... , h q t = 1,\ldots,h_q t=1,...,hq 为 Query 头下标, u = 1 , ... , h kv u = 1,\ldots,h_{\text{kv}} u=1,...,hkv 为 KV 组下标, g = h q / h kv g = h_q / h_{\text{kv}} g=hq/hkv,则
u = ⌊ t − 1 g ⌋ + 1. u = \left\lfloor \frac{t - 1}{g} \right\rfloor + 1. u=⌊gt−1⌋+1.
例如 h q = 32 , h kv = 8 , g = 4 h_q=32,\,h_{\text{kv}}=8,\,g=4 hq=32,hkv=8,g=4 :头 1--4 共用 K ( 1 ) , V ( 1 ) K^{(1)},V^{(1)} K(1),V(1),头 5--8 共用 K ( 2 ) , V ( 2 ) K^{(2)},V^{(2)} K(2),V(2),依此类推。
5.3 线性投影:Qwen3 无 QKV bias
子层入口: X ~ 1 = R M S N o r m ( X in ) \tilde{X}1 = \mathrm{RMSNorm}(X{\text{in}}) X~1=RMSNorm(Xin),下文简记为 X ∈ R L × d model X \in \mathbb{R}^{L \times d_{\text{model}}} X∈RL×dmodel。
什么叫「有 QKV bias」 :全连接 / 线性投影一般写为 y = x W + b y = x W + b y=xW+b 。其中 W W W 把 d model d_{\text{model}} dmodel 维映到输出维;b b b (bias,偏置 )是与当前输入 x x x 无关 的可学习向量,给输出的每一维加一个常数平移 。若没有 bias,则 y = x W y = x W y=xW,相当于变换必过原点 ;加上 bias 后,超平面可以整体平移 ,表达更灵活。在注意力里,bias 会进入 Q K ⊤ QK^\top QK⊤ 前的 logits,相当于在「各键方向有多容易被 attend」上增加一层与 token 内容无关的基线偏移。
Qwen 1 / Qwen 2 :Q、K、V 三个线性层都带 各自的 bias。以第 t t t 个 Q 头为例,可写成( 1 L \mathbf{1}_L 1L 为长度 L L L 的全 1 列 向量, ( b Q ( t ) ) ⊤ (b_Q^{(t)})^\top (bQ(t))⊤ 按行广播到 L × d k L \times d_k L×dk 的每一行):
Q ( t ) = X W Q ( t ) + 1 L ( b Q ( t ) ) ⊤ , K ( u ) = X W K ( u ) + 1 L ( b K ( u ) ) ⊤ , V ( u ) = X W V ( u ) + 1 L ( b V ( u ) ) ⊤ . Q^{(t)} = X W_Q^{(t)} + \mathbf{1}_L (b_Q^{(t)})^\top, \quad K^{(u)} = X W_K^{(u)} + \mathbf{1}_L (b_K^{(u)})^\top, \quad V^{(u)} = X W_V^{(u)} + \mathbf{1}_L (b_V^{(u)})^\top. Q(t)=XWQ(t)+1L(bQ(t))⊤,K(u)=XWK(u)+1L(bK(u))⊤,V(u)=XWV(u)+1L(bV(u))⊤.
Qwen 3 :报告写明 remove QKV-bias ,即去掉 上述三项中的 1 L b ⊤ \mathbf{1}_L \mathbf{b}^\top 1Lb⊤,只保留:
Q ( t ) = X W Q ( t ) , K ( u ) = X W K ( u ) , V ( u ) = X W V ( u ) , Q^{(t)} = X W_Q^{(t)}, \quad K^{(u)} = X W_K^{(u)}, \quad V^{(u)} = X W_V^{(u)}, Q(t)=XWQ(t),K(u)=XWK(u),V(u)=XWV(u),
其中 Q ( t ) ∈ R L × d k Q^{(t)} \in \mathbb{R}^{L \times d_k} Q(t)∈RL×dk, K ( u ) , V ( u ) ∈ R L × d k K^{(u)}, V^{(u)} \in \mathbb{R}^{L \times d_k} K(u),V(u)∈RL×dk。
5.4 RoPE 与 QK-Norm 的顺序(Qwen3 关键)
对 Q ( t ) Q^{(t)} Q(t)、 K ( u ) K^{(u)} K(u) 的 每一行 (每个位置)在 d k d_k dk 维内做 RoPE ;形状不变。
随后在算点积 之前 做 QK-Norm (常用 RMSNorm ,作用在 每个 head 的 d k d_k dk 维 上):
Q ~ ( t ) = N o r m ( Q ( t ) ) , K ~ ( u ) = N o r m ( K ( u ) ) , S ( t ) = Q ~ ( t ) ( K ~ ( u ) ) ⊤ d k ∈ R L × L . \tilde{Q}^{(t)} = \mathrm{Norm}\big(Q^{(t)}\big), \quad \tilde{K}^{(u)} = \mathrm{Norm}\big(K^{(u)}\big), \quad S^{(t)} = \frac{\tilde{Q}^{(t)} (\tilde{K}^{(u)})^\top}{\sqrt{d_k}} \in \mathbb{R}^{L \times L}. Q~(t)=Norm(Q(t)),K~(u)=Norm(K(u)),S(t)=dk Q~(t)(K~(u))⊤∈RL×L.
💡 直觉 :去掉 bias 后,深层里 Q、K 范数容易漂,点积 logits 会过大或过小;在 head 维上把 Q、K 拉回稳定尺度 ,Softmax 更不容易塌成 one-hot 或过于均匀。V 通常不做与 Q、K 对称的 QK-Norm(以官方实现为准)。
实现顺序 (Hugging Face transformers 中 Qwen3 ):线性 → RoPE → q_norm / k_norm → Q K ⊤ / d k QK^\top/\sqrt{d_k} QK⊤/dk 。这与「先 Norm 再 RoPE」在数值上 不等价,移植代码时要对齐顺序。
与 Qwen 2 对比 :Qwen2 无 这一显式 QK-Norm,而用 QKV bias 等稳定训练;Qwen3 去掉 bias ,用 QK-Norm 接棒。
5.5 因果掩码、Softmax、输出头 W O W_O WO
对 S ( t ) S^{(t)} S(t) 加上 因果掩码 (位置 i i i 不能看 j > i j>i j>i,上三角为 − ∞ -\infty −∞),行内 softmax 得 A ( t ) A^{(t)} A(t),再
h e a d ( t ) = A ( t ) V ( u ) ∈ R L × d k . \mathrm{head}^{(t)} = A^{(t)} V^{(u)} \in \mathbb{R}^{L \times d_k}. head(t)=A(t)V(u)∈RL×dk.
拼接与输出投影:
C o n c a t = h e a d ( 1 ) ∥ ⋯ ∥ h e a d ( h q ) ∈ R L × d model , A t t n O u t = C o n c a t W O , W O ∈ R d model × d model . \mathrm{Concat} = \big\\mathrm{head}\^{(1)} \\,\\\|\\, \\cdots \\,\\\|\\, \\mathrm{head}\^{(h_q)}\\big \in \mathbb{R}^{L \times d_{\text{model}}}, \quad \mathrm{AttnOut} = \mathrm{Concat}\, W_O, \quad W_O \in \mathbb{R}^{d_{\text{model}} \times d_{\text{model}}}. Concat=head(1)∥⋯∥head(hq)∈RL×dmodel,AttnOut=ConcatWO,WO∈Rdmodel×dmodel.
残差: X mid = X in + A t t n O u t X_{\text{mid}} = X_{\text{in}} + \mathrm{AttnOut} Xmid=Xin+AttnOut。
训练/推理可用 Flash Attention 在 不显式存满 L × L L \times L L×L 的情况下等价完成上述计算。
5.6 注意力子层维度小结(Qwen3)
| 步骤 | 张量 | 形状 |
|---|---|---|
| Pre-Norm 后 | X X X | L × d model L \times d_{\text{model}} L×dmodel |
| 每 Q 头(RoPE + QK-Norm 后仍同形) | Q ( t ) Q^{(t)} Q(t) 等 | L × d k L \times d_k L×dk,共 h q h_q hq 份 |
| 每 K/V 组 | K ( u ) , V ( u ) K^{(u)},V^{(u)} K(u),V(u) | L × d k L \times d_k L×dk,共 h kv h_{\text{kv}} hkv 份 |
| 每头分数 | S ( t ) S^{(t)} S(t) | L × L L \times L L×L |
| 子层输出 | A t t n O u t \mathrm{AttnOut} AttnOut | L × d model L \times d_{\text{model}} L×dmodel |
6. 前馈网络:SwiGLU(Qwen 1 / 2 / 3 同型,宽度按代际变)
第二子层: X ~ 2 = R M S N o r m ( X mid ) \tilde{X}2 = \mathrm{RMSNorm}(X{\text{mid}}) X~2=RMSNorm(Xmid),再 SwiGLU FFN ,最后残差 X out = X mid + F F N O u t X_{\text{out}} = X_{\text{mid}} + \mathrm{FFNOut} Xout=Xmid+FFNOut。
SwiGLU 形式(与 LLaMA / Qwen2 同族):
S w i G L U ( X ~ ) = ( σ swish ( X ~ W 1 ) ⊙ ( X ~ W 3 ) ) W 2 , \mathrm{SwiGLU}(\tilde{X}) = \big(\sigma_{\text{swish}}(\tilde{X} W_1) \odot (\tilde{X} W_3)\big) W_2, SwiGLU(X~)=(σswish(X~W1)⊙(X~W3))W2,
其中 σ swish ( z ) = z ⋅ σ ( z ) \sigma_{\text{swish}}(z)=z\cdot\sigma(z) σswish(z)=z⋅σ(z), ⊙ \odot ⊙ 为逐元素乘; W 1 , W 3 ∈ R d model × d ff W_1,W_3 \in \mathbb{R}^{d_{\text{model}} \times d_{\text{ff}}} W1,W3∈Rdmodel×dff, W 2 ∈ R d ff × d model W_2 \in \mathbb{R}^{d_{\text{ff}} \times d_{\text{model}}} W2∈Rdff×dmodel, d ff d_{\text{ff}} dff 为 intermediate_size。
三代中间维对照:
- Qwen 1 (报告):常写 d ff = 8 3 d model d_{\text{ff}} = \frac{8}{3} d_{\text{model}} dff=38dmodel (约 2.67 d 2.67d 2.67d),与 LLaMA 常见 4 d 4d 4d 不同。
- Qwen 2 / Qwen 3 :不再 用单一比例概括,各尺寸以配置表 /
config.json为准 (例如公开 Qwen3-8B 的intermediate_size为 12288 ,约 3 d 3d 3d 当 d = 4096 d=4096 d=4096)。
🔍 数值例子(Qwen3-8B,HF
config.json) : d model = 4096 d_{\text{model}}=4096 dmodel=4096, d ff = 12288 d_{\text{ff}}=12288 dff=12288,36 层;单序列 L = 4096 L=4096 L=4096 时每层主路径 4096 × 4096 4096 \times 4096 4096×4096。
7. 长上下文:Qwen3 的三阶段预训练与 YARN、DCA
7.1 三阶段在做什么(报告 §3.2)
- General(S1) :约 30T+ tokens,序列长度 4,096------广谱学语言与世界知识。
- Reasoning(S2) :约 5T 高质量数据(STEM、代码、推理、合成数据比例升高),仍 4,096 ,并 加快学习率衰减------强化推理相关分布。
- Long Context :数百 B tokens,序列 32,768 ;长文样本约 75% 落在 16K~32K ,25% 在 4K~16K ------让优化目标直接覆盖 万级 token 的因果依赖。
与 Qwen 1 对比 :Qwen1 长文多靠 推理期技巧 「补」上去;Qwen2/Qwen3 把 32K 级长阶段训练写进主线,根分布就更「见过长距离」。
7.2 RoPE 基频 ABF( 10 4 → 10 6 10^4 \to 10^6 104→106)
RoPE 用一组与维度相关的频率决定「转多快」。把 底数 / base frequency 从常见的 10 4 10^4 104 提到 10 6 10^6 106 (报告称 ABF 路径),相邻 token 在多数频率上相位差更小,极长距离 上相对位置仍可比区分,减轻「超出训练长度后位置编码失效」一类问题。Qwen 2 与 Qwen 3 的长线叙述都包含这一取向。
7.3 YARN:给注意力做「随长度缩放」的外推修正
YARN (YaRN;Peng et al., 2023)在需要 超过训练所见长度 或平滑拉长有效窗口时,对注意力里的 权重 / logits 尺度 做 与目标长度相关的重缩放 ,缓解外推时注意力过度集中或涣散。报告表述为 rescaling the attention weights for better length extrapolation 。它属于 前向路径上的修改 ,可与 换数据再训 正交使用。
7.4 DCA:分块利用「块内 + 块间」关系
Dual Chunk Attention(DCA) (An et al., 2024)把超长序列划成多个 chunk:
- 若 整条序列能放进一个 chunk ,DCA 与标准全序列自注意力结果相同(便于兼容短上下文行为)。
- 若 超过单块容量 ,则在 块内 保持常规 token--token 注意力,并 额外 利用 跨 chunk 的相对位置信息,减轻 块边界 上的信息断裂。
与 YARN 分工 :DCA 偏 结构上分块 + 位置关系 ;YARN 偏 注意力尺度上的外推修正。二者可与 GQA、RoPE、QK-Norm 同栈。
7.5 Qwen3 报告中的组合效果
在长阶段 32K 训练基础上,配合 ABF、YARN、DCA ,报告称推理时可获得相对训练窗口约 four-fold 的序列容量(机制上限;产品默认上下文仍以各型号说明与推理框架为准)。
8. 单层数据流汇总(Qwen3 稠密)
- X ~ 1 = R M S N o r m ( X in ) \tilde{X}1 = \mathrm{RMSNorm}(X{\text{in}}) X~1=RMSNorm(Xin)
- 线性投影得 Q ( t ) Q^{(t)} Q(t)、 K ( u ) K^{(u)} K(u)、 V ( u ) V^{(u)} V(u)(无 bias)
- 对 Q、K 做 RoPE ,再做 QK-Norm 得 Q ~ ( t ) \tilde{Q}^{(t)} Q~(t)、 K ~ ( u ) \tilde{K}^{(u)} K~(u)
- 因果 GQA: S ( t ) = Q ~ ( t ) ( K ~ ( u ) ) ⊤ / d k S^{(t)}=\tilde{Q}^{(t)}(\tilde{K}^{(u)})^\top/\sqrt{d_k} S(t)=Q~(t)(K~(u))⊤/dk → mask → softmax → 乘 V ( u ) V^{(u)} V(u) → 拼接 → W O W_O WO
- X mid = X in + A t t n O u t X_{\text{mid}} = X_{\text{in}} + \mathrm{AttnOut} Xmid=Xin+AttnOut
- X ~ 2 = R M S N o r m ( X mid ) \tilde{X}2 = \mathrm{RMSNorm}(X{\text{mid}}) X~2=RMSNorm(Xmid)
- F F N O u t = S w i G L U ( X ~ 2 ) \mathrm{FFNOut} = \mathrm{SwiGLU}(\tilde{X}_2) FFNOut=SwiGLU(X~2)
- X out = X mid + F F N O u t X_{\text{out}} = X_{\text{mid}} + \mathrm{FFNOut} Xout=Xmid+FFNOut
主路径形状恒为 L × d model L \times d_{\text{model}} L×dmodel。
8.1 稠密规格速查(报告表 1)
| 模型 | Layers | Heads (Q / KV) | Tie Embedding | Context Length |
|---|---|---|---|---|
| Qwen3-0.6B | 28 | 16 / 8 | Yes | 32K |
| Qwen3-1.7B | 28 | 16 / 8 | Yes | 32K |
| Qwen3-4B | 36 | 32 / 8 | Yes | 128K |
| Qwen3-8B | 36 | 32 / 8 | No | 128K |
| Qwen3-14B | 40 | 40 / 8 | No | 128K |
| Qwen3-32B | 64 | 64 / 8 | No | 128K |
9. MoE:仅替换 FFN;Qwen3 相对 Qwen2 的路由差异
MoE 层只替换每个 Decoder 块里的 FFN ;注意力子层 (GQA、RoPE、QK-Norm、无 QKV bias)与稠密 同型。
9.1 门控与 top- k k k(与 Qwen2 数学骨架相同)
单 token 向量 x ∈ R d model x \in \mathbb{R}^{d_{\text{model}}} x∈Rdmodel(批上即 L × d model L \times d_{\text{model}} L×dmodel 逐行)。门控网络输出 logits ℓ = G ( x ) \boldsymbol{\ell} = G(x) ℓ=G(x), p = s o f t m a x ( ℓ ) p = \mathrm{softmax}(\boldsymbol{\ell}) p=softmax(ℓ)。设共有 n n n 个 路由专家 R i R_i Ri(结构与 SwiGLU FFN 同类),top- k k k 选指数集合 t o p k ( p ) \mathrm{topk}(p) topk(p),则路由支路常写为
y route = ∑ i ∈ t o p k ( p ) p i R i ( x ) . y_{\text{route}} = \sum_{i\,\in\,\mathrm{topk}(p)} p_i\, R_i(x). yroute=i∈topk(p)∑piRi(x).
(具体是否对 top- k k k 内 p i p_i pi 再归一化,以 官方实现 为准。)
9.2 Qwen2 MoE vs Qwen3 MoE(报告)
| 项目 | Qwen2-57B-A14B(典型叙述) | Qwen3 MoE(报告) |
|---|---|---|
| 路由专家数 / 每 token 激活 | 64,top-8 | 128 ,top-8 |
| 共享专家 | 有(如 8 个 shared,每 token 必算) | 无 |
| 负载均衡 | 报告未细述 | global-batch load balancing loss |
去掉共享专家 后,一层 MoE FFN 输出可 仅 由路由支路组成:
y = ∑ i ∈ t o p k ( p ) p i R i ( x ) . y = \sum_{i\,\in\,\mathrm{topk}(p)} p_i\, R_i(x). y=i∈topk(p)∑piRi(x).
9.3 MoE 规格(报告表 2)
| 模型 | Layers | Heads (Q / KV) | # Experts (Total / Activated) | Context Length |
|---|---|---|---|---|
| Qwen3-30B-A3B | 48 | 32 / 4 | 128 / 8 | 128K |
| Qwen3-235B-A22B | 94 | 64 / 4 | 128 / 8 | 128K |
命名 :30B-A3B = 总参约 30B,每 token 激活约 3B ;235B-A22B 同理。
10. 输出层(LM Head)
堆叠 N N N 层后 H ∈ R L × d model H \in \mathbb{R}^{L \times d_{\text{model}}} H∈RL×dmodel,自回归取 h = H L − 1 , : ⊤ \mathbf{h} = HL-1,:^\top h=HL−1,:⊤。
- untied : s = W out ⊤ h + b out \mathbf{s} = W_{\text{out}}^\top \mathbf{h} + \mathbf{b}_{\text{out}} s=Wout⊤h+bout, P = s o f t m a x ( s ) P=\mathrm{softmax}(\mathbf{s}) P=softmax(s)。
- tied : W out = E ⊤ W_{\text{out}}=E^\top Wout=E⊤, s w = h ⊤ e w + ( b out ) w s_w = \mathbf{h}^\top \mathbf{e}w + (b{\text{out}})_w sw=h⊤ew+(bout)w。
MoE 不改变 LM Head 形状;词表维 V V V 以报告 151669 与实现 vocab_size 共同为准。
11. 思考模式、非思考模式与思考预算(后训练与模板)
不改变 上文任何矩阵维数:同一套权重可通过 SFT / RL 与 chat template 学会:有时先输出长 思维链 ,有时直接答;用户可用 /think、/no_think 等开关(默认与细节见报告表 9 与 tokenizer_config 示例)。
思考预算 :思考 token 达到阈值时可插入提示,让模型结束思考段、续写最终答案;报告称部分能力来自 融合训练后的涌现,未必单独设计 loss。
强到弱蒸馏 :小模型可用旗舰 logits 蒸馏 ,报告给出约 1/10 GPU hours 量级的经验节省。
与 Qwen 1 / 2 对比 :Qwen1/2 后训练以 SFT、DPO 等为主叙述;Qwen3 额外强调 thinking + non-thinking 统一 与 预算 、蒸馏流水线。
12. 总览:Qwen 1 / Qwen 2 / Qwen 3 架构对照表
| 维度 | Qwen 1 | Qwen 2 | Qwen 3 |
|---|---|---|---|
| 骨干 | Decoder-only,Pre-Norm,RMSNorm,RoPE,SwiGLU | 同左 | 同左 |
| 稠密注意力 | 报告基线 MHA | 全系 GQA | 全系 GQA |
| QKV bias | 有 | 有 | 无 |
| Q/K 稳定化 | bias + RoPE 等 | 同左 | QK-Norm(RoPE 后、点积前) |
| FFN 中间维 | 报告常 8 3 d \frac{8}{3}d 38d | 表列 Intermediate Size | 同 Qwen2(按配置) |
| 词表(报告) | ~152K | 151,646 | 151,669 |
| Embedding | untied(报告) | 小 tied / 大 untied | 小多款 tied ,8B+ 多 untied(表 1) |
| 长上下文 | 推理技巧 + 1.5 产品 32K 等 | 训练 32K + 10 6 10^6 106 + YARN + DCA | 三阶段 + 长阶段 32K + ABF + YARN + DCA |
| MoE | --- | 共享专家 + 路由,64/8 等 | 128/8 ,无共享专家,global-batch 均衡 |
| 预训练规模(报告量级) | 较低代数据量 | ~7T 量级 | ~36T |
| 对齐亮点 | --- | SFT + DPO 等 | 思考/非思考统一 + 预算 + 蒸馏 |
13. 各环节参数量(粗算思路,与 Qwen 1 / 2 一致)
记 d = d model d = d_{\text{model}} d=dmodel, N N N 为层数, V V V 为嵌入行数(实现上可能等于 vocab_size)。
| 模块 | 数量级要点 |
|---|---|
| Embedding | V ⋅ d V \cdot d V⋅d;若 untied ,另加约 d ⋅ V d \cdot V d⋅V 的 W out W_{\text{out}} Wout |
| 每层注意力 | W Q W_Q WQ 约 d × ( h q d k ) d \times (h_q d_k) d×(hqdk); W K , W V W_K,W_V WK,WV 各 d × ( h kv d k ) d \times (h_{\text{kv}} d_k) d×(hkvdk); W O W_O WO 约 d × d d \times d d×d;Qwen3 无 QKV bias 的三项小向量 |
| 每层 RMSNorm | 子层前各一处 γ \boldsymbol{\gamma} γ,约 2 d 2d 2d / 层(Pre-Norm 两处) |
| 每层 SwiGLU | 约 4 d d ff 4\, d\, d_{\text{ff}} 4ddff 量级(两路上升 + 一下降) |
| MoE | 总参随专家数累加;每 token 激活 只算 top- k k k 个专家(+ Qwen2 若有 shared 则再加共享支路) |
14. 参考文献与链接汇总
| 主题 | 链接 |
|---|---|
| Qwen3 Technical Report | https://arxiv.org/pdf/2505.09388 |
| Qwen2 Technical Report | https://arxiv.org/pdf/2407.10671 |
| Qwen(Qwen1)Technical Report | https://arxiv.org/pdf/2309.16609 |
| 同系列:Qwen 1 / Qwen 1.5 | https://blog.csdn.net/zyctimes/article/details/159692526 |
| 同系列:Qwen 2 | https://blog.csdn.net/zyctimes/article/details/159762115?spm=1001.2014.3001.5501 |
| Decoder Only Transformer | https://blog.csdn.net/zyctimes/article/details/158771582?spm=1001.2014.3001.5501 |
| LLaMA 架构 | https://blog.csdn.net/zyctimes/article/details/158923114?spm=1001.2014.3001.5501 |
| DeepWiki:Qwen3 核心概念 | https://deepwiki.com/QwenLM/Qwen3/3-model-architecture-and-core-concepts |
| 社区导读(Cialtion) | https://haxxorcialtion.github.io/papers/qwen3_architecture_guide.html |
| Qwen3 从零实现(Ahead of AI;付费) | https://magazine.sebastianraschka.com/p/qwen3-from-scratch |