Qwen 论文解读:一个 152K 词表,藏着阿里对中文大模型的全部野心
论文:Qwen Technical Report 作者:Jinze Bai, Shuai Bai, Yunfei Chu, Zeyu Cui 等 53 人(阿里云通义实验室) arXiv: 2309.16609,2023年9月28日提交,59页
这不是一篇”我有一个新idea”的论文,而是一份”我把基建干完了”的工程报告。它记录了 Qwen 1.0 从数据清洗到 RLHF 对齐的全流程,覆盖 1.8B、7B、14B 三个尺寸。读这篇论文,你看到的不是学术创新,而是一个大厂团队怎么用工程暴力把中文 LLM 从”能用”推到”好用”。如果你关心中文大模型到底怎么练的,这是绕不过去的一篇。
一、总盘子:Qwen 1.0 到底放了什么出来
先说结论:Qwen 1.0 不只是一个模型,是一个家族。
论文覆盖的模型矩阵长这样:
- 基座模型(Base):Qwen-1.8B、Qwen-7B、Qwen-14B
- 对话模型(Chat):对应的 Chat 版本,经过 SFT + RLHF
- 代码模型:Code-Qwen、Code-Qwen-Chat(7B/14B)
- 数学模型:Math-Qwen-Chat(7B/14B)
说白了,阿里把 OpenAI 那套”基座 + 对齐 + 垂直领域”的产品矩阵,在开源世界复刻了一遍。2023年9月这个时间点,国内开源模型基本还在”放一个 7B 的 base 出来大家玩”的阶段,Qwen 直接甩出一整套,这个格局就不一样。
训练数据方面,论文给出的数字是 2.4 万亿 token。什么概念?LLaMA-2 用了 2 万亿,Qwen 比它多了 20%。而且这 2.4 万亿不是英文为主的——中英文占比接近,还包含代码、数学、百科等多领域数据。这个数据配比,直接决定了 Qwen 在中文任务上的优势不是靠”中文 benchmark 调参”得来的,而是数据层面就赢了。
二、架构:没有花活,但每个选择都有讲究
1. 基本骨架:LLaMA 式 Transformer,但细节不同
Qwen 的架构是标准的 decoder-only Transformer,跟 LLaMA 同宗同源。但有几个关键区别值得注意:
词表大小:152K(准确说是 151,936)。这是全文最值得关注的设计决策。
同期对比:LLaMA 的词表是 32K,LLaMA-2 也是 32K,ChatGLM 是 65K。Qwen 直接干到 152K,是 LLaMA 的将近 5 倍。
为什么要这么大?因为中文。
英文在 BPE 分词下,一个常见单词通常 1-2 个 token。但中文如果用 32K 词表,一个汉字可能被切成 2-3 个 token,一句话的 token 数直接膨胀。152K 的词表让常见汉字和词语都能用单个 token 表示,同样一句中文,Qwen 需要的 token 数远少于 LLaMA。
这意味着什么?同样的上下文窗口,Qwen 能装更多中文内容;同样的训练 token 数,Qwen 实际”读”了更多中文文本。 这是一个看似简单但影响深远的设计决策。
分词器:基于 tiktoken 的 BPE(Byte Pair Encoding,字节对编码),底子是 OpenAI 的 cl100k_base,然后在此基础上扩充了大量中文字符、中文词语、以及日语等其他语言的 token。数字被拆成单个数字 token,这对数学计算有帮助。
2. 注意力机制:RoPE + 选择性 bias
位置编码用的是 RoPE(Rotary Position Embedding,旋转位置编码),这跟 LLaMA 一样,没什么新鲜的。但 Qwen 做了一个有意思的选择:在 QKV 投影中保留了 bias,其他线性层去掉了 bias。
这个设计跟 LLaMA 不同——LLaMA 是全部不要 bias。Qwen 团队保留了注意力层的 bias,可能是实验发现在 QKV 上保留 bias 对效果有正向贡献。这种”不教条”的态度,说明他们真的跑了消融实验,而不是照抄。
3. 归一化和激活函数
- RMSNorm(Root Mean Square Layer Normalization):用在 pre-normalization 位置,即每个子层之前做归一化。这比 post-norm 训练更稳定,也是 LLaMA 的选择。
- SwiGLU(Swish-Gated Linear Unit):激活函数。说白了就是给 FFN 加了个门控,比传统 ReLU/GELU 效果更好,代价是 FFN 参数量多了 50%。
4. 输入输出 Embedding 不共享
Qwen 的输入 embedding 和输出层(LM Head)是独立的,不共享权重。LLaMA-1 是共享的,LLaMA-2 也是共享的。不共享意味着多花一份 embedding 参数的显存,但好处是输入和输出的表示空间不受约束,对生成质量有帮助。在 152K 词表下,这份 embedding 大概有 6 亿参数(152K × 4096),不算小数目。Qwen 愿意为此买单,说明他们更看重效果而不是极致压缩参数。
5. 各尺寸具体参数
| 模型 | 层数 | 隐藏维度 | 注意力头数 | 参数量 |
|---|---|---|---|---|
| Qwen-1.8B | 24 | 2048 | 16 | ~1.8B |
| Qwen-7B | 32 | 4096 | 32 | ~7.7B |
| Qwen-14B | 40 | 5120 | 40 | ~14B |
注意 Qwen-7B 实际参数量是 7.7B,不是刚好 7B。多出来的主要是那份独立的 embedding。
三、上下文扩展:从 2048 到 8192 的骚操作
1. 问题:训练时只有 2048
预训练时,上下文长度是 2048 token。这是当时的主流选择——LLaMA-2 也是 4096,大部分模型都在 2K-4K 这个范围。但用户想要更长的上下文,怎么办?
2. 解法:三件套
Qwen 用了一套组合拳来把上下文从 2048 扩展到 8192,而且不需要重新训练:
第一招:NTK-aware interpolation(NTK 感知插值)
RoPE 的核心思想是:位置信息通过旋转角度编码,角度随位置线性增长。当序列超过训练长度时,角度会超出”见过”的范围。NTK-aware 插值的核心想法是:不是简单地压缩所有频率,而是按频率分组,高频(局部位置信息)少压,低频(全局位置信息)多压。
这比 Position Interpolation(简单线性缩放所有位置)更聪明,因为它保护了局部的细粒度位置信息。
第二招:LogN attention scaling
当序列变长,attention 的 softmax 输入会变大(因为求和项变多了),导致注意力分布变得更”平坦”。LogN 的做法是:把 attention score 除以 log(n),其中 n 是当前序列长度。这是一个很轻量的修复,但确实有效。
第三招:Window attention(局部窗口注意力)
对于特别长的序列,让每个 token 只关注它附近一个窗口内的 token,而不是全局注意力。这降低了计算复杂度,也避免了远距离 token 之间的噪声干扰。
3. 效果
论文给出了 arXiv 数据集上的困惑度(PPL):
| 序列长度 | 有三件套 | 无三件套 |
|---|---|---|
| 2048 | 3.81 | - |
| 8192 | 3.33 | - |
| 16384 | 3.22 | 7.27 |
| 32768 | 3.17 | 181.49 |
没有扩展技术时,16K 长度的 PPL 直接飙到 7.27,32K 更是爆炸到 181。有了三件套,32K 长度下 PPL 依然只有 3.17,甚至比 2048 时还低(因为更长的上下文提供了更多信息)。这个效果相当惊人。
四、数据工程:2.4 万亿 token 是怎么来的
1. 数据来源
论文提到数据来自:网页文本、百科、书籍、代码等。覆盖中文、英文、多语言文本、代码和数学。
这个描述比较笼统——毕竟数据是核心竞争力,不可能全说。但从 2.4T 的量和最终效果来看,可以推断数据质量相当高。
2. 清洗流程
这是论文里比较实在的部分,清洗管线包括:
- HTML 文本提取:从网页中抽取正文
- 语言标注:识别文本语言,过滤非目标语言
- 文本规范化:统一格式、处理乱码
- 精确去重:完全相同的文档只保留一份
- 近似去重:用 MinHash + LSH(局部敏感哈希)找到高度相似但不完全相同的文档,去重
- 质量过滤:结合规则过滤和机器学习模型打分,过滤低质量、不安全内容
这套流程跟 LLaMA、GPT-3 的管线大同小异,但关键差异在于中文数据的质量和数量。国内团队在中文数据获取上有天然优势,这是 Qwen 中文能力强的根本原因。
3. 代码和数学数据
论文特别提到了代码和数学数据的处理。后续 Code-Qwen 用了约 900 亿 token 的代码数据做继续预训练,这个量级在当时的开源代码模型里算很大的了。
五、训练配置:稳扎稳打的工程选择
1. 预训练
- 目标:标准的自回归 next-token prediction
- 上下文长度:2048 token
- 优化器:AdamW,β1=0.9,β2=0.95,ε=10⁻⁸
- 加速:Flash Attention(不占额外显存的精确注意力计算)
- 数据打包:把不同文档 shuffle 后拼接,切成固定 2048 长度的训练样本
学习率调度用的是 cosine schedule,有 warmup 阶段。具体数值论文没有特别强调,但这套配置基本是 2023 年的标准操作。
2. 跟同期对比
说实话,训练配置这块没什么”独门秘籍”。AdamW + cosine schedule + Flash Attention,跟 LLaMA、MPT、Falcon 基本一样。Qwen 的优势不在训练技巧,而在数据量和数据质量。2.4T token 在 2023 年 9 月的开源模型里是第一梯队的。
六、后训练:SFT + RLHF 全流程
1. SFT(监督微调)
SFT 阶段的配置:
- 多风格对话数据(不只是一问一答,还包括多轮对话、创意写作、代码对话等)
- Loss 只算模型回复部分,system prompt 和用户输入不算 loss——这个设计很关键,避免模型去”背诵”用户的输入
- AdamW,β1=0.9,β2=0.95,ε=10⁻⁸
- 序列长度 2048
- Batch size 128
2. RLHF(基于人类反馈的强化学习)
这是论文里技术含量最高的部分之一。
奖励模型训练:
- 先做 偏好模型预训练(Preference Model Pretraining):用成对的回复数据训练模型区分好坏
- 然后用人类反馈数据微调
- 标注体系包含约 6600 个标签,覆盖各种质量维度
- 数据采样策略:按 prompt 多样性和复杂度做平衡采样
PPO 训练:
- 四个模型同时在线:policy model(策略模型)、value model(价值模型)、reference model(参考模型)、reward model(奖励模型)
- 先跑 50 步 value-only 训练,让 value model 先热身
- 每个 query 采样 2 个回复做对比
- KL 系数 0.04:控制模型不要偏离 reference model 太远
- 奖励值用 running average 做归一化
KL 系数 0.04 是一个比较保守的值,说明 Qwen 团队更倾向于”别把模型练歪了”,而不是激进地追求 reward 最大化。这个选择很务实。
3. 效果验证
人类评估用了 300 条中文 prompt,覆盖知识问答、语言理解、创意写作、代码生成、数学推理五个维度。结论:RLHF 模型显著优于纯 SFT 模型。
在自动评测中,Qwen-14B-Chat 在 MMLU、C-Eval、GSM8K、HumanEval、BBH 上超过了同期大部分对比模型,仅次于 ChatGPT 和 LLaMA2-Chat-70B。考虑到 Qwen-14B 只有 14B 参数,而 LLaMA2-Chat-70B 有 70B,这个结果相当能打。
七、垂直领域:代码和数学
1. Code-Qwen
- 基座:Qwen-7B / Qwen-14B
- 继续预训练:约 900 亿 token 的代码数据
- 训练策略:多阶段 SFT
- 评测:HumanEval(pass@1)、MBPP、HumanEvalPack
- 结果:超过同尺寸开源模型,跟 StarCoder 竞争
2. Math-Qwen-Chat
- 基座:Qwen-7B / Qwen-14B
- 数据:扩充的数学指令数据
- 序列长度:1024
- 评测:GSM8K、MATH、Math401、Math23K
- 结果:7B 版超过 Minerva-8B 的 MATH 成绩;14B 版在 GSM8K 和 MATH 上接近 Minerva-62B 和 GPT-3.5
一个有意思的细节:Math-Qwen 在中文数学题上的表现比 Minerva 好不少,因为 Minerva 基本没见过中文数学题。这再次印证了数据决定上限。
3. Agent 能力
论文还提到了工具使用能力:
- 支持 ReAct 框架做工具调用
- 内置 Python 代码解释器,可以做数学计算和数据分析
- 可以调用 Hugging Face 上的多模态模型
- Agent 调优用了 self-instruct 和 in-context learning
这在 2023 年 9 月算是比较前沿的功能了。大部分开源模型还在卷对话质量,Qwen 已经开始布局 Agent 了。
八、Benchmark 全景:数字说话
1. 基座模型对比
| 模型 | MMLU | C-Eval | GSM8K | MATH | HumanEval | MBPP | BBH | CMMLU |
|---|---|---|---|---|---|---|---|---|
| LLaMA2-7B | 46.8 | 32.5 | 16.7 | 3.3 | 12.8 | 20.8 | 38.2 | 31.8 |
| LLaMA2-13B | 55.0 | 41.4 | 29.6 | 5.0 | 18.9 | 30.3 | 45.6 | 38.4 |
| ChatGLM2-6B | 47.9 | 51.7 | 32.4 | 6.5 | - | - | 33.7 | - |
| Baichuan2-7B | 54.7 | 56.3 | 24.6 | 5.6 | 18.3 | 24.2 | 41.6 | 57.1 |
| Baichuan2-13B | 59.5 | 59.0 | 52.8 | 10.1 | 17.1 | 30.2 | 49.0 | 62.0 |
| Qwen-7B | 58.2 | 63.5 | 51.7 | 11.6 | 29.9 | 31.6 | 45.0 | 62.2 |
| Qwen-14B | 66.3 | 72.1 | 61.3 | 24.8 | 32.3 | 40.8 | 53.4 | 71.0 |
几个关键观察:
Qwen-7B 全面碾压 LLaMA2-7B。MMLU 58.2 vs 46.8,差了 11 分;C-Eval 63.5 vs 32.5,差了 31 分。这不是小优势,是代差。
中文能力断层领先。C-Eval 上 Qwen-7B 拿到 63.5,比 Baichuan2-13B(59.0)还高,更别说 LLaMA2-13B 的 41.4 了。
代码能力突出。HumanEval 29.9,比 Baichuan2-7B 的 18.3 高了 11 分。这说明 152K 词表对代码也有帮助(代码中的变量名、关键字能更高效地编码)。
Qwen-14B 越级挑战。14B 参数在 MMLU 上拿到 66.3,跟 LLaMA2-70B(68.9)差距不大。在 C-Eval 上 72.1 甚至超过了很多更大的模型。
2. 评测设置说明
- MMLU:5-shot
- C-Eval:5-shot
- GSM8K:8-shot
- MATH:4-shot
- HumanEval:0-shot
- MBPP:3-shot
- BBH:3-shot
- CMMLU:5-shot
收尾:我的一点看法
说实话,这篇论文读起来不像一篇学术论文,更像一份工程验收报告。它没有提出任何新的架构、新的训练算法、或者新的理论框架。RoPE 是别人的,SwiGLU 是别人的,Flash Attention 是别人的,RLHF 也是别人先做的。但正是这种”不发明轮子,把轮子造到最好”的态度,让 Qwen 1.0 成为了 2023 年下半年最强的中文开源模型。
152K 词表这个决策,回头看是 Qwen 系列最正确的决定之一。它不是一个”看起来牛逼”的创新,而是一个”用了才知道好”的工程选择。中文 token 效率提升带来的好处是全方位的:同样的上下文窗口装更多内容,同样的训练预算学到更多知识,推理时同样的 max_tokens 能生成更长的回复。这个设计一直延续到了 Qwen2、Qwen2.5,证明它经得起时间检验。
但论文也有明显的不足。数据部分写得太模糊——“web texts, books, codes”这种描述等于没说。训练超参数也没有完整列出。RLHF 部分的描述虽然有框架,但很多关键细节(比如偏好数据规模、标注者是谁、质量怎么控制)都是一笔带过。相比之下,LLaMA-2 的论文在 RLHF 部分写得详细得多。这可能是因为 Qwen 论文要覆盖的内容太多(基座 + Chat + Code + Math + Agent),每个部分都只能点到为止。
放在 Qwen 系列演进的大背景里看,1.0 的意义是”打地基”。它证明了阿里有能力从头到尾训一个高质量的中文大模型,建立了数据管线、训练基建、评测体系。后面的 Qwen1.5 加了更多尺寸和 GQA,Qwen2 换了词表结构、去掉了 QKV bias,Qwen2.5 把数据量推到 18T token——但这些都是在这个地基上盖楼。没有 1.0 把路趟出来,后面不可能迭代那么快。
最后一个判断:如果你只能读一篇中文大模型的技术报告来理解”2023年中国团队怎么练模型”,就读这篇。它不花哨,但真实。
附:核心数据速查
模型架构参数
| 参数 | Qwen-1.8B | Qwen-7B | Qwen-14B |
|---|---|---|---|
| 层数 | 24 | 32 | 40 |
| 隐藏维度 | 2048 | 4096 | 5120 |
| 注意力头数 | 16 | 32 | 40 |
| 词表大小 | ~152K | ~152K | ~152K |
| 上下文长度 | 2048(可扩展至8192+) | 2048(可扩展至8192+) | 2048(可扩展至8192+) |
| 位置编码 | RoPE | RoPE | RoPE |
| 激活函数 | SwiGLU | SwiGLU | SwiGLU |
| 归一化 | RMSNorm (pre-norm) | RMSNorm (pre-norm) | RMSNorm (pre-norm) |
| Embedding | 输入输出独立 | 输入输出独立 | 输入输出独立 |
训练配置
| 项目 | 数值 |
|---|---|
| 训练数据量 | 2.4 万亿 token |
| 训练上下文长度 | 2048 |
| 优化器 | AdamW (β1=0.9, β2=0.95, ε=1e-8) |
| 注意力加速 | Flash Attention |
| 数据语言 | 中文、英文、多语言、代码、数学 |
| 去重方法 | 精确去重 + MinHash/LSH 近似去重 |
| SFT batch size | 128 |
| SFT 序列长度 | 2048 |
| RLHF KL 系数 | 0.04 |
| PPO 每 query 采样数 | 2 |
| 奖励模型标签数 | ~6600 |
关键 Benchmark 成绩
| 模型 | MMLU | C-Eval | GSM8K | MATH | HumanEval | BBH |
|---|---|---|---|---|---|---|
| Qwen-7B | 58.2 | 63.5 | 51.7 | 11.6 | 29.9 | 45.0 |
| Qwen-14B | 66.3 | 72.1 | 61.3 | 24.8 | 32.3 | 53.4 |
| LLaMA2-7B(对比) | 46.8 | 32.5 | 16.7 | 3.3 | 12.8 | 38.2 |
| LLaMA2-13B(对比) | 55.0 | 41.4 | 29.6 | 5.0 | 18.9 | 45.6 |
| Baichuan2-13B(对比) | 59.5 | 59.0 | 52.8 | 10.1 | 17.1 | 49.0 |
长上下文扩展效果(arXiv PPL)
| 序列长度 | 有扩展技术 | 无扩展技术 |
|---|---|---|
| 8192 | 3.33 | - |
| 16384 | 3.22 | 7.27 |
| 32768 | 3.17 | 181.49 |
关键概念清单
- RoPE = Rotary Position Embedding,旋转位置编码,通过旋转向量编码相对位置信息
- SwiGLU = Swish-Gated Linear Unit,带门控的激活函数,比 ReLU 效果更好
- RMSNorm = Root Mean Square Normalization,只用均方根做归一化,比 LayerNorm 快
- BPE = Byte Pair Encoding,字节对编码,主流的子词分词算法
- NTK-aware interpolation = 一种改进的 RoPE 外推方法,按频率分组缩放位置编码
- MinHash/LSH = MinHash + Locality-Sensitive Hashing,用于近似文本去重
- SFT = Supervised Fine-Tuning,监督微调,用标注数据教模型对话
- RLHF = Reinforcement Learning from Human Feedback,基于人类反馈的强化学习
- PPO = Proximal Policy Optimization,近端策略优化,RLHF 中最常用的强化学习算法
- KL 系数 = Kullback-Leibler 散度系数,控制 RLHF 模型不偏离原始模型太远
- Flash Attention = 一种 IO-aware 的精确注意力计算算法,不增加显存开销
- ReAct = Reasoning + Acting,一种让 LLM 交替推理和使用工具的 Agent 框架
- GQA = Grouped Query Attention,分组查询注意力,Qwen-72B 中使用(Qwen-7B/14B 未使用)
- C-Eval = 中文综合评测基准,覆盖 52 个学科
- CMMLU = 中文多任务语言理解评测,侧重中国文化知识
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





