2026大模型面试圣经(2):主流大模型架构全景 | GPT/LLaMA/DeepSeek/Qwen深度对比
定位:了解每个主流模型"怎么设计的、为什么这样设计",面试中不只说出名字,还能对比分析。
目标:看完本章,你能画出GPT/LLaMA/DeepSeek的架构图,说清每个设计选择背后的权衡。
模块一:GPT系列架构演进 | 从GPT-1到GPT-4
1.1 核心概念
什么是GPT?
GPT(Generative Pre-trained Transformer)是OpenAI推出的系列模型,核心思想是"在大量文本上做自回归预训练,然后通过prompt引导做各种任务"。
GPT-1(2018):首次证明"预训练+微调"在NLP上的威力。12层Transformer Decoder,117M参数。用BookCorpus做CLM预训练。
GPT-2(2019):证明"大模型+大数据+zero-shot"可行。1.5B参数。关键洞察:不需要微调,prompt就能做任务。
GPT-3(2020):175B参数,ICL的标志性模型。96层、12288维度、96头。训练数据300B tokens。核心发现:few-shot就能做几乎任何任务。
GPT-4(2023):多模态,传闻MoE架构(8个专家,每次激活2个,总参数约1.8T)。
| 代际 | 参数量 | 层数 | 隐藏维度 | 头数 | 上下文 | 核心创新 |
|---|---|---|---|---|---|---|
| GPT-1 | 117M | 12 | 768 | 12 | 512 | 预训练+微调 |
| GPT-2 | 1.5B | 48 | 1600 | 25 | 1024 | Zero-Shot, Pre-Norm |
| GPT-3 | 175B | 96 | 12288 | 96 | 2048 | ICL, Few-Shot |
| GPT-4 | ~1.8T? | ? | ? | ? | 128K | 多模态, MoE |
1.2 原理推导
GPT的预训练目标:Causal Language Modeling (CLM)
L=−∑t=1TlogP(xt∣x<t;θ)\mathcal{L} = -\sum_{t=1}^{T} \log P(x_t | x_{<t}; \theta)L=−t=1∑TlogP(xt∣x<t;θ)
每个token基于前面所有token预测下一个,所有位置都参与loss计算。
ICL(In-Context Learning)为什么有效?
- GPT-3论文的解释:大模型在预训练时隐式学会了"从上下文示例中学习"
- 贝叶斯推理解释(Xie et al., 2022):ICL是在做隐式贝叶斯推理
- 梯度下降视角(Akyürek et al., 2023):Transformer的前向传播等价于在隐式执行梯度下降
- 直觉理解:预训练数据中天然包含"示例→回答"模式
Pre-Norm vs Post-Norm:为什么GPT-2切换到Pre-Norm?
Post-Norm: x → Attn → Add → LN → FFN → Add → LN
Pre-Norm: x → LN → Attn → Add → LN → FFN → Add
数学分析:
- Post-Norm:xl+1=LN(xl+F(xl))x_{l+1} = \text{LN}(x_l + F(x_l))xl+1=LN(xl+F(xl)),梯度经过LN后被归一化,深层梯度消失
- Pre-Norm:xl+1=xl+F(LN(xl))x_{l+1} = x_l + F(\text{LN}(x_l))xl+1=xl+F(LN(xl)),残差直连保证梯度直通,训练更稳定
- 代价:Pre-Norm的最终表示可能"塌缩"到残差通道,需要在最后加一层LN
1.3 代码实现
python
# GPT-2风格的Transformer Block
class GPT2Block(nn.Module):
def __init__(self, d_model, n_heads, d_ff, dropout=0.1):
super().__init__()
self.ln1 = nn.LayerNorm(d_model) # Pre-Norm
self.attn = MultiHeadAttention(d_model, n_heads, dropout)
self.ln2 = nn.LayerNorm(d_model)
self.ffn = nn.Sequential(
nn.Linear(d_model, d_ff),
nn.GELU(),
nn.Linear(d_ff, d_model),
nn.Dropout(dropout)
)
def forward(self, x, mask=None):
x = x + self.attn(self.ln1(x), mask=mask)
x = x + self.ffn(self.ln2(x))
return x
1.4 工程实践
GPT系列的关键工程决策
- GPT-1到GPT-2:从Post-Norm换到Pre-Norm
- GPT-3训练:Model Parallelism+Data Parallelism,约1200万美元
- GPT-4训练:传闻约25000个A100训练约90天
1.5 面试考点精讲
Q1:GPT-1/2/3/4的核心区别?
秒答:GPT-1证明预训练有效,GPT-2证明zero-shot可行,GPT-3证明ICL有效,GPT-4加入多模态和MoE。
展开:最重要的范式转变是GPT-2到GPT-3:从"预训练+微调"变成"预训练+prompt"。一个大模型通过不同prompt就能做所有任务,催生了整个prompt engineering领域。
Q2:GPT-3的175B参数是怎么分布的?
秒答 :96层,每层约1.8B参数。MHA(4d24d^24d2) + FFN(8d28d^28d2) + Embedding。
Q3:GPT-4为什么可能用MoE?
秒答:MoE让总参数量大(知识容量大)但推理时只激活一部分(保持速度)。多个信源证实8专家Top-2架构。
Q4:ICL的理论解释有哪些?Transformer如何隐式实现梯度下降?
秒答:三种主流解释:(1)贝叶斯推理------模型在隐式推断任务分布;(2)梯度下降------Akyürek等人证明线性Attention层的前向传播数学上等价于一步梯度下降,示例相当于"训练数据";(3)任务识别------模型在预训练时见过类似任务模式,ICL本质是模式匹配。
展开 :梯度下降视角最有启发性。对于线性回归任务,单层线性Attention的前向传播可以写成 y^=WOV∑isoftmax(q⋅ki)vi\hat{y} = W_{OV} \sum_i \text{softmax}(q \cdot k_i) v_iy^=WOV∑isoftmax(q⋅ki)vi,这与在示例上做一步GD后的预测数学形式一致。
Q5:GPT-3的训练数据质量控制做了什么?
秒答:(1)用高质量参考语料训练二分类器,对Common Crawl做质量过滤;(2)基于文档间n-gram重叠做模糊去重;(3)用LSH做近似去重;(4)对高质量来源(Wikipedia、书籍)过采样2-3倍。最终从45TB过滤到570GB。
模块二:LLaMA系列 | 开源LLM的标杆
2.1 核心概念
LLaMA-1(2023.02):Meta的开源LLM,证明"高质量数据+充分训练"比盲目增大模型更有效。
关键设计选择:
- RMSNorm + Pre-Norm
- SwiGLU激活
- RoPE位置编码
- 无Bias
LLaMA架构总览
Input tokens
↓
[Embedding (无位置编码)]
↓
┌──────────────────────────────┐ ×N层
│ RMSNorm → GQA + RoPE → Add │
│ RMSNorm → SwiGLU FFN → Add │
└──────────────────────────────┘
↓
[RMSNorm → Linear → Softmax]
↓
Output logits
LLaMA-2(2023.07):2T tokens训练、上下文2K→4K、70B用GQA、推出Chat版
LLaMA-3(2024.04):15T+ tokens、词表128K、上下文128K、405B版本
| 参数 | LLaMA-7B | LLaMA-13B | LLaMA-70B | LLaMA-405B |
|---|---|---|---|---|
| 层数 | 32 | 40 | 80 | 126 |
| 维度 | 4096 | 5120 | 8192 | 16384 |
| 头数 | 32 | 40 | 64 | 128 |
| KV头数 | 32 | 40 | 8 | 8 |
| FFN维度 | 11008 | 13824 | 28672 | 53248 |
2.2 原理推导
RMSNorm vs LayerNorm
LayerNorm:LN(x)=x−μσ2+ϵ⋅γ+β\text{LN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \betaLN(x)=σ2+ϵ x−μ⋅γ+β(需要计算均值和方差)
RMSNorm:RMS(x)=x1d∑i=1dxi2+ϵ⋅γ\text{RMS}(x) = \frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2 + \epsilon}} \cdot \gammaRMS(x)=d1∑i=1dxi2+ϵ x⋅γ(只计算RMS,省去均值和偏移)
优势:计算量减少约10-15%,效果几乎无差别。去掉了re-centering(减均值),只保留re-scaling。
SwiGLU激活函数
SwiGLU(x)=Swish(xW1)⊗(xW2)\text{SwiGLU}(x) = \text{Swish}(xW_1) \otimes (xW_2)SwiGLU(x)=Swish(xW1)⊗(xW2)
其中 Swish(x)=x⋅σ(βx)\text{Swish}(x) = x \cdot \sigma(\beta x)Swish(x)=x⋅σ(βx),⊗\otimes⊗ 是逐元素乘法。
对比普通FFN(2个矩阵)SwiGLU用3个矩阵(W1,W2,W3W_1, W_2, W_3W1,W2,W3),但实验表明在同等参数量下效果更好。PaLM、LLaMA、Qwen都采用。
MHA / MQA / GQA 对比
| 方案 | Q头数 | KV头数 | KV-Cache大小 | 精度 |
|---|---|---|---|---|
| MHA | hhh | hhh | 2×h×dk×L2 \times h \times d_k \times L2×h×dk×L | 最高 |
| MQA | hhh | 1 | 2×dk×L2 \times d_k \times L2×dk×L | 有损失 |
| GQA-g | hhh | ggg | 2×g×dk×L2 \times g \times d_k \times L2×g×dk×L | 接近MHA |
GQA是MHA和MQA的折中:将hhh个Query头分成ggg组,每组共享一对KV头。LLaMA-70B用h=64,g=8h=64, g=8h=64,g=8。
MHA: Q1→KV1 Q2→KV2 Q3→KV3 Q4→KV4 (每个Q有自己的KV)
MQA: Q1→KV1 Q2→KV1 Q3→KV1 Q4→KV1 (所有Q共享1个KV)
GQA: Q1→KV1 Q2→KV1 Q3→KV2 Q4→KV2 (分组共享KV)
RoPE(旋转位置编码)核心思想
将位置信息编码为旋转矩阵,使得 qmTknq_m^T k_nqmTkn 只依赖于相对位置 m−nm-nm−n:
f(q,m)=q⋅eimθf(q, m) = q \cdot e^{im\theta}f(q,m)=q⋅eimθ
在实数域展开为2D旋转:
Rθ(m)=(cosmθ−sinmθsinmθcosmθ)R_\theta(m) = \begin{pmatrix} \cos m\theta & -\sin m\theta \\ \sin m\theta & \cos m\theta \end{pmatrix}Rθ(m)=(cosmθsinmθ−sinmθcosmθ)
对每一对相邻维度应用不同频率的旋转:θi=10000−2i/d\theta_i = 10000^{-2i/d}θi=10000−2i/d
优势:天然编码相对位置、可以通过NTK扩展到更长序列、对长距离衰减有良好特性。
参数量计算(7B为例)
- Embedding: 32000 x 4096 = 131M
- 每层MHA: 4 x 4096^2 = 67M
- 每层FFN(SwiGLU): 3 x 4096 x 11008 = 135M
- 32层: (67M+135M) x 32 = 6464M
- 总计: ~6.7B
2.3 代码实现
python
class LLaMABlock(nn.Module):
def __init__(self, d_model, n_heads, n_kv_heads, d_ff):
super().__init__()
self.norm1 = RMSNorm(d_model)
self.attn = GroupedQueryAttention(d_model, n_heads, n_kv_heads)
self.norm2 = RMSNorm(d_model)
self.ffn = SwiGLU_FFN(d_model, d_ff)
def forward(self, x, freqs_cis, mask=None):
h = x + self.attn(self.norm1(x), freqs_cis, mask)
out = h + self.ffn(self.norm2(h))
return out
2.4 工程实践
LLaMA的核心贡献:证明数据质量和训练充分度比模型大小更重要。7B用1.4T tokens训练,效果优于175B的GPT-3。
2.5 面试考点精讲
Q1:LLaMA相比GPT-3做了哪些架构改进?
秒答:RMSNorm替代LayerNorm、SwiGLU替代GeLU、RoPE替代Learned PE、去掉所有bias。组合效果显著。
Q2:LLaMA-2的Chat版本怎么训练的?
秒答:先SFT(27K高质量数据),再RLHF(PPO),迭代5轮。迭代是关键------每轮用更好模型收集更好数据。
Q3:LLaMA-3相比LLaMA-2的重大变化?
秒答:数据从2T增到15T+,词表32K增到128K,上下文4K增到128K。8B效果接近LLaMA-2-70B。
Q4:RoPE是如何编码相对位置信息的?
秒答 :RoPE对query和key向量按维度对施加不同频率的旋转矩阵。两个位置的内积 qmTknq_m^T k_nqmTkn 只依赖于 (m−n)(m-n)(m−n),天然编码相对位置。频率从低到高覆盖不同尺度的位置信息。
展开 :数学上,⟨f(q,m),f(k,n)⟩=Re[∑iqiki∗ei(m−n)θi]\langle f(q,m), f(k,n) \rangle = \text{Re}[\sum_i q_i k_i^* e^{i(m-n)\theta_i}]⟨f(q,m),f(k,n)⟩=Re[∑iqiki∗ei(m−n)θi]。低频维度编码远距离关系,高频维度编码近距离关系。NTK-aware扩展通过调整base频率实现长度外推。
Q5:LLaMA-3的训练数据策略有什么变化?
秒答:(1)数据量从2T暴增到15T+ tokens;(2)大幅增加代码和数学数据占比;(3)使用质量分类器和去重pipeline更激进过滤;(4)增加多语言数据覆盖。关键洞察:在8B规模上用15T数据over-training,效果接近70B模型用2T数据。
Q6:为什么LLaMA去掉了所有bias?
秒答:实验发现去掉bias对模型质量影响极小,但能减少参数量和计算量。QKV投影去掉bias后矩阵乘法可以更高效地做张量并行(不需要额外broadcast bias)。PaLM也做了同样选择。
2.6 【大厂真题 - 字节/DeepSeek高频】
真题 1:字节跳动 架构岗------"从MHA到GQA减少了KV头数,那它到底是在解决训练瓶颈还是推理瓶颈?如果把GQA用到训练中,会有性能提升吗?"
痛点剖析:考察对计算体系结构(Compute-bound vs Memory-bound)的透彻理解。很多人以为改变网络结构就能全方位加速。
极客解法:
- 核心定性 :GQA纯粹是为了解决推理阶段的显存墙(Memory-bound)问题,对训练阶段(Prefill/训练前向)的速度提升微乎其微。
- 原理解释 :在训练阶段,所有的Token是并行计算的(一个大矩阵乘法 Q×KTQ \times K^TQ×KT),此时是计算密集型(Compute-bound)。显存主要被模型权重和中间激活(Activation)占据,KV Cache根本没存下来,所以GQA省KV显存的优势在训练时发挥不出来。
- 推理阶段的蜕变:但在推理的Decoding阶段(逐字生成),每次只生成一个Token,但要读取前面所有Token的KV Cache。这时的瓶颈变成了算力都在等显存喂数据(Memory Bandwidth Bound)。GQA通过几组Query共享一个KV,把需要读取的KV总量砍掉了几倍甚至几十倍(比如LLaMA3的8倍),极大地缓解了带宽压力,让生成阶段的速度直接起飞,并且允许单卡塞进大几倍的Batch Size。
真题 2:DeepSeek 算法研发------"DeepSeek V3和R1采用了DeepSeekMoE架构,它与传统的Mixtral MoE(Top-2)相比,在路由机制和专家颗粒度上做了什么颠覆性设计?为什么这么做能解决常识知识遗忘问题?"
痛点剖析:考察对MoE演进前沿的追踪,以及"专家协同"与"知识分配"的底层逻辑。
极客解法:
- 细粒度专家(Fine-grained Experts):传统MoE(如Mixtral 8x7B)是8个大专家,选2个激活。这导致一个专家被激活时,带入了大量冗余参数。DeepSeekMoE的理念是**"专家拆碎"**,比如把大专家拆成了256个小专家(也就是单个专家参数量极小),然后每次路由激活Top-8个小专家。相同的激活参数量下,这种细粒度允许模型进行更精细的知识组合(组合爆炸优势)。
- 共享专家路由(Shared Expert Isolation)------解决遗忘的核心 :
- 痛点 :传统MoE中,所有的标点符号、语法连接词("的"、"is")等通用长尾知识,会被迫通过路由分配到某个专家中,这导致该专家被通用知识塞满,无法精专某项技能(Knowledge Collapse)。
- 极客破局 :DeepSeekMoE硬性划出了一块非路由的共享专家(Shared Experts)(比如1个或几个),这部分专家对于每个Token是**必将激活(Always-on)**的。
- 化学反应:模型很快学会把所有通用知识、上下文基础逻辑全都塞给共享专家,而让剩下的256个路由专家彻底"放飞自我",专精于数学、物理、代码等垂直领域。这从根本上隔离了通用知识与领域知识,彻底解决了微调或长文本推理时的常识遗忘(Catastrophic Forgetting)打架问题。
模块三:DeepSeek系列 | MoE与创新架构
3.1 核心概念
**DeepSeek-V2(2024.05)**两大创新:
- MLA(Multi-Latent Attention):把KV压缩成低维latent向量,KV-Cache仅为MHA的5.4%
- DeepSeekMoE:160个细粒度专家+2个共享专家,选6个
DeepSeek-V3(2024.12):
- 671B总参数,37B激活参数
- 256个路由专家+1个共享专家,每个token路由到Top-8个路由专家(加上始终激活的1个共享专家,共9个参与计算)
- 辅助损失无关的负载均衡:用动态bias替代辅助loss
- FP8混合精度训练
- 训练成本仅557万美元
DeepSeek-R1(2025.01):
- 纯RL训练让模型自发学会推理
- GRPO(不需要Critic模型)
3.2 原理推导
MLA核心思想与维度分析
标准MHA每个token缓存:2×nh×dk=2×128×128=327682 \times n_h \times d_k = 2 \times 128 \times 128 = 327682×nh×dk=2×128×128=32768 个数值
MLA压缩流程:
-
压缩:cKV=WDKV⋅xc_{KV} = W_{DKV} \cdot xcKV=WDKV⋅x,cKV∈Rdcc_{KV} \in \mathbb{R}^{d_c}cKV∈Rdc(dc=512≪nhdk=16384d_c = 512 \ll n_h d_k = 16384dc=512≪nhdk=16384)
-
推理时只缓存 cKVc_{KV}cKV(512个数值 vs 32768个,压缩比5.4%)
-
计算时恢复:K=WUK⋅cKVK = W_{UK} \cdot c_{KV}K=WUK⋅cKV,V=WUV⋅cKVV = W_{UV} \cdot c_{KV}V=WUV⋅cKV
标准MHA缓存: [K_1, K_2, ..., K_128, V_1, V_2, ..., V_128] → 32768维
MLA缓存: [c_KV] → 512维
比GQA更灵活------"软压缩"vs"硬共享"。GQA是固定分组共享KV,MLA是学习一个低维投影,信息保留更充分。
辅助损失无关的负载均衡机制(DeepSeek-V3)
传统方法:Ltotal=LLM+α⋅Lbalance\mathcal{L}{total} = \mathcal{L}{LM} + \alpha \cdot \mathcal{L}_{balance}Ltotal=LLM+α⋅Lbalance,α\alphaα太大伤害路由质量,太小负载不均。
V3方法:为每个专家维护一个动态bias bib_ibi
- 每步统计各专家负载 lil_ili
- 负载低于平均 → bib_ibi 增大(吸引更多token)
- 负载高于平均 → bib_ibi 减小
- 路由打分:si′=si+bis_i' = s_i + b_isi′=si+bi,但 bib_ibi 不参与梯度计算
优势:完全不影响主loss的梯度,路由质量不受损。
DeepSeek-R1训练Pipeline
Stage 1: 冷启动SFT → 基础指令跟随能力
↓
Stage 2: 大规模RL(GRPO)→ 模型自发学会推理(涌现CoT)
↓
Stage 3: Rejection Sampling → 收集高质量推理数据
↓
Stage 4: SFT + RL → 最终对齐(格式、安全、有用性)
↓
Stage 5: 蒸馏 → R1-Distill系列(1.5B~70B)
关键发现:Stage 2中模型自发学会了"aha moment"------在推理过程中自我纠错。
DeepSeekMoE
y=∑i=1NsFFNi(s)(x)+∑j=1Kgj⋅FFNrj(r)(x)y = \sum_{i=1}^{N_s} \text{FFN}i^{(s)}(x) + \sum{j=1}^{K} g_j \cdot \text{FFN}_{r_j}^{(r)}(x)y=i=1∑NsFFNi(s)(x)+j=1∑Kgj⋅FFNrj(r)(x)
共享专家提供通用能力,路由专家提供专业能力。
3.3 代码实现
python
class MultiLatentAttention(nn.Module):
def __init__(self, d_model, n_heads, d_compress):
super().__init__()
self.d_k = d_model // n_heads
self.w_dkv = nn.Linear(d_model, d_compress, bias=False)
self.w_uk = nn.Linear(d_compress, n_heads * self.d_k, bias=False)
self.w_uv = nn.Linear(d_compress, n_heads * self.d_k, bias=False)
self.w_q = nn.Linear(d_model, n_heads * self.d_k, bias=False)
self.w_o = nn.Linear(n_heads * self.d_k, d_model, bias=False)
3.4 工程实践
V3的训练效率优化:FP8训练节省约50%显存、DualPipe流水线将bubble率从33%降到10%。
3.5 面试考点精讲
Q1:MLA相比GQA的优势?
秒答:可学习的压缩比硬共享更灵活,压缩率更高(5.4%),精度损失更小。
Q2:DeepSeek-V3为什么不用辅助损失?
秒答:辅助损失会伤害路由质量。V3用动态bias------负载低的专家自动加正bias吸引更多token,不影响主loss梯度。
Q3:DeepSeek-R1的核心创新?
秒答:纯RL训练(不做SFT)也能让模型自发学会推理。用GRPO替代PPO,不需要Critic模型。
Q4:MLA与Linear Attention有什么关系?
秒答:两者都试图降低KV-Cache的开销。Linear Attention用核函数近似softmax消除序列维度的二次复杂度;MLA保留标准softmax Attention,但把KV投影到低维空间。MLA在实践中精度保持更好,因为没有牺牲Attention的表达能力。
Q5:DeepSeek-V3的训练成本为什么只有557万美元?
秒答:三个关键因素:(1)FP8混合精度训练节省约50%显存和计算;(2)DualPipe流水线将bubble率从33%降到10%,GPU利用率极高;(3)MoE架构使得671B总参数只需37B激活参数,等效Dense模型的训练FLOPs远低于同参数量Dense模型。对比GPT-4传闻1亿美元以上的训练成本,V3效率提升了约20倍。
Q6:DeepSeek-V3的FP8训练具体怎么做?
秒答:采用Per-Tensor量化(而非Per-Channel),对GEMM的输入做FP8量化,用E4M3格式存前向激活,E5M2格式存反向梯度。关键trick是保留FP32的master weight做累加,只在矩阵乘法中用FP8。Loss几乎无损失,但训练吞吐提升约40%。
模块四:Qwen系列 | 阿里的全能选手
4.1 核心概念
Qwen-2.5(2024.09):0.5B到72B全系列,18T tokens训练,151K超大词表。
| 特性 | Qwen-2.5 |
|---|---|
| 注意力 | GQA |
| FFN | SwiGLU |
| 位置编码 | RoPE |
| 词表 | 151,643 |
| Bias | QKV有bias |
Qwen-2.5完整参数表
| 规格 | 0.5B | 1.5B | 7B | 14B | 32B | 72B |
|---|---|---|---|---|---|---|
| 层数 | 24 | 28 | 28 | 40 | 64 | 80 |
| 维度 | 896 | 1536 | 3584 | 5120 | 5120 | 8192 |
| Q头数 | 14 | 12 | 28 | 40 | 40 | 64 |
| KV头数 | 2 | 2 | 4 | 8 | 8 | 8 |
| FFN维度 | 4864 | 8960 | 18944 | 13824 | 27648 | 29568 |
Qwen-VL视觉语言模型
- 视觉编码器:ViT-G/14(约2B参数)
- 连接方式:Cross-Attention Resampler,将视觉token压缩到固定数量(256个)
- 支持任意分辨率输入,动态切片后分别编码再拼接
Qwen-Coder代码模型
- 基于Qwen-2.5基座,增加代码数据比例(约40%代码数据)
- 支持128K长上下文,适合大型代码仓库分析
- 在HumanEval/MBPP上与GPT-4接近
4.2 原理推导
大词表的权衡
- 编码效率高:同样文本用更少token→推理更快
- Embedding层参数增大:但对7B+模型影响<5%
YARN位置编码扩展
Qwen使用YARN(Yet Another RoPE Extension)扩展上下文长度:
- 将RoPE频率分成三组:高频保持不变、中频做NTK插值、低频做线性插值
- 加上attention scaling factor补偿长序列的注意力稀释
- 效果:4K训练上下文可以扩展到32K-128K
4.3 工程实践
Qwen的特色能力矩阵:Qwen-Math(数学)、Qwen-Coder(代码)、Qwen-VL(视觉)、Qwen-Audio(音频)
Qwen vs 同级别竞品
| 能力 | Qwen-72B | LLaMA-70B | DeepSeek-V2 |
|---|---|---|---|
| 中文 | 最强 | 一般 | 强 |
| 英文 | 强 | 最强 | 强 |
| 代码 | 强 | 强 | 强 |
| 数学 | 最强 | 一般 | 强 |
| 多模态 | 原生支持 | 需LLaVA | 不支持 |
| 词表大小 | 151K | 128K | 100K |
4.4 面试考点精讲
Q1:Qwen为什么选151K词表?
秒答:提高中文编码效率。32K词表中文每字2-3个token,151K可能1个token。推理快40%+。
Q2:Qwen和LLaMA架构区别?
秒答:基础架构几乎相同,主要差异在词表大小、QKV是否有bias、训练数据的语言分布。
Q3:Qwen的YARN位置编码扩展是什么?
秒答:YARN将RoPE频率分为高、中、低三组分别处理------高频不动、中频NTK插值、低频线性插值,加上attention scaling因子。相比简单线性插值或NTK-aware,YARN在长距离上保持更好的注意力分辨率。
Q4:Qwen-VL如何处理图文混合输入?
秒答:图像经ViT编码后通过Resampler压缩成固定数量的视觉token(256个),与文本token在同一序列中拼接送入LLM。支持任意分辨率------大图先切成多个patch分别编码再拼接,保留空间信息。多图多轮对话也支持。
模块五:MoE架构 | 用更少算力训练更大模型
5.1 核心概念
MoE核心:把FFN替换成多个"专家",每次只激活几个。总参数大(知识多),激活参数少(推理快)。
| 模型 | 总参数 | 激活参数 | 专家数 | Top-K | 共享专家 |
|---|---|---|---|---|---|
| Switch Transformer | 各种 | 各种 | 各种 | 1 | 无 |
| GShard | 各种 | 各种 | 各种 | 2 | 无 |
| Mixtral 8x7B | 46.7B | 12.9B | 8 | 2 | 无 |
| DeepSeek-V2 | 236B | 21B | 162 | 8 | 2 |
| DeepSeek-V3 | 671B | 37B | 257 | 8+1共享 | 1 |
MoE发展脉络
| 阶段 | 模型 | 核心创新 |
|---|---|---|
| 2022 | Switch Transformer | Top-1路由,简化通信 |
| 2022 | GShard | Top-2路由,容量因子 |
| 2024 | Mixtral | 第一个开源高质量MoE |
| 2024 | DeepSeekMoE | 细粒度专家+共享专家 |
| 2024 | DeepSeek-V3 | 无辅助损失负载均衡 |
5.2 原理推导
Router :g(x)=TopK(softmax(Wg⋅x))g(x) = \text{TopK}(\text{softmax}(W_g \cdot x))g(x)=TopK(softmax(Wg⋅x))
负载均衡损失 :Lbalance=N⋅∑i=1Nfi⋅Pi\mathcal{L}{\text{balance}} = N \cdot \sum{i=1}^{N} f_i \cdot P_iLbalance=N⋅∑i=1Nfi⋅Pi
其中 fif_ifi 是专家 iii 实际接收的token比例,PiP_iPi 是所有token对专家 iii 的路由概率均值。
Capacity Factor :每个专家能处理的最大token数 = CF×TNCF \times \frac{T}{N}CF×NT(TTT=总token数,NNN=专家数)。CF=1.25意味着允许25%的不均衡。超出容量的token被丢弃或溢出到其他专家。
Expert Parallelism通信
MoE的All-to-All通信模式:
Step 1: 每个GPU计算所有token的路由决策
Step 2: All-to-All → 把token发送到对应专家所在的GPU
Step 3: 每个GPU上的专家处理分配到的token
Step 4: All-to-All → 把结果发回原始GPU
通信量 = O(batch_size×dmodel)O(\text{batch\size} \times d{model})O(batch_size×dmodel),与专家数无关但与batch大小线性相关。
5.3 代码实现
python
class MoELayer(nn.Module):
def __init__(self, d_model, d_ff, n_experts, top_k):
super().__init__()
self.gate = nn.Linear(d_model, n_experts, bias=False)
self.experts = nn.ModuleList([
SwiGLU_FFN(d_model, d_ff) for _ in range(n_experts)
])
self.top_k = top_k
def forward(self, x):
# x: [batch, seq, d_model]
bsz, seq_len, d = x.shape
x_flat = x.view(-1, d) # [B*S, d]
# 路由计算
logits = self.gate(x_flat) # [B*S, n_experts]
weights, indices = torch.topk(
torch.softmax(logits, dim=-1), self.top_k
)
weights = weights / weights.sum(dim=-1, keepdim=True)
# 稀疏计算(简化版,实际用scatter/gather优化)
output = torch.zeros_like(x_flat)
for i, expert in enumerate(self.experts):
mask = (indices == i).any(dim=-1)
if mask.any():
expert_input = x_flat[mask]
expert_output = expert(expert_input)
# 加权合并
w = weights[mask][indices[mask] == i]
output[mask] += w.unsqueeze(-1) * expert_output
return output.view(bsz, seq_len, d)
5.4 面试考点精讲
Q1:MoE vs Dense模型的优缺点?
秒答:MoE同算力参数更多(知识更多),但显存占用大(总参数要全加载)、通信开销高、训练不稳定。
Q2:路由崩溃是什么?怎么解决?
秒答:所有token路由到少数专家。解决:辅助损失、容量因子限制、Noise Top-K。
Q3:细粒度专家vs粗粒度专家的权衡?
秒答:粗粒度(如Mixtral 8个大专家)实现简单,但每个专家参数多、冗余大。细粒度(如DeepSeek 256个小专家)路由更精准、专业化更强,但通信开销更大、路由不稳定风险更高。DeepSeek的实验表明,同等激活参数下细粒度专家效果更好。
Q4:Shared Expert的作用是什么?
秒答:共享专家(DeepSeek首创)始终被激活,负责处理所有token共有的通用知识(如语法、常识)。路由专家只需学习专业化知识。这解决了"信息冗余"问题------没有共享专家时,每个路由专家都要学习通用知识,浪费容量。
模块六:Scaling Laws | 模型规模的科学
6.1 核心概念
Kaplan(2020):增大模型比增加数据更高效。训练"大而短"的模型。
L(N)=(Nc/N)αN,αN≈0.076L(N) = (N_c / N)^{\alpha_N}, \quad \alpha_N \approx 0.076L(N)=(Nc/N)αN,αN≈0.076
Chinchilla(2022) :模型和数据应等比例增长。NNN和DDD的最优比例约1:20。
L(N,D)=E+ANα+BDβ,α≈0.34,β≈0.28L(N, D) = E + \frac{A}{N^\alpha} + \frac{B}{D^\beta}, \quad \alpha \approx 0.34, \beta \approx 0.28L(N,D)=E+NαA+DβB,α≈0.34,β≈0.28
最优分配:Nopt∝C0.5N_{opt} \propto C^{0.5}Nopt∝C0.5,Dopt∝C0.5D_{opt} \propto C^{0.5}Dopt∝C0.5(CCC=总计算预算)。
Over-Training趋势(2024-2026):故意用远超最优比例的数据训练小模型。
| 模型 | 参数量 | Tokens | 比例 | 策略 |
|---|---|---|---|---|
| GPT-3 | 175B | 300B | 1:1.7 | Kaplan时代 |
| Chinchilla | 70B | 1.4T | 1:20 | Chinchilla最优 |
| LLaMA-1 | 7B | 1.4T | 1:200 | Over-Training |
| LLaMA-3 | 8B | 15T | 1:1875 | 极致Over-Training |
Emergent Abilities(涌现能力)
某些能力在小模型上完全不存在,模型规模超过某个阈值后突然出现:
- CoT推理:~100B参数后出现
- 多步数学推理:~50B参数后出现
- 自我纠错:~100B参数后出现
争议(Schaeffer et al., 2023):涌现可能是评估指标的"幻觉"------用连续指标替代离散指标后,性能增长是平滑的。
6.2 面试考点精讲
Q1:Kaplan和Chinchilla的核心区别?
秒答:Kaplan建议"模型优先",Chinchilla建议"等比增长"。Chinchilla更正确。
Q2:为什么流行Over-Training?
秒答:推理成本>>训练成本。小模型推理便宜,多花训练计算让小模型极致,总ROI更高。
Q3:Scaling Laws对模型训练的具体指导意义?
秒答 :(1)预算分配------给定计算预算,确定最优模型大小和数据量;(2)性能预测------用小规模实验预测大模型的最终loss;(3)超参迁移------μ\muμP可以从小模型直接迁移学习率等超参;(4)ROI估算------评估增大模型/数据的边际收益。
Q4:涌现能力真的存在吗?批评观点是什么?
秒答:Schaeffer et al.(2023)认为涌现是评估指标的"幻觉"------当用精确匹配等离散指标衡量时,小模型部分正确的回答被计为0分,造成"突变"假象。改用连续指标(如BLEU、token-level accuracy)后,性能增长是平滑的。但反对观点认为:对于需要完整推理链的任务(如多步数学),离散指标才能反映真实能力。
模块七:Tokenizer | 大模型的"语言入口"
7.1 核心概念
| 算法 | 核心思想 | 方向 | 代表 |
|---|---|---|---|
| BPE | 反复合并最高频相邻对 | 自底向上 | GPT |
| WordPiece | 按似然选择合并 | 自底向上 | BERT |
| Unigram | 从大词表反复删除低分词 | 自顶向下 | SentencePiece |
| Byte-level BPE | 字节为基础单元做BPE | 自底向上 | GPT-2+, LLaMA |
BPE训练伪代码
Input: 训练语料, 目标词表大小V
1. 初始化词表 = 所有字节(256个) + 特殊token
2. while |词表| < V:
3. 统计语料中所有相邻token对的频率
4. 找到频率最高的pair (a, b)
5. 将所有 "a b" 替换为 "ab"
6. 将 "ab" 加入词表
7. return 词表 + 合并规则
Unigram模型(与BPE对比)
Unigram从大词表开始,反复删除对整体似然影响最小的token:
- 初始化:收集所有高频子串构成超大候选词表
- 打分:每个候选词的unigram概率 P(xi)=count(xi)∑jcount(xj)P(x_i) = \frac{count(x_i)}{\sum_j count(x_j)}P(xi)=∑jcount(xj)count(xi)
- 分词:对输入文本用Viterbi算法找最大概率分词
- 裁剪:删除贡献最小的10-20%候选词,重新估计概率
- 重复直到达到目标词表大小
各模型词表大小对比
| 模型 | 词表大小 | 算法 | 中文效率 |
|---|---|---|---|
| GPT-2 | 50,257 | Byte-level BPE | 低(每字2-3 token) |
| LLaMA-1 | 32,000 | SentencePiece BPE | 低 |
| LLaMA-3 | 128,256 | tiktoken BPE | 中高 |
| Qwen-2.5 | 151,643 | tiktoken BPE | 高(常用字1 token) |
| DeepSeek-V3 | 100,015 | BPE | 中高 |
7.2 面试考点精讲
Q1:BPE和WordPiece区别?
秒答:BPE按频率选择合并,WordPiece按似然增益。BPE更简单。
Q2:为什么用Byte-level BPE?
秒答:以字节为基础天然支持任何语言,无OOV问题。
Q3:如何为特定领域扩展Tokenizer?
秒答:(1)收集领域文本训练新词表;(2)将新词表与原词表合并(取并集或增量训练);(3)扩大Embedding层(新token随机初始化或用子词平均值初始化);(4)需要continue pre-training让模型学会新token的语义。注意不要改变原有token的编码。
Q4:Tokenizer对多语言支持的影响?
秒答:词表中覆盖的语言越多,各语言的编码效率都会降低("fertility"增大)。解决方案:(1)用超大词表(Qwen的151K);(2)增加目标语言训练数据在BPE训练中的比例;(3)确保字节级覆盖作为fallback。一个中文效率差的Tokenizer会让模型推理速度慢2-3倍。
模块八:模型选型指南 | 面试中如何回答"选什么模型"
8.1 选型决策树
需要最强性能?→ GPT-4o / Claude / Gemini
需要本地部署?
├── 多卡(80GB+) → DeepSeek-V3 / LLaMA-405B
├── 单卡80GB → LLaMA-70B-Q4 / Qwen-72B-Q4
├── 单卡40-48GB → LLaMA-70B-Q2 / Qwen-14B
├── 单卡24GB → LLaMA-8B / Qwen-7B
└── 单卡16GB → Qwen-7B-Q4 / Phi-3-mini
按场景选型对比
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 代码生成 | DeepSeek-Coder / Qwen-Coder | 代码专项训练,HumanEval高 |
| 数学推理 | DeepSeek-R1 / Qwen-Math | 推理链能力强 |
| 中文对话 | Qwen-2.5 / DeepSeek-V3 | 中文训练数据占比高 |
| 英文通用 | LLaMA-3 / Mistral | 英文benchmark最强 |
| RAG系统 | Qwen-7B~14B | 性价比高,上下文够长 |
| 多模态 | Qwen-VL / LLaVA | 原生图文理解 |
| 端侧部署 | Phi-3 / Qwen-0.5B | 参数量极小 |
开源模型推理显存估算
| 模型 | FP16显存 | INT8显存 | INT4显存 |
|---|---|---|---|
| 7B | 14GB | 7GB | 4GB |
| 14B | 28GB | 14GB | 8GB |
| 70B | 140GB | 70GB | 35GB |
| 405B | 810GB | 405GB | 203GB |
8.2 面试考点精讲
Q1:为中文客服系统选基座模型?
秒答:Qwen-2.5或DeepSeek,中文强且开源可微调。7B-14B通常够用。
Q2:Dense和MoE怎么选?
秒答:显存充足选MoE(性能好),显存有限选Dense(部署简单)。
Q3:如何评估一个模型是否适合你的业务?
秒答:四步评估法:(1)在公开benchmark上初筛(MMLU、HumanEval等);(2)构建业务评测集(50-200条典型query),人工评分;(3)测试推理延迟和吞吐量,确认满足SLA要求;(4)评估微调潜力------用少量业务数据做LoRA微调看提升幅度。不要只看公开榜单,业务评测集的排名经常和公开排名不同。
Q4:开源vs闭源模型的选择考量?
秒答:选闭源(GPT-4/Claude)的理由------性能最强、无需运维、按量付费起步低。选开源的理由------数据隐私可控、可微调定制、长期成本低(日调用量>10万时)、不依赖外部服务。折中方案:用闭源模型建立baseline和标注数据,训练开源模型替代。
全章总结
| 模块 | 核心知识点 | 面试题数 |
|---|---|---|
| GPT系列 | 演进脉络、ICL、Pre-Norm | 5题 |
| LLaMA系列 | RMSNorm、SwiGLU、GQA、RoPE | 6题 |
| DeepSeek系列 | MLA、MoE、R1、FP8 | 6题 |
| Qwen系列 | 大词表、YARN、VL | 4题 |
| MoE架构 | Router、负载均衡、共享专家 | 4题 |
| Scaling Laws | Chinchilla、涌现能力 | 4题 |
| Tokenizer | BPE、Unigram、多语言 | 4题 |
| 模型选型 | 场景选型、评估方法 | 4题 |
下一章预告:第3章《预训练全流程深度解析》深入预训练的每个环节。