一、前言:大模型面试,究竟在考什么?
如果你正在准备大模型算法工程师、LLM 应用开发工程师或 AI 相关岗位的面试,那么 Transformer、MoE、RLHF 和 DPO 这四个知识点基本绕不开。
很多同学学习大模型时,往往停留在会调用 API、会运行模型、会使用微调框架的阶段。但在技术面试中,面试官更关心的是:
-
Transformer 为什么使用 Attention?为什么要除以 √dₖ?
-
MoE 为什么能够增加模型参数量,却不必同比增加每个 Token 的计算量?
-
RLHF 为什么需要奖励模型?PPO 在其中发挥什么作用?
-
DPO 不需要单独训练奖励模型吗?它与 RLHF 究竟是什么关系?
本文按照「核心思想 → 原理拆解 → 公式理解 → 代码实战 → 面试问答」的顺序,带你系统梳理这四大技术。
二、Transformer:大模型的核心架构
2.1 Transformer 整体架构
Transformer 最初由论文《Attention Is All You Need》提出。与传统循环神经网络不同,Transformer 使用注意力机制建模序列中不同位置之间的关系,能够并行处理序列中的多个 Token。
一个典型的 Decoder-only Transformer 大致由以下部分构成:
输入文本
↓
Tokenizer 分词
↓
Token Embedding + Position Information
↓
┌─────────────────────────┐
│ Transformer Block │
│ │
│ Causal Self-Attention │
│ ↓ │
│ Add & Norm │
│ ↓ │
│ Feed-Forward Network │
│ ↓ │
│ Add & Norm │
└─────────────────────────┘
↓
重复 N 层
↓
LM Head
↓
预测下一个 Token
需要注意:现代大语言模型通常采用 Decoder-only 架构,但并非所有 Transformer 模型都如此。Encoder-only 模型常用于理解任务,Encoder-Decoder 模型则常用于序列到序列任务。
2.2 Self-Attention 的核心原理
Self-Attention 的作用是让每个 Token 根据上下文,动态计算其他 Token 对自身的重要程度。
例如:
我把苹果放进冰箱,因为它需要保鲜。
模型需要结合上下文判断"它"指代什么。注意力机制可以为不同位置的信息分配不同权重,从而帮助模型构建上下文表示。
其核心计算公式为:
Attention(Q,K,V)= Softmax\\left(\\frac{QK\^T}{\\sqrt{d_k}}+M\\right)V
其中:
-
(Q):Query,表示当前 Token 想查询什么信息。
-
(K):Key,表示每个 Token 提供什么匹配信息。
-
(V):Value,表示实际需要聚合的内容。
-
(d_k):Key 向量的维度。
-
(M):注意力掩码。在因果注意力中,未来位置会被屏蔽。
为什么要除以 √dₖ?
假设 Query 和 Key 的各维度相互独立,且均值为 0、方差为 1,那么点积 (QK^T) 的方差会随着维度 (d_k) 增长。
如果直接将较大的点积输入 Softmax,输出可能变得过于尖锐,导致梯度变小、训练不稳定。
除以 (\sqrt{d_k}),可以在上述假设下将点积的方差缩放到约 1,从而改善训练稳定性。
这是大模型面试中非常经典的一道题。
2.3 Multi-Head Attention 为什么有效?
单个注意力头只能通过一组投影矩阵学习一种注意力模式。多头注意力将特征投影到多个子空间,让不同注意力头学习不同类型的关系。
输入 X
↓
线性映射
↓
┌────────┬────────┬────────┐
│ Head 1 │ Head 2 │ Head 3 │
└────────┴────────┴────────┘
↓ ↓ ↓
└────────┼────────┘
↓
拼接 Concat
↓
输出投影 Wₒ
↓
输出
标准多头注意力可写为:
MultiHead(Q,K,V)= Concat(head_1,\\ldots,head_h)W_O
其中:
head_i=Attention(QW_i\^Q,KW_i\^K,VW_i\^V)
需要注意,多头注意力并不是简单地把同一份注意力结果重复多次,而是通过不同的可学习投影,让各个头形成不同的表示。
2.4 为什么大语言模型需要 Causal Mask?
大语言模型通常通过预测下一个 Token 进行自回归训练。
例如,输入:
今天 天气 很
模型学习预测下一个 Token,例如"好"。
训练时不能让前面的位置直接看到未来 Token,否则模型会通过答案泄漏获得不合理的信息。
因果掩码的示意如下:
Token 1 Token 2 Token 3
Token 1 ✓ × ×
Token 2 ✓ ✓ ×
Token 3 ✓ ✓ ✓
其中,✓ 表示允许关注,× 表示禁止关注。
这也解释了为什么训练阶段可以并行计算多个位置的预测,而生成阶段通常仍需要按照 Token 顺序逐步生成。
2.5 Transformer 高频面试题
问题 1:Attention 为什么要除以 √dₖ?
参考答案:随着向量维度增加,Query 和 Key 的点积方差通常会增大,使 Softmax 输出过于尖锐,影响梯度传播。缩放因子用于稳定点积的数值范围。
问题 2:Transformer 为什么比传统 RNN 更适合并行训练?
参考答案:RNN 的隐藏状态依赖前一时刻的计算,存在明显的时间步依赖;Transformer 在训练时可以并行计算序列各位置的注意力和前馈网络。不过,标准全注意力的计算与存储成本会随序列长度呈平方级增长。
问题 3:Transformer 的主要计算瓶颈是什么?
参考答案:对于标准全注意力,注意力矩阵的计算和存储随序列长度 (L) 以 (O(L^2)) 增长;模型中的线性投影和前馈网络也可能占据大量计算。实际瓶颈取决于序列长度、隐藏维度、硬件和实现方式。
问题 4:为什么大模型普遍使用 LayerNorm 或 RMSNorm?
参考答案:归一化能够改善激活值的数值分布,帮助稳定深层网络训练。RMSNorm 省去了均值中心化步骤,计算相对简单,因此被许多现代大模型采用。
三、MoE:为什么参数更多,计算量却不一定同比增加?
3.1 什么是 MoE?
MoE,全称 Mixture of Experts,即混合专家模型。
传统稠密模型中,每个 Token 通常都会经过相同的前馈网络;MoE 则将前馈网络拆分为多个专家网络,并通过路由器选择其中少数专家处理当前 Token。
它的核心思想是:
让模型拥有更多参数,但让每个 Token 只激活其中一部分参数。
典型结构如下:
输入 Token
↓
Router
↓
┌─────┬─────┬─────┬─────┐
│专家1│专家2│专家3│专家4│
└─────┴─────┴─────┴─────┘
↑ ↑
被选中的少数专家
↓
加权合并输出
在常见的 Top-k 路由方案中,Router 会为每个 Token 计算专家分数,再选择得分最高的 k 个专家。
3.2 MoE 的核心计算流程
假设模型有 8 个专家,每个 Token 只选择其中 2 个专家。
路由器首先计算:
p(x)=Softmax(W_rx)
其中,(x) 是 Token 的隐藏状态,(W_r) 是路由器参数,(p(x)) 表示各专家的路由分数。
然后选择 Top-k 专家:
\\mathcal{S}(x)=TopK(p(x),k)
最终将被选中专家的输出进行加权组合:
y=\\sum_{i\\in\\mathcal{S}(x)}g_i(x)E_i(x)
其中:
-
(E_i(x)):第 i 个专家的输出。
-
(g_i(x)):对应专家的路由权重。
-
(\mathcal{S}(x)):被选中的专家集合。
实际模型还可能采用专家容量限制、路由归一化、共享专家等设计,具体实现因模型而异。
3.3 MoE 为什么能够节省计算?
假设有 8 个专家,每个专家的参数量为 1B。
-
所有专家参数总量:8B。
-
每个 Token 激活 2 个专家。
-
被激活的专家参数量约为 2B。
这意味着,专家部分的每 Token 计算量不必与全部专家参数量同比增长。
但必须注意两个区别:
-
总参数量不等于激活参数量。 模型权重仍需要存储或以其他方式访问。
-
MoE 不一定比稠密模型更快。 专家分发、跨设备通信、负载不均衡等开销,可能抵消部分计算优势。
MoE 的价值在于提供更灵活的模型容量与计算预算权衡,而不是无条件降低所有成本。
3.4 为什么 MoE 需要负载均衡?
如果路由器总是将大量 Token 分配给少数专家,就可能出现:
-
部分专家过载,其他专家利用率很低。
-
专家间负载不均衡,影响训练效率。
-
分布式训练中的通信和吞吐量受到影响。
因此,MoE 训练通常会采用负载均衡辅助损失,鼓励专家获得相对合理的 Token 分配。
常见设计会结合专家被分配的 Token 比例与路由概率等统计量,但具体公式取决于模型实现。
3.5 MoE 高频面试题
问题 1:MoE 和稠密模型有什么区别?
参考答案:稠密模型通常会让每个 Token 经过完整的前馈网络;MoE 通过路由机制只激活少数专家,在增加总参数容量的同时,控制每个 Token 的部分计算成本。
问题 2:MoE 的激活参数越少越好吗?
参考答案:不一定。激活专家数量减少可能降低计算成本,但也可能限制模型的有效表达能力。需要结合模型质量、专家规模、路由策略和硬件效率综合评估。
问题 3:MoE 为什么会产生通信开销?
参考答案:在分布式训练中,不同专家可能部署在不同设备上。Token 需要被发送到对应专家,再将结果传回原位置,这会产生数据交换与同步成本。
问题 4:MoE 是不是完全替代稠密模型?
参考答案:不是。MoE 在模型容量与激活计算之间提供了新的权衡,但会增加系统复杂度。稠密模型仍然适用于许多训练和部署场景。
四、RLHF:如何让大模型更符合人类偏好?
4.1 什么是 RLHF?
RLHF,全称 Reinforcement Learning from Human Feedback,即基于人类反馈的强化学习。
预训练模型主要学习从数据中预测下一个 Token,但预测能力强并不意味着模型一定能够遵循指令、回答得有帮助或避免不恰当的输出。
RLHF 的目标是利用人类偏好信号,进一步调整模型行为。
经典的 RLHF 流程通常包括三个阶段:
阶段一:监督微调 SFT
人类示范答案
↓
训练指令模型
↓
得到 SFT Model
阶段二:训练奖励模型 RM
同一问题生成多个回答
↓
人类对回答进行偏好排序
↓
训练 Reward Model
阶段三:强化学习优化
SFT Model 生成回答
↓
Reward Model 评分
↓
PPO 等强化学习算法优化策略
↓
得到偏好对齐模型
需要注意:RLHF 是一类方法,而不是单一算法。上面的流程是经典的基于奖励模型和 PPO 的实现路线。
4.2 为什么需要 SFT?
SFT,即 Supervised Fine-Tuning,监督微调。
预训练模型已经学习了大量语言模式,但未必擅长按照指定格式完成任务。
SFT 使用高质量的指令与示范答案训练模型,使其学习如何理解指令、组织回答并完成目标任务。
例如:
用户:解释什么是 RAG。
示范回答:
RAG 是检索增强生成技术。
它先从外部知识库检索相关内容,
再将检索结果提供给大模型生成答案。
通过大量这样的示范数据,模型逐渐学会按照指令输出有用内容。
4.3 奖励模型 RM 的作用
奖励模型用于判断回答在某个偏好标准下是否更好。
例如,给定同一个问题:
-
回答 A:准确、清晰、遵循指令。
-
回答 B:存在事实错误,且没有回答核心问题。
人类标注者可能更偏好回答 A。训练奖励模型时,可以使用成对偏好数据,让模型学习为更受偏好的回答分配更高分数。
一种常见的 Bradley--Terry 风格奖励模型目标是:
\\mathcal{L}*{RM}= -\\log \\sigma(r* \\phi(x,y_w)-r_\\phi(x,y_l))
其中:
-
(x):输入提示。
-
(y_w):被偏好的回答。
-
(y_l):较不受偏好的回答。
-
(r_\phi):奖励模型输出的分数。
-
(\sigma):Sigmoid 函数。
直观理解:模型需要让优选回答的奖励分数高于较差回答。
4.4 PPO 在 RLHF 中做什么?
PPO,全称 Proximal Policy Optimization,是一种强化学习策略优化算法。
在经典 RLHF 中,语言模型被视为策略模型,根据当前策略生成回答。奖励模型提供偏好评分,PPO 则用于更新策略,使模型更倾向于生成高奖励回答。
但如果只追求奖励分数,模型可能偏离原本的语言分布,甚至利用奖励模型的漏洞生成投机答案。
因此,经典 RLHF 还会使用参考模型与 KL 惩罚等机制,限制策略模型偏离参考策略的程度。
一种示意性目标为:
\\max_\\pi \\mathbb{E}*{y\\sim\\pi(\\cdot\|x)} \\left\[r* \\phi(x,y) -\\beta D_{KL}(\\pi\|\\pi_{ref})\\right
]
这里的 KL 项约束当前策略与参考策略之间的分布差异。实际 PPO 实现还涉及优势估计、价值函数、裁剪目标等细节。
4.5 RLHF 高频面试题
问题 1:为什么预训练模型还需要 RLHF?
参考答案:预训练主要优化语言建模目标,而人类更关注回答是否有帮助、是否符合指令、是否安全。RLHF 利用人类偏好信号,进一步优化模型的行为。
问题 2:奖励模型是如何训练的?
参考答案:通常收集同一提示下多个回答的人类偏好比较数据,使用成对排序损失训练奖励模型,使偏好回答的分数高于非偏好回答。
问题 3:为什么 RLHF 中要加入 KL 惩罚?
参考答案:防止策略模型为了追求高奖励而过度偏离参考模型,降低语言质量退化和奖励投机的风险。KL 惩罚的强度需要根据任务和训练稳定性进行调整。
问题 4:PPO 和奖励模型是什么关系?
参考答案:奖励模型提供评分信号,PPO 使用该信号优化语言模型策略。奖励模型负责评价,PPO 负责策略更新,两者不是同一个模块。
五、DPO:不训练独立奖励模型,也能进行偏好优化?
5.1 什么是 DPO?
DPO,全称 Direct Preference Optimization,即直接偏好优化。
DPO 的核心思路是:利用偏好数据,直接优化语言模型,使其提高对偏好回答的相对概率,而降低对非偏好回答的相对概率。
与经典的 RLHF + PPO 流程相比,DPO 可以绕过单独训练奖励模型并执行在线强化学习的步骤,使用相对简单的偏好学习目标训练模型。
但这不代表 DPO 不涉及任何奖励建模思想。DPO 的理论推导利用了 KL 约束下的最优策略形式,将隐式奖励与策略概率联系起来。
5.2 DPO 的训练数据是什么?
DPO 通常使用偏好对数据:
{
"prompt": "什么是 Transformer?",
"chosen": "Transformer 是基于注意力机制的神经网络架构。",
"rejected": "Transformer 只是一种数据库查询工具。"
}
其中:
-
prompt:用户输入或任务指令。
-
chosen:更受偏好的回答。
-
rejected:不太受偏好的回答。
模型训练的目标不是单纯让 chosen 的概率变大,而是让 chosen 相对于 rejected 的概率优势更符合偏好信号,并通过参考模型约束优化幅度。
5.3 DPO 的核心公式
DPO 的常见损失函数为:
\\begin{aligned} \\mathcal{L}*{DPO}=-\\mathbb{E}\\bigg\[ \\log\\sigma\\bigg(\\beta\\bigg( \&\\log\\frac{\\pi* \\theta(y_w\|x)} {\\pi_{ref}(y_w\|x)}\\ -\&\\log\\frac{\\pi_\\theta(y_l\|x)} {\\pi_{ref}(y_l\|x)} \\bigg)\\bigg)\\bigg
\end{aligned}
]
其中:
-
(\pi_\theta):正在训练的策略模型。
-
(\pi_{ref}):固定的参考模型。
-
(y_w):偏好回答。
-
(y_l):非偏好回答。
-
(\beta):控制相对参考模型偏离程度的温度或缩放参数。
可以把这个公式理解为三个步骤:
-
计算模型对 chosen 和 rejected 的回答对数概率。
-
分别减去参考模型对应回答的对数概率,衡量相对参考模型的变化。
-
使用 Sigmoid 和负对数目标,让偏好回答的相对优势更大。
这里的回答概率通常是自回归语言模型对回答 Token 的条件概率乘积,对应的对数概率则是各 Token 对数概率之和。实际训练中要正确处理提示与回答的 Token 边界和损失掩码。
5.4 DPO 和 RLHF 有什么区别?
| 对比维度 | 经典 RLHF + PPO | DPO |
|---|---|---|
| 偏好数据 | 通常需要 | 通常需要 |
| 独立奖励模型 | 经典流程需要 | 标准流程不需要 |
| 强化学习策略更新 | 使用 PPO 等算法 | 直接使用偏好损失 |
| 训练复杂度 | 通常较高 | 通常较低 |
| 参考模型 | 常用于约束策略 | 标准目标中通常使用 |
| 在线采样 | 经典流程常涉及 | 常规 DPO 可使用离线偏好数据 |
| 主要挑战 | 奖励建模、训练稳定性、采样成本 | 偏好数据质量、分布外泛化、优化稳定性 |
需要强调,DPO 并不保证在所有任务上效果优于 PPO。最终表现取决于偏好数据、基础模型、训练配置和评测标准。
5.5 DPO 高频面试题
问题 1:DPO 为什么不需要单独训练奖励模型?
参考答案:DPO 利用 KL 约束强化学习目标下的最优策略形式,将隐式奖励与策略相对参考模型的概率比联系起来,进而直接从偏好对构建可优化的损失函数。
问题 2:DPO 中为什么需要参考模型?
参考答案:参考模型提供基准概率分布,帮助衡量当前模型相对原始策略的变化。它也与 KL 约束下的理论推导有关,能在一定程度上抑制模型过度偏离参考策略。
问题 3:DPO 中的 β 是什么?
参考答案:β 控制损失中相对参考模型的概率差异的缩放。在常见参数化下,β 会影响优化对偏好差异的响应程度以及模型相对参考模型的偏离。具体效果还取决于损失实现和训练配置。
问题 4:DPO 是不是完全不需要强化学习?
参考答案:DPO 通常不需要像 PPO 那样显式执行强化学习策略更新,但其目标来自带 KL 约束的奖励优化理论。因此更准确的说法是:DPO 采用直接偏好优化方式,绕过经典 PPO 训练流程。
六、代码实战:使用 Transformers 实现简单的注意力计算
理解原理后,建议至少能够手写一个简化的注意力模块。下面使用 PyTorch 实现缩放点积注意力,帮助理解 Q、K、V、Softmax 和因果掩码之间的关系。
import math
import torch
import torch.nn.functional as F
def scaled_dot_product_attention(q, k, v, causal=False):
"""
q: [batch, heads, seq_len, head_dim]
k: [batch, heads, seq_len, head_dim]
v: [batch, heads, seq_len, head_dim]
"""
head_dim = q.size(-1)
# 1. 计算注意力分数
scores = torch.matmul(q, k.transpose(-2, -1))
scores = scores / math.sqrt(head_dim)
# 2. 添加因果掩码,禁止关注未来位置
if causal:
seq_len = q.size(-2)
mask = torch.triu(
torch.ones(
seq_len, seq_len,
device=q.device,
dtype=torch.bool
),
diagonal=1
)
scores = scores.masked_fill(mask, float("-inf"))
# 3. Softmax 得到注意力权重
weights = F.softmax(scores, dim=-1)
# 4. 加权聚合 Value
output = torch.matmul(weights, v)
return output, weights
if __name__ == "__main__":
batch_size = 2
heads = 4
seq_len = 8
head_dim = 16
q = torch.randn(batch_size, heads, seq_len, head_dim)
k = torch.randn(batch_size, heads, seq_len, head_dim)
v = torch.randn(batch_size, heads, seq_len, head_dim)
output, weights = scaled_dot_product_attention(
q, k, v, causal=True
)
print("输出形状:", output.shape)
print("注意力权重形状:", weights.shape)
预期输出:
输出形状: torch.Size([2, 4, 8, 16])
注意力权重形状: torch.Size([2, 4, 8, 8])
这段代码展示了核心计算过程,尚未包含完整 Transformer 的线性投影、残差连接、归一化、前馈网络、Dropout 和高效注意力内核。
进一步实战时,可以尝试:
-
将因果注意力改成双向注意力。
-
可视化注意力权重矩阵。
-
实现多头注意力中的 Q、K、V 线性映射。
-
在小型语言模型中接入该模块,完成下一个 Token 预测任务。
七、四大知识点的对比与串联
Transformer、MoE、RLHF、DPO 并不是四种互相替代的技术,它们解决的是不同层面的问题。
| 技术 | 核心问题 | 关键机制 | 典型关键词 |
|---|---|---|---|
| Transformer | 如何建模上下文、生成 Token | Self-Attention、FFN | QKV、Mask、Multi-Head |
| MoE | 如何增加模型容量并控制激活计算 | Router、Expert、Top-k | 稀疏激活、负载均衡 |
| RLHF | 如何利用人类反馈优化模型行为 | 偏好数据、奖励模型、PPO | Reward Model、KL、Advantage |
| DPO | 如何直接从偏好对优化模型 | 策略概率比、偏好损失 | Chosen、Rejected、Reference Model |
可以用一句话记住它们的关系:
-
Transformer:决定模型如何处理上下文。
-
MoE:决定模型如何稀疏地激活不同专家。
-
RLHF:通过人类偏好信号与强化学习优化模型行为。
-
DPO:通过偏好数据直接优化策略模型。
一个实际的大模型系统可以采用 Transformer 作为主体架构,也可以在部分前馈网络中使用 MoE;模型完成预训练后,还可以通过 SFT、RLHF 或 DPO 等方法进行后训练。
八、面试前必须掌握的 12 个问题
建议先独立回答下面这些问题,再对照正文查漏补缺。
-
Self-Attention 的 Q、K、V 分别是什么?
-
Attention 为什么要除以 √dₖ?
-
Multi-Head Attention 与单头注意力有什么区别?
-
Causal Mask 为什么不能让模型看到未来 Token?
-
Transformer 的计算复杂度为什么会受到序列长度影响?
-
MoE 中 Router 的作用是什么?
-
MoE 为什么存在负载不均衡问题?
-
激活参数量与总参数量有什么区别?
-
RLHF 为什么通常先进行 SFT?
-
奖励模型如何使用偏好比较数据训练?
-
PPO 与奖励模型各自承担什么职责?
-
DPO 为什么可以不训练独立奖励模型?参考模型和 β 又有什么作用?
准备面试时,不要只背诵定义。最好能够做到三个层次:先用通俗语言解释概念,再写出关键公式,最后结合一个实际场景说明设计原因与潜在问题。
九、总结:如何高效准备大模型面试?
如果你的目标是大模型算法岗,可以按照下面的顺序复习:
第一阶段:掌握 Transformer 的 Attention、位置编码、Norm、残差连接和训练目标。
第二阶段:理解 MoE 的路由策略、稀疏激活、负载均衡和分布式通信。
第三阶段:掌握 SFT、奖励模型、PPO、KL 约束与 RLHF 的完整流程。
第四阶段:推导 DPO 的核心损失,理解偏好数据、参考模型和超参数之间的关系。
第五阶段:通过 PyTorch 实现注意力模块,阅读一个开源模型的模型结构代码,并尝试使用真实偏好数据完成小规模实验。
最后提醒:大模型面试真正考察的不是你记住了多少术语,而是你能否讲清楚原理、公式背后的动机、工程上的权衡,以及方法的适用边界。
把这四个知识点串联起来,你就能从单纯的概念记忆,逐步过渡到对大模型架构、训练和对齐方法的系统理解。