MiniMax AI Infra 实习 一面 (2)
Q: 介绍你熟悉的大模型架构?
主流大模型架构以 Decoder-only Transformer 为主(GPT系列的选择被后续工作验证为最优),关键变体包括:
LLaMA系列(Meta):
- RoPE位置编码:旋转位置编码,通过旋转矩阵将位置信息注入attention,天然支持相对位置且可外推
- RMSNorm(替代LayerNorm):去掉均值中心化只做方差归一化,减少15%计算量且训练更稳定
- SwiGLU激活:
SwiGLU(x) = Swish(xW₁) ⊙ (xW₃),比ReLU/GELU效果更好但多一个权重矩阵 - GQA(Grouped Query Attention):多个query head共享一组KV head,LLaMA-2用8组KV head(32/4=8)
- Pre-Norm(Norm在attention/FFN之前)
DeepSeek-V3(DeepSeek):
- MLA(Multi-head Latent Attention):将KV投影到低维latent空间存储,推理时解压。KV Cache大小仅为
latent_dim * seq_len(如512维 vs GQA的数千维) - DeepSeekMoE:细粒度专家(256个小专家)+ 共享专家(1-2个始终激活),每token选top-8路由专家
- Multi-Token Prediction:辅助训练头同时预测未来多个token,提升训练效率,推理时可复用做speculative decoding
- FP8混合精度训练:大规模使用FP8加速训练
- Auxiliary-loss-free load balancing:通过bias项而非loss项实现路由均衡
Qwen(阿里):
- 类LLaMA架构基础 + 多模态扩展(Qwen-VL/Qwen-Audio)
- 支持超长上下文(Qwen-2.5支持128K)
- 使用YaRN做RoPE长度外推
核心架构选择维度对比:
| 模块 | 选项 | 代表模型 | 特点 |
|---|---|---|---|
| 注意力 | MHA/GQA/MQA/MLA | GPT-4/LLaMA/PaLM/DeepSeek | MLA最省显存,GQA最平衡 |
| FFN | 标准/SwiGLU/MoE | GPT/LLaMA/Mixtral | MoE容量大计算少 |
| 位置编码 | RoPE/ALiBi/Learned | LLaMA/BLOOM/GPT | RoPE是当前主流 |
| 归一化 | LayerNorm/RMSNorm | GPT/LLaMA | RMSNorm更快更稳定 |
| 归一化位置 | Pre-Norm/Post-Norm | 主流/原始Transformer | Pre-Norm训练更稳定 |
Q: 为什么MoE架构能在参数规模继续扩大时保持训练效率?
MoE的核心优势在于解耦了模型容量(总参数量)和计算成本(激活参数量):
计算成本分析:
- 假设模型有E个专家,每token激活top-k个:实际计算的FLOPs ≈ Dense模型的
k/E倍 - 例如DeepSeek-V3:256个专家选8个,FFN部分计算量仅为Dense的 8/256 = 3.125%
- 加上共享专家和非FFN部分,总计算量约为等参数Dense模型的 30-40%
为什么这行得通(不损失质量)?
- 条件计算(Conditional Computation):不同token激活不同专家,每个专家专精于特定类型的输入,ensemble效应提升质量
- 参数冗余假设:Dense模型中大部分参数对特定输入是”休眠”的,MoE只是让这种稀疏性显式化
- Scaling Law的延续:Google的研究表明MoE模型的loss与总参数量和计算量都满足power law,但相同loss下计算量更少
具体数值对比:
- GPT-3 175B Dense:训练需要 3.14 × 10²³ FLOPs
- Mixtral 8x7B(46.7B总参/12.9B激活):质量接近LLaMA-70B,但训练/推理计算量仅约等于13B Dense模型
- DeepSeek-V3 671B(37B激活):训练仅用2.788M H800 GPU小时,远低于同等质量的Dense模型
MoE的代价:
- 显存占用仍然与总参数量成正比(所有专家都需要加载)
- AllToAll通信开销(Expert Parallelism)
- 路由不均衡导致部分GPU负载高、部分空闲
- 微调困难(活跃专家子集不确定)
Q: MoE的路由机制和负载不均问题?
路由机制的实现:
1 | # 简化的路由过程 |
负载不均的根本原因——马太效应(Rich-get-richer):
- 初始阶段某些专家因随机初始化在某些token上表现稍好
- 路由网络学到这个偏好→更多token被路由到这些专家
- 更多训练数据→这些专家进一步优化→更强
- 最终部分专家处理绝大多数token(过载),部分专家几乎不被选择(塌缩/死亡专家)
负载不均的危害:
- 计算效率低:Expert Parallelism中,负载高的GPU成为瓶颈,其他GPU空等
- 容量浪费:死亡专家占用显存但不贡献模型能力
- 训练不稳定:严重不均时loss可能spike
量化评估:通常用 Load Balance Factor = max_tokens_per_expert / avg_tokens_per_expert 衡量,理想值为1.0
Q: 如何优化低专家利用率的路由策略?
1. 辅助负载均衡Loss(Auxiliary Load Balancing Loss):
- Switch Transformer提出的经典方法:
L_aux = α * N * Σᵢ(fᵢ * pᵢ)- fᵢ = 被分配到专家i的token比例
- pᵢ = 路由到专家i的平均概率
- 惩罚路由概率与实际分配的乘积偏离均匀分布
- α通常取0.01-0.1,过大会损害模型质量
2. Expert Choice路由(EC路由):
- 反转选择方向:不是token选专家,而是专家选token
- 每个专家选择affinity最高的top-k个token处理
- 天然保证均匀负载(每个专家处理固定数量的token)
- 缺点:某些token可能不被任何专家选中(需要特殊处理)
3. 无辅助损失方法(Auxiliary-loss-free,DeepSeek-V3):
- 为每个专家维护一个可学习的bias项,加到路由分数上
- 训练过程中根据负载情况动态调整bias:负载低的专家bias增大,负载高的减小
- 不引入额外loss项,避免对主任务优化的干扰
4. 容量因子(Capacity Factor)+ 溢出重路由:
- 设定每个专家的最大容量 =
CF * (总token数 / 专家数),CF通常取1.0-1.5 - 超出容量的token被丢弃或重新路由到次优专家
- 简单有效但可能丢失信息
5. 其他策略:
- Random routing:在top-k之外随机选择一个专家(增加探索)
- Hash routing:用确定性hash函数分配token(完美均衡但不可学习)
- Shared Expert:始终激活的共享专家处理通用模式,路由专家处理特化模式
Q: SFT和RLHF的本质区别?为什么SFT后仍需RLHF?
本质区别:
| 维度 | SFT | RLHF |
|---|---|---|
| 学习方式 | 最大似然(模仿学习) | 策略优化(奖励最大化) |
| 目标 | “像人一样说” | “说得让人满意” |
| 信号 | token级(每个位置的正确答案) | 序列级(整条回答的质量评分) |
| 数据需求 | 高质量问答对 | 偏好对比数据(好 vs 坏) |
| 覆盖范围 | 只学见过的回答方式 | 能泛化到新场景的偏好判断 |
为什么SFT后仍需RLHF?
分布偏移(Exposure Bias):SFT在teacher forcing下训练,但推理时是自回归的。训练和推理的分布不同导致误差累积。RLHF直接在自回归生成的分布上优化
无法覆盖所有场景:SFT数据再多也无法穷举所有可能的输入-输出对。RLHF通过奖励模型学到通用的偏好判断,能泛化到训练数据未覆盖的场景
多样性与安全性的平衡:SFT倾向于学习数据中最频繁的模式(mode-seeking),可能学到有害内容。RLHF可以明确惩罚有害输出
开放式任务的评价困难:创意写作、代码生成等任务没有唯一正确答案,SFT的最大似然目标不适合。RLHF通过人类偏好信号指导这类开放式优化
拒绝/安全行为:SFT教模型”如何回答”,RLHF教模型”什么时候拒绝回答”——后者本质上是一个reward optimization问题
Q: RLHF中PPO的核心优化目标和目标函数解释?
PPO目标函数:
1 | L_PPO = E[min(r(θ) * A, clip(r(θ), 1-ε, 1+ε) * A)] - β * KL(π_θ || π_ref) |
各项详解:
**r(θ) = π_θ(a|s) / π_old(a|s)**:新旧策略的概率比
- r(θ) > 1:新策略比旧策略更倾向于选择该动作
- r(θ) < 1:新策略比旧策略更不倾向于选择该动作
- r(θ) = 1:新旧策略相同
A(Advantage):优势函数估计
- A > 0:该动作比平均好→应增大其概率
- A < 0:该动作比平均差→应减小其概率
- 通常用GAE(λ)计算:
A_t = Σ(γλ)^l * δ_{t+l},δ为TD error
**clip(r(θ), 1-ε, 1+ε)**:裁剪机制(ε通常取0.1-0.2)
- 当A > 0时:即使新策略大幅增加了好动作的概率(r >> 1),也被clip到1+ε
- 当A < 0时:即使新策略大幅减少了坏动作的概率(r << 1),也被clip到1-ε
- 效果:形成信赖域(trust region),防止策略单步更新过大导致崩溃
min操作的含义:取裁剪前后目标的较小值
- 形成”悲观”估计:对好的更新保守(clip上界),对坏的更新也保守(clip下界)
- 确保无论哪个方向的更新都不会太激进
**β * KL(π_θ || π_ref)**:KL惩罚项
- π_ref是SFT后的初始策略(冻结的参考模型)
- 防止策略偏离参考模型太远导致reward hacking(找到奖励模型的漏洞获得高分但实际质量差)
- β通常取0.01-0.1,可自适应调整
在LLM RLHF中的具体形式:
- State = 已生成的前缀 tokens
- Action = 下一个token的选择
- Reward = 奖励模型对完整回答的打分(通常只在最后一个token处给出)
- Episode = 一次完整的回答生成
Q: 手撕:实现滑动窗口最大值?
(编程题)