近期,千问开源了自家最新旗舰模型Qwen3.5系列,但最新的论文还没出,只有博客可以借鉴:
Qwenhttps://qwen.ai/blog?id=qwen3.5由于学习需要,回顾Qwen3系列模型,并计划在后续完成GLM-5等模型的拆解学习。
Qwen3论文如下
http://arxiv.org/abs/2505.09388http://arxiv.org/abs/2505.09388

一、概览

        回顾Transformer的架构,我们可以这么理解,首先,数据的输入Input会经过Embedding模型转换为向量(嵌入模型也可以自训练,这个部分很重要,特别是对RAG),而后通过多头注意力机制计算注意力,不同的头就是不同的角度,例如“我爱吃肯德基的蛋挞拌米饭”,头1会看我爱吃啥,头2会看蛋挞是谁家的,头3会看蛋挞和谁搭配了,这就是不同的角度,也就是不同的头(Heads)。注意力所计算的东西,我们的文本也就是KV,但这里涉及到一个问题:当上下文过大时,KV太多,从显存搬运到 SRAM时,我们用显卡计算时的计算效率会远低于存储访问效率,严重拖垮了长序列(如高分辨率图像切片特征)的解码吞吐量,于是我们会从MHA(Multi-Head Attention)转向MQA(Multi-Querry Attention)混合/多查询注意力,为了打破显存墙,MQA 走向了另一个极端:保留 H 个 Query 头,但强行让所有 Query 头共享 唯一的一组 Key 和 Value。


 

        这使得 KV Cache 的体积缩小了 H倍,吞吐量极高。然而,其代价是表达能力的严重坍塌(Capacity Degradation),在处理需要精细化局部映射的复杂推理任务时,容易丢失关键的细粒度特征。好的,终于到了主角Qwen3所采用的办法:

一: GQA 的架构(Grouped Query Attention)
    

        出处:Joshua Ainslie, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebr  ́on, and Sumit Sanghai. GQA: Training generalized multi-query Transformer models from multi-head checkpoints. In EMNLP, pp. 4895–4901. Association for Computational Linguistics,
        2023.Ainslie 等人提出的 GQA 本质上是 MHA 与 MQA 之间的插值(Interpolation)。

        假设模型总共有 H 个 Query 头。GQA 将这些 Query 头划分为 G 个组(Groups),每个组包含 $h = \frac{H}{G}$ 个 Query 头。

        在每一个组 g 内部,所有的 h 个 Query 头共享同一组 Key 和 Value 头。

        对于属于组 g 的第 i 个 Query 头,其注意力计算的数学表达为:


        当 G = H 时,每个组只有 1 个 Query 头,GQA 退化为 MHA
        当 G = 1 时,所有 Query 头都在一个组里,GQA 退化为 MQA

       以图中为例,Qwen3-0.6B也就是16个头,8个QKV,也就是分成了两组,两个头关注一个QKV,此时通过调整超参数 G(例如 LLaMA-2/3 和 Qwen2.5-VL ),GQA 在数学上构建了一个完美平衡的特征空间:它保留了足够的 KV 投影维度以维持细粒度的高频信息捕捉能力,同时将 KV Cache 的访存压力降低到了系统可接受的范围内。

        GQA 论文的精髓不仅在于提出了这个架构,更在于解决了一个现实痛点:如何低成本地将一个已经用 MHA 预训练好的庞大模型,转化为 GQA 模型? 如果从头预训练,算力成本是天文数字。

论文提出了一种优雅的参数初始化与微调(Uptraining)方法: 均值池化 (Mean-pooling):为了初始化 GQA 组中的共享 Key 权重,$\mathbf{W}_{k, g}^{(\text{GQA})}$,作者直接对原始 MHA 检查点(Checkpoint)中对应组内的 h 个 Key 权重进行均值池化:
\mathbf{W}_{k, g}^{(\text{GQA})} = \frac{1}{h} \sum_{i \in \text{group } g} \mathbf{W}_{k, i}^{(\text{MHA})}

        同理,Value 权重也做均值池化操作。

        在完成了这种权重复用后,只需要使用原始预训练数据量的一小部分(论文中约为 5% 的 steps)进行 Uptraining(向上训练/恢复训练)。这使得模型能够在极短的时间内适应这种新的 KV 共享机制,最终在保持与原 MHA 模型几乎一致的感知精度的同时,获得了接近 MQA 的解码速度。


二、SwiGLU


        在传统的 Transformer FFN 层中,通常包含两个线性变换和一个非线性激活函数(如 ReLU 或 GELU):
        \text{FFN}(x) = \text{Activation}(xW_1 + b_1)W_2 + b_2
        Dauphin 等人在 2017 年处理语言建模时发现,传统的激活函数只是对单个神经元进行非线性映射,缺乏通道间的动态交互。于是他们引入了门控机制(Gating Mechanism),提出了 GLU:
        \text{GLU}(x) = (xW_1 + b_1) \otimes \sigma(xW_2 + b_2)
其中 $\sigma$ 是 Sigmoid 函数,$\otimes$是逐元素相乘(Element-wise multiplication)。
        这里不再是简单的“激活”,而是把输入分成了两条路径。一条路径 $xW_1$ 提供特征内容,另一条路径 $xW_2$ 经过 Sigmoid 变成 0 到 1 之间的“门控阈值”。这就相当于在 FFN 内部实现了一种软注意力(Soft Attention),让网络能够动态地决定“哪些特征应该被放行,哪些特征应该被阻断”。
        Noam Shazeer 在 2020 年对 GLU 进行了暴力但极其有效的微调:他把控制门控的 Sigmoid 函数,替换成了 Swish(在 $\beta=1$时即为 SiLU)激活函数。

        Swish 函数的数学定义为:

\text{Swish}(x) = x \cdot \sigma(x)
结合 GLU 的架构,去除了偏置项(现代大模型的常见做法),就得到了 SwiGLU 的核心公式
\text{SwiGLU}(x, W_1, W_2) = (\text{Swish}(xW_1)) \otimes (xW_2)
 

进一步,整个 Transformer 的 FFN 层就被改写为:

\text{FFN}_{\text{SwiGLU}}(x) = (\text{Swish}(xW_1) \otimes xW_2) W_3
三:RoPE(Rotary Positional Embeddings ,旋转位置编码)

        苏剑林(Jianlin Su)等人提出的 Rotary Positional Embeddings (RoPE,旋转位置编码),绝对可以载入 Transformer 架构演进的史册。这篇最初在 2021 年引发轰动、最终发表在 2024 年 Neurocomputing 上的论文,用一种极其优雅的数学直觉,彻底终结了“绝对位置编码”与“相对位置编码”长达数年的路线之争。目前,几乎所有最前沿的大模型(包括 Qwen、LLaMA、GLM 等)都在底层的 Attention 层中原生标配了 RoPE。
        核心矛盾:如何在只注入绝对位置信息的同时,让注意力机制天然具备相对位置的感知能力?
        累了,,,歇会继续。。。。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐