大家好,2026年了,大模型(LLM)已经成为技术圈的“空气和水”。从年初爆火的OpenAI o1到国产之光Qwen2.5,大家都在惊人的AI推理能力和博学程度。但你有没有想过,一个空壳的神经网络,是如何通过吞食海量文本,最终进化能够上知天文、下知地理的“数字生命”成的?
很多人把大模型的生命周期分为“预训练、后训练(姿势/调整)”。如果说姿势是大学里的专业深造,推理是参加工作,那么**预训练(预训练)**就是最核心的“义务教育”。今天,我将结合Qwen2.5这个开源顶流,带大家手撕预训练的核心算法,从Tokenizer到Attention,一次性讲透大模型是如何“炼”成的。
一、引言:为什么“预训练”决定了模型的上限?
在生成式人工智能的世界里,预训练是整个生命周期中展开的最大、也是最神秘的阶段。
简单来说,预训练的目标是:让模型在没有任何人工标注的情况下,通过“阅读”数万亿个Token,学会人类语言的统计规律、逻辑关系甚至常识知识。 目前的顶尖模型(Qwen2.5、DeepSeek-V3、Llama) 3.1)在预训练阶段都采用了**自回归(Autoregressive)**方法——即通过前面预测下一个词。设想这个简单的任务,在海量算力和数据的加持下,最终引发了智能的“认知”。
二、技术原理:大型模型“基座”的核心图
大模型的架构并非一成不变,但目前全球已趋向于一种标准答案:Decoder-only(纯解码器)架构。
2.1 架构之争:为什么Decoder-only成为唯一选择?
早期的 Transformer 包含 Encoder(编码器)和 Decoder(解码器)。但现在,GPT、Llama、Qwen 全部收敛到了 Decoder-only 架构。
- 推理效率: 仅解码器架构可以天然复用KV-Cache(键值缓存)。在多轮对话中,模型不需要重复计算之前已经生成的Token,这在工程上极大提升了生成速度。
- 训练优势: 相比于Encoder-Decoder,仅Decoder在处理超大规模数据集时,通过自回归预测下一个词的任务,能够更自然地学习到泛化能力。
2.2 Tokenizer:AI的“翻译官”
计算机不认识文字,它只认识数字。Tokenizer(分词器)就是将文本转化为数字(Tokens)的工具。
Qwen2.5采用了字节级BPE(B-BPE) 算法。
- 核心逻辑: 它不是按空格分词,也不是按字符分词,而是根据频率不断合并空格出现的字节对。
- 优势: Qwen2.5 拥有 15 万+ 的超大词表,编码中文的效率极高。同理,Qwen 编码出的 Token 数量通常比 GPT-4o 更少,这意味着同样在的内部,它可以处理更多的信息。
2.3 位置编码:从绝对到旋转(RoPE)
神经网络本身是感知不太顺序的,为了让模型知道“猫追老鼠”和“老鼠追猫”的区别,必须加入位置编码。
Qwen2.5采用了目前最火的RoPE(Rotary Position Embedding,旋转位置编码) 。
- 解读理解: 想象一个钟表,我们将每个Token映射作为一个向量,其位置信息通过“旋转”这个向量的角度来体现。
- 相对性: 这种旋转变换的精妙之处在于,两个运算点积的结果只取决于它们的相对位置。这使得模型在处理超长文本(如128K长度)时表现得非常清晰。
2.4 归一化:RMSNorm的“极简主义”
为了保证模型在训练时不“炸机”(突然爆炸或消失),我们需要对神经元的输出进行归一化。Qwen2.5放弃了传统的LayerNorm,采用了RMSNorm。它省去了计算均值的步骤,只保留了平方根归一化,计算更简单,性能却更好。
2.5 注意力机制:从MHA到GQA
注意力机制(Attention)是大模型的大脑。Qwen2.5为了在速度和性能间取得平衡,使用了GQA(Grouped-Query Attention) 。
- MHA(多头话题): 每个人(查询)都有自己的笔记本(键/值),太占内存。
- MQA(多查询话题): 所有者都拥有一台笔记本,虽然节省了内存,但很容易记错信息。
- GQA(背包查询焦点): 折中方案。几个人共享一台笔记本。这是 Qwen2.5 能够以极度快速生成文字的关键。
三、实践步骤:手部分带你跑通预训练逻辑
了解了原理,我们要如何在工程上实现它?以下是基于PyTorch的核心模块拆解。
第一步:实现旋转位置编码(RoPE)
RoPE是目前LLM的标配。我们通过计算sin和cos矩阵来旋转查询和密钥。
Python
arduino
体验AI代码助手
代码解读
复制代码
import torch
def apply_rotary_pos_emb(q, k, cos, sin):
# q, k: (Batch, Heads, Seq_len, Head_dim)
# cos, sin: (1, 1, Seq_len, Head_dim)
# 辅助函数:执行半旋转
def rotate_half(x):
x1, x2 = x[..., :x.shape[-1] // 2], x[..., x.shape[-1] // 2:]
return torch.cat((-x2, x1), dim=-1)
# 核心公式:q_rotated = q*cos + rotate_half(q)*sin
q_embed = (q * cos) + (rotate_half(q) * sin)
k_embed = (k * cos) + (rotate_half(k) * sin)
return q_embed, k_embed
第二步:配置分组查询主题(GQA)
在 Qwen2.5 中,num_key_value_heads通常缺少num_attention_heads。
Python
ini
体验AI代码助手
代码解读
复制代码
# 核心逻辑:将 Key 和 Value 的头数通过 repeat 扩展到与 Query 相同
def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
batch, num_key_value_heads, slen, head_dim = hidden_states.shape
if n_rep == 1:
return hidden_states
# 使用 expand 避免真实数据复制,节省内存
hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
在实际进行预训练或大规模负载时,单机性能往往捉襟见肘。如果需要高性能的 NVIDIA H800 或 A800 集群,且希望省去普通驱动安装和 NCCL 网络调优的麻烦,推荐尝试Lab4AI 算力云平台。他们针对 Qwen、Llama 等主流模型提供了深度优化的镜像,支持一键拉取多重环境,并提供闲时算力优惠,立即很高。
第三步:计算模型参数量(炼丹师的必修课)
在动手之前,你得算出你的卡能不能装下这个模型。以Qwen2.5-72B为例,其层数L=80L=80L=80,隐层维度H=8192H=8192H=8192。
计算公式如下:
Total_Params≈V⋅H+L⋅(4⋅H2+3⋅H⋅H′)Total\_Params \approx V \cdot H + L \cdot (4 \cdot H^2 + 3 \cdot H \cdot H')Total_Params≈V⋅H+L⋅(4⋅H2+3⋅H⋅H′)
这里H′H'H′是 FFN 层的中间维度。对于 Qwen2.5-72B,由于采用了 GQA,Attention 部分的参数量减少了,为了补偿性能,Qwen 调大了H′H'H′的比例。计算结果约为72.7B,完全符合官方数据。
四、效果评估:如何验证AI的“学习成绩”?
预训练是一个既复杂又昂贵的过程,我们如何知道模型没有跑偏?
4.1 困惑度(Perplexity, PPL)
这是快速模型预测能力的金标准。PPL越低,说明模型对下面的预测越有把握。在曲线训练中,如果PPL持续下降且未出现明显波动,说明“义务教育”进行得非常顺利。
4.2 知识储备与 Benchmark 足球
现在的 2B、7B 等小模型,往往不是“原始”训练的,而是通过知识增加从 72B 甚至更大的模型那里学习 Logits(概率分布)。评估时,我们会使用:
- MMLU: 综合知识评估。
- GSM8K: 数学逻辑推理。
- HumanEval: 编程能力测试。
五、总结与展望
大语言模型预训练已经从“暴力堆力算”进入到了“精细化架构优化”的阶段。从Qwen2.5的架构中我们可以看到:
- GQA + FlashAttention已经取得了性能模型的标配。
- RoPE为处理长文本提供了数学上的优雅。
- RMSNorm + SwiGLU进一步压榨了前馈网络的表现。
未来展望:
随着OpenAI o1等强化训练学习模型的出现,未来的预想可能会更多地融入“思考”过程,而不仅仅是预测下一个Token。
想要快速复现文中的算法,或者针对特定行业语料进行预演?推荐使用**LLAMA-Factory Online**工具链。它内置了Qwen2.5的算子支持,通过可视化界面即可配置本文提及的各种超参数,极大降低了“炼丹”的假设。
博主结语:
预训练是大模型最迷人的地方——它让我们亲眼见证了“量变引起质变”。如果你在实现modeling_qwen2.py源码时遇到了具体的Bug,或者对算力选型有疑问,欢迎在评论区留言,我们一起调试!
关注我,带你深度拆解更多AI底层黑科技!