训练策略与实践
Q:SFT、蒸馏、GRPO 的技术选型——什么时候用什么?
来源:阿里国际大模型算法一面 【腾讯金融科技一面追问:蒸馏时如何防止小模型学到大模型的错误推理链】
新手答:“数据多就 SFT,数据少就蒸馏。”
高手答:
这三种方法解决的是不同层次的问题,不是简单的“数据多少”能决定的:
| 方法 | 核心作用 | 最适合的场景 |
|---|---|---|
| SFT(监督微调) | 教模型特定格式、领域知识或行为模式 | 有高质量(输入, 输出)标注对,需要格式遵循或领域适配 |
| 蒸馏(Distillation) | 把大模型的能力迁移到小模型 | 有强大的教师模型,需要低成本部署 |
| GRPO/RLHF | 对齐人类偏好,提升推理质量 | SFT 到瓶颈后,需要超越监督学习上限 |
决策框架:
| 条件 | 推荐方法 | 原因 |
|---|---|---|
| 有高质量标注数据 + 格式/领域适配 | SFT | 直接学习目标分布 |
| 有大模型但需要部署到小模型 | 蒸馏 | 保留能力,降低成本 |
| SFT 后效果到瓶颈 + 有奖励信号 | GRPO | 超越监督学习上限 |
| 需要提升推理/数学能力 | GRPO > SFT | RL 探索能发现 SFT 数据中没有的推理路径 |
| 数据量少但质量高 | SFT + 蒸馏 | 先 SFT 对齐格式,再蒸馏压缩 |
为什么推理任务 GRPO 优于 SFT?
SFT 学的是模仿——训练数据里有什么解法,模型就学什么解法,天花板就是数据质量。GRPO 学的是探索——模型自己尝试多种解法,通过奖励信号强化成功路径。对于数学和代码任务,GRPO 能发现训练数据中不存在的新推理路径,这是 SFT 做不到的。
实际工程中的标准流水线:
先 SFT 建立格式和领域基线 → 再 GRPO 推动能力突破 → 最后蒸馏压缩到部署可用的小模型。三者不是互斥的,而是流水线上的不同阶段。
GRPO 训练过程中的关键监控指标:
| 指标 | 健康信号 | 异常信号 |
|---|---|---|
| Reward 均值/标准差 | 均值上升,标准差下降(收敛) | 均值不涨或标准差持续很大 |
| KL 散度 | 保持在可控范围内 | 持续发散,说明偏离参考策略太远 |
| 响应长度 | 稳定或缓慢增长 | 长度暴涨——可能是 reward hacking(模型通过拉长回答来刷分) |
| Pass@k(代码/数学) | 稳步提升 | 停滞说明 reward 信号不够好 |
| 组内 Advantage 方差 | 适中 | 太低说明组大小 G 可能太小,区分度不够 |
差距在哪:新手只考虑数据量这一个维度。高手有系统的决策框架——按任务类型、能力差距和部署约束选择方法,清楚 SFT→GRPO→蒸馏的标准流水线,且知道 GRPO 训练过程中该监控什么。面试官考的是你能不能根据实际场景做技术选型,而不是背方法名。
追问:SFT 为什么不够?什么时候必须上 RL?
来源:快手推荐算法二面
SFT 和 RL 的核心区别是模仿 vs 探索:
| 维度 | SFT | RL(GRPO/PPO) |
|---|---|---|
| 学习方式 | 模仿标注数据中的解法 | 自己探索,奖励信号引导 |
| 天花板 | 训练数据的质量上限 | 可以超越训练数据 |
| 适合任务 | 格式对齐、领域适配、知识注入 | 推理、创造性问题解决、偏好对齐 |
SFT 不够的三个典型场景:
- 训练数据中没有最优解法:数学题的标准答案只有一种解法,但可能存在更优雅的推理路径——SFT 永远学不到数据里没有的东西,RL 能通过探索发现
- 需要对齐人类偏好,而偏好难以显式标注:“哪个回答更好”比“写一个完美回答”容易标注得多——这正是 RL 从偏好对中学习的优势
- 模型已经“会”但不够“精”:SFT 后模型能做对 60% 的题,但剩下 40% 不是“不知道”而是“推理不够严谨”——RL 通过反复尝试和奖励反馈来强化严谨推理
判断是否需要上 RL 的决策标准:
SFT 后评估 → pass@1 和 pass@k 的差距大吗?
差距大(如 pass@1=40%, pass@k=80%):
→ 模型"会"但不稳定,RL 能稳定输出质量 ✅ 上 RL
差距小(如 pass@1=40%, pass@k=45%):
→ 模型根本不会,RL 也救不了 ❌ 先加数据/换模型
pass@1 已经很高(>90%):
→ SFT 已经够了 ❌ 不需要 RL核心洞察:pass@1 和 pass@k 的差距是 RL 价值的最好预测指标——差距大说明模型有潜力但不稳定,RL 的作用就是把 pass@k 的能力稳定到 pass@1。
Q:GRPO 的 Loss 函数、Advantages 计算与信用分配机制
来源:阿里国际大模型算法一面 【阿里国际一面追问:GRPO训练中观测什么指标】
新手答:“就是 RLHF 的 loss。”
高手答:
GRPO 的 Loss 函数看起来和 PPO 类似,但每一项的计算方式都不同:
L_GRPO = -E[min(r(θ)·A, clip(r(θ), 1-ε, 1+ε)·A)] + β·KL(π_θ ∥ π_ref)其中 r(θ) = π_θ(o|q) / π_old(o|q) 是重要性采样比率。
Advantages 的计算——“Group Relative”的含义:
GRPO 名字中的“Group Relative”指的就是 Advantages 的计算方式:
- 对每个 query q,用当前策略采样 G 个响应 {o_1, ..., o_G}
- 用奖励模型(或规则)得到每个响应的奖励 {r_1, ..., r_G}
- 组内标准化:A_i = (r_i - mean(r)) / std(r)
举例:query = "求解 x^2 - 5x + 6 = 0"
采样 5 个响应,奖励分别为 [1.0, 0.0, 1.0, 0.5, 0.0]
mean = 0.5, std = 0.447
A = [1.12, -1.12, 1.12, 0, -1.12]
正 Advantage → 强化(比组内平均好)
负 Advantage → 抑制(比组内平均差)
零 Advantage → 不变(刚好等于平均)为什么用 Advantages 而不是原始奖励?
| 问题 | 原始奖励 | 组内相对 Advantages |
|---|---|---|
| 方差 | 高——简单题高分,难题低分,梯度波动大 | 低——每组内标准化,消除题目难度差异 |
| 基线 | 无——所有正奖励都强化,即使是组内最差的 | 组均值自动充当基线,只强化组内较好的 |
| 方向信号 | 模糊——奖励 0.6 是好是差取决于任务难度 | 清晰——正值就是比同组平均好,负值就是差 |
组内均值本质上等价于 PPO 中 Critic 提供的基线,但不需要训练额外的 Value Model——这正是 GRPO 去掉 Critic 的关键。
信用分配——从序列级奖励到 token 级学习:
GRPO 对整个响应只给一个奖励 R,但梯度更新是 token 级别的。这中间的映射是怎么做的?
通过自回归分解,序列级的 log 概率等于每个 token 的 log 概率之和:
log π_θ(o|q) = Σ_{t=1}^{T} log π_θ(o_t | q, o_{<t})序列级的 Advantage A_i 均匀地乘到每个 token 的 log 概率上。这意味着:
- 高奖励序列 → 序列中所有 token 都被强化
- 低奖励序列 → 序列中所有 token 都被抑制
这是一个粗粒度的信用分配。一个正确的解题过程中可能有几步冗余推理(幸运的错误),一个错误的解题过程中可能有几步是对的——但 GRPO 无法区分。
信用分配粗糙的缓解方式:
| 缓解策略 | 原理 |
|---|---|
| 大组 G + 大量训练步 | 统计上,好 token 被强化的频率始终高于坏 token,长期收敛到正确方向 |
| Token 级 KL 惩罚 | KL 项是逐 token 计算的,对偏离参考策略过大的 token 提供细粒度的纠偏信号 |
| 过程奖励模型(PRM) | 不只给最终结果打分,给每一步推理打分——将信用分配从序列级细化到步骤级(前沿研究方向) |
PPO vs GRPO 信用分配对比:
| 维度 | PPO | GRPO |
|---|---|---|
| Advantage 粒度 | Token 级(GAE 逐步计算) | 序列级(整个响应一个 Advantage) |
| 是否需要 Critic | 是——Critic 提供每步的 V(s) | 否——用组内均值替代 |
| 信用分配精度 | 高——每个 token 有独立的 Advantage | 低——所有 token 共享同一个 Advantage |
| 训练成本 | 高——需要训练和 Policy 同等规模的 Value Model | 低——不需要额外模型 |
GRPO 用信用分配的精度换取了工程上的简洁性——去掉 Critic 后训练成本大幅降低,且实验证明在数学和代码任务上效果不逊于 PPO。
差距在哪:新手把 GRPO 当黑箱,只知道”是 RLHF 的一种”。高手能写出完整的 Loss 函数,解释为什么组内相对 Advantages 能在去掉 Critic 的同时保持方差可控,并清楚 GRPO 信用分配的核心局限(序列级奖励均匀分配到所有 token)以及缓解方法。面试官考的是你对 GRPO 数学细节的理解深度——不是”知道 GRPO 不需要 Critic”,而是”知道为什么不需要、代价是什么”。
追问:GRPO 训练时奖励全 0 或全 1 怎么办?单步就能判对错的题目还需要 GRPO 吗?
来源:快手大模型推荐算法一面 / 美团大模型应用算法一面
全 0 / 全 1 奖励问题——Advantages 退化:
当同一组 G 个采样的奖励全部相同时,std(r) = 0,组内标准化公式 A_i = (r_i - mean) / std 会除零或全部为 0——梯度信号消失,这组样本对训练完全无贡献。
| 情况 | 根因 | 对训练的影响 | 解决方案 |
|---|---|---|---|
| 全 0(全错) | 题目太难,当前策略无法生成正确答案 | Advantages 全 0,无学习信号 | 课程学习:先用简单题热身,逐步增加难度 |
| 全 1(全对) | 题目太简单,任何采样都能做对 | Advantages 全 0,无区分信号 | 移除已”学会”的简单题,动态调整训练集 |
| 同质化 | 组大小 G 太小或 temperature 太低 | 采样多样性不够,容易全同 | 增大 G(如 16→64)+ 提高采样 temperature |
工程上的标准做法:
1. 动态题目过滤:每个 epoch 前预跑一轮评估,移除 pass rate > 0.95 和 < 0.05 的题目
2. 分桶采样:按题目难度分桶,训练时从中等难度桶多采样
3. std 兜底:当 std(r) < ε 时,跳过该组不计算梯度,避免数值不稳定
4. 混合奖励:不只看最终结果对错(0/1),加入格式分、步骤分等连续奖励,增加区分度单步问题是否需要 GRPO?
对于”查 x 的值”这类单步就能判对错的题目,GRPO 仍然有价值,但价值来源不同:
- SFT 只学一条路径:训练数据里怎么解,模型就怎么解。如果数据里的解法对当前模型来说很难模仿,SFT 效率低
- GRPO 探索多条路径:采样 G 个解法,奖励高的强化、低的抑制。即使是单步问题,模型可能有多种表述/格式/中间推理方式,GRPO 能找到当前模型最容易复现的那条
但如果题目真的简单到所有采样都对(全 1 问题),那确实不需要 GRPO——这类题 SFT 就能搞定,用 GRPO 反而浪费算力。判断标准是当前模型在该题上的 pass rate 是否在 0.1-0.9 之间——只有在这个区间内,GRPO 的组内对比才有区分度。
Q:深度学习网络中的「残差连接」解决了什么问题?其物理含义是什么?
来源:字节后端 Agent 开发二面 【淘天Agent开发同题:传统 CNN 痛点 + ResNet 核心思想】
新手答:“解决梯度消失问题。”
高手答:
残差连接(Residual Connection)解决的核心问题是网络退化问题(degradation problem),而不仅仅是梯度消失:
网络退化 ≠ 梯度消失
| 问题 | 表现 | 残差连接怎么解决 |
|---|---|---|
| 梯度消失 | 深层梯度趋近于 0,参数无法更新 | 提供梯度直通通道,跳过非线性层 |
| 网络退化 | 网络越深,训练误差反而越高(不是过拟合) | 让网络学习「残差」而非「完整映射」 |
物理含义——从「学整体」变成「学偏差」
传统网络: 输出 = F(x) # 直接学习目标映射
残差网络: 输出 = x + F(x) # 学习与输入的差异(残差)为什么学残差更容易?如果最优解接近恒等映射(输出 ≈ 输入),传统网络需要让 F(x) ≈ x,这对非线性网络来说很难学;而残差网络只需要让 F(x) ≈ 0,把参数推向零比拟合一个恒等变换容易得多。
在 Transformer 中的关键作用:
Transformer 的每一层都是 LayerNorm(x + Attention(x)) 或 LayerNorm(x + FFN(x)),残差连接贯穿始终。没有残差连接,Transformer 深到 6 层就难以训练。具体作用:
- 梯度高速公路:反向传播时梯度可以通过残差连接直接回传到浅层,不经过注意力层的非线性变换
- 特征保持:每一层在原始特征的基础上「增量修改」,浅层学到的有用特征不会被深层覆盖
- 训练稳定性:即使某一层的学习效果差,残差连接保证输出不会比输入更差(最差情况 F(x) = 0,输出 = 输入)
差距在哪:新手只记住了「解决梯度消失」这个标准答案。高手区分了梯度消失和网络退化两个不同问题,且从「学残差比学完整映射更容易」的角度解释了物理含义。面试官考的是你对深度网络核心设计的理解深度。
Q:设计一个 Text-to-SQL 训练集构建方案——500 条样本覆盖 200+ 查询模式,如何设计数据生产流?
来源:淘天 AI Agent 一面(场景题)
新手答:“让标注团队写 500 条 SQL。”
高手答:
500 条真实标注覆盖 200+ 模式,意味着每个模式平均不到 2.5 条样本——纯靠人工标注不可能覆盖所有模式的变体。必须用真实标注 + 合成数据 + 质量控制的三阶段生产流。
整体数据生产流:
阶段一:种子数据分析
先对 500 条真实标注做分类,理清覆盖现状:
| 查询模式 | 示例 | 真实标注量 | 需合成量 |
|---|---|---|---|
| 单表简单查询 | SELECT name FROM users WHERE age > 30 | 80 条 | 少量 |
| 多表 JOIN | SELECT ... FROM orders JOIN products ON ... | 60 条 | 中等 |
| 聚合 + GROUP BY | SELECT dept, COUNT(*) FROM ... GROUP BY dept HAVING ... | 40 条 | 中等 |
| 嵌套子查询 | SELECT ... WHERE id IN (SELECT ...) | 20 条 | 大量 |
| 窗口函数 | SELECT ..., ROW_NUMBER() OVER (PARTITION BY ...) | 5 条 | 大量 |
| 多条件组合 | WHERE A AND (B OR C) AND D BETWEEN ... | 30 条 | 中等 |
阶段二:合成策略(三种互补)
策略一:模板化合成(覆盖率优先)
模板:"查询 {表名} 中 {条件列} {比较符} {值} 的 {目标列}"
→ SQL:SELECT {目标列} FROM {表名} WHERE {条件列} {比较符} {值}
通过枚举表名、列名、比较符、值的组合,快速生成大量基础样本
优点:100% SQL 合法,生成快
缺点:自然语言表述单一,不够多样策略二:LLM 改写合成(多样性优先)
输入:种子样本 (NL, SQL) + 指令"用 5 种不同的自然语言表述描述同一个查询意图"
输出:5 条不同表述的 NL,对应同一个 SQL
例:
原始:"查询年龄大于 30 的用户姓名"
改写1:"帮我找出超过 30 岁的用户叫什么"
改写2:"30 岁以上的人的名字有哪些"
改写3:"列出年纪在 30 以上的用户"策略三:Schema 驱动合成(复杂模式优先)
输入:数据库 Schema(表结构 + 外键关系)
过程:
1. 随机选择 2-3 张表,根据外键关系确定 JOIN 条件
2. 随机选择聚合函数、WHERE 条件、ORDER BY
3. 组装成合法 SQL
4. 用 LLM 为这条 SQL 生成自然语言描述
优点:能自动覆盖复杂模式(多表 JOIN + 聚合 + 嵌套)
缺点:生成的 NL 需要人工审核阶段三:质量控制
三重校验:
1. SQL 可执行性 → 在真实数据库上 RUN,报错的丢弃
2. 结果合理性 → 查询结果不为空且不是全表(太宽泛的 query 无意义)
3. NL-SQL 一致性 → 用另一个 LLM 做 back-translation:SQL → NL',
比较 NL' 和原始 NL 的语义一致性,不一致的标记人工审核迭代优化闭环:
训练集不是做完就结束——训完模型后还要做错误分析驱动的迭代:
训练模型 → 在验证集上评估 → 收集错误预测
→ 分析错误集中在哪些模式(如 HAVING 子句、嵌套子查询)
→ 针对性合成这些模式的更多样本 → 重新训练 → 验证改进差距在哪:新手想到的是“找人标 500 条”。高手设计了三阶段生产流——种子分析定方向、三种合成策略互补、三重质量校验兜底——且有迭代优化闭环。面试官用这个场景题考的是你面对“数据不够”时的工程化思维——不是“多标点数据”,而是“用最少的真实数据撬动最大的覆盖”。
Q:DP、DDP、TP、PP——分布式训练并行策略的区别与选型?
来源:荣耀大模型算法实习一面
新手答:“多卡就用数据并行。”
高手答:
分布式训练的四种并行策略解决的是不同瓶颈,不是“多卡就行”:
| 并行策略 | 全称 | 切分什么 | 解决什么瓶颈 |
|---|---|---|---|
| DP | Data Parallelism | 数据 | 训练速度(单卡吞吐不够) |
| DDP | Distributed Data Parallelism | 数据 | DP 的通信效率(AllReduce 替代 PS) |
| TP | Tensor Parallelism | 模型层内的权重矩阵 | 单层参数太大,一张卡放不下 |
| PP | Pipeline Parallelism | 模型的层(跨层切分) | 总参数太多,一张卡放不下 |
DP vs DDP——数据并行的两代方案:
DP(PyTorch DataParallel):
主卡聚合梯度 → 主卡更新参数 → 广播到其他卡
问题:主卡成为通信瓶颈,GPU 利用率不均衡
DDP(DistributedDataParallel):
每张卡独立前向+反向 → AllReduce 同步梯度 → 各卡独立更新
优势:无主卡瓶颈,通信与计算可重叠(bucket gradient AllReduce)生产环境只用 DDP,不用 DP——DP 的主卡瓶颈在多卡场景下严重拖慢训练速度。
TP vs PP——模型并行的两种切法:
TP(层内切分):
一个 Attention 层的 Q/K/V 权重矩阵按列切分到多张卡
→ 每张卡算一部分,再 AllReduce 合并
→ 通信频繁(每层都要通信),但延迟低(层内并行)
PP(层间切分):
前 N 层放卡 0,后 N 层放卡 1
→ micro-batch 流水线调度,减少 bubble(空闲等待)
→ 通信少(只在层间边界传激活值),但有 pipeline bubble选型决策框架:
实际大模型训练的三维并行:
训练 70B+ 的大模型时,通常三种并行同时使用:
| 维度 | 策略 | 范围 |
|---|---|---|
| 节点内(同机多卡) | TP | 利用 NVLink 高带宽,适合频繁通信 |
| 节点间(跨机) | PP | 跨机带宽低,PP 通信量小 |
| 全局 | DDP | 在 TP+PP 分组上再做数据并行 |
Megatron-LM 和 DeepSpeed 的 3D 并行就是这个思路:TP 在机内、PP 在机间、DDP 在全局。
差距在哪:新手只知道“多卡数据并行”。高手区分了四种并行策略的适用场景——DP/DDP 解决速度问题,TP/PP 解决显存问题,且知道生产环境的三维并行组合方案。面试官考的是你对大模型训练基础设施的系统性理解。
Q:Token 和字符有什么区别?
来源:淘宝闪购 AI应用研发 一面
新手答:“Token 就是模型切分文字的最小单位,一个词就是一个 token。”
高手答:
Token 和字符是两个不同层次的概念,理解它们的关系对 Agent 开发中的成本估算、上下文管理、Prompt 设计都有直接影响。
字符(Character):人类可读的最小文本单位。一个中文字是一个字符,一个英文字母也是一个字符。
Token:模型处理文本的最小单位。模型不直接处理字符,而是先用 Tokenizer 把文本切分成 token 序列,再转成数字 ID 输入模型。
Tokenizer 的工作原理(BPE 算法):
主流的 Tokenizer 使用 BPE(Byte Pair Encoding)算法——从字符级别开始,统计训练语料中频繁相邻出现的字符对,逐步合并成更大的子词单元。最终形成一个词表(通常 3-10 万个 token)。
英文示例:"unhappiness"
→ ["un", "happiness"] (常见前缀单独成 token)
→ 2 个 token
中文示例:"人工智能"
→ ["人工", "智能"] 或 ["人", "工", "智", "能"]
→ 2-4 个 token(取决于 tokenizer)中英文的关键差异:
| 语言 | 粗略换算 | 原因 |
|---|---|---|
| 英文 | 1 个词 ≈ 1-1.5 个 token | 常见词通常是完整 token |
| 中文 | 1 个字 ≈ 1-2 个 token | 中文字在训练语料中出现频率较低,拆分更细 |
这意味着同样语义的内容,中文消耗的 token 数通常比英文多 30%-50%。
对 Agent 开发的实际影响:
- 成本估算:API 按 token 计费,中文项目成本要比英文项目预估高一些
- 上下文窗口:模型的上下文限制是 token 数而非字数。4K token 对英文是 ~3000 词,对中文是 ~2000-2500 字
- Prompt 设计:同样的 Prompt 中文版比英文版消耗更多 token,需要更注意精简
- Embedding 质量:不同 Tokenizer 对中文的切分粒度不同,影响语义表达的精度
差距在哪:新手停留在”token 是最小单位”的定义。高手从 BPE 编码机制、中英文差异、到对 Agent 开发的实际影响(成本、上下文、Prompt 设计)做了完整的链路分析。面试官考的是你对模型基础设施的理解深度——这直接影响你做 Agent 时的工程决策。
Q:QLoRA 的核心设计思想是什么?和标准 LoRA 有什么区别?
来源:阿里淘天 AI应用开发一面
新手答:「就是量化版的 LoRA。」
高手答:
QLoRA 不是简单地「量化 + LoRA」,而是三项创新协同工作,让单卡消费级 GPU 也能微调 65B 大模型:
三大核心创新:
1. 4-bit NormalFloat(NF4)量化:
- 这是一种信息论最优的 4-bit 数据类型。正态分布的数据(预训练权重近似正态分布),用 NF4 量化比普通 INT4 精度损失更小
- 核心思路:量化区间的划分不是均匀的,而是按正态分布的分位数划分——让数据密集区域获得更高的量化精度
2. 双重量化(Double Quantization):
- 量化需要存储量化常数(scaling factor),每 64 个参数一个常数。65B 模型的量化常数本身占 ~0.5GB
- 双重量化:对量化常数再做一次 8-bit 量化,额外存储开销从 0.5GB 降到 ~0.125GB
- 看起来省的不多,但在显存极度紧张的场景下,每一点都很关键
3. 分页优化器(Paged Optimizers):
- 训练时优化器状态(如 Adam 的一阶/二阶矩)会产生显存峰值
- 分页优化器利用 NVIDIA 统一内存(Unified Memory)机制,当 GPU 显存不足时自动把优化器状态页迁移到 CPU 内存,峰值过后再迁回
- 类似操作系统的虚拟内存分页,对用户透明
核心思想:基础模型权重冻结并压缩到 4-bit 存储,只训练 LoRA 的低秩适配器(仍用 BF16 精度)。前向传播时将 4-bit 权重反量化回 BF16 参与计算,反向传播只更新 LoRA 参数。
QLoRA vs 标准 LoRA 对比:
| 维度 | 标准 LoRA | QLoRA |
|---|---|---|
| 基座权重精度 | FP16/BF16 | NF4(4-bit) |
| LoRA 适配器精度 | FP16/BF16 | BF16(不量化) |
| 65B 模型微调显存 | ~130GB(需多卡) | ~48GB(单卡 A100) |
| 训练速度 | 较快 | 略慢(需反量化计算) |
| 精度损失 | 无 | 极小(NF4 信息论最优) |
| 适用场景 | 有多卡资源的团队 | 资源受限、单卡微调大模型 |
效果:QLoRA 在 65B 模型上只需 ~48GB 显存就能微调,且在多个 benchmark 上效果接近全参数 16-bit 微调——这意味着一张 A100 就能微调最大的开源模型。
差距在哪:新手只知道「量化+LoRA」。高手讲清楚了 NF4 量化的信息论依据、双重量化的存储优化、分页优化器的显存管理三大创新。面试官考的是你对显存优化技术的系统理解。
Q:垂直领域指令微调后,模型通用能力出现退化,怎么解决?
来源:阿里淘天 AI应用开发一面
新手答:「多加点通用数据混着训。」
高手答:
这个问题叫灾难性遗忘(Catastrophic Forgetting),是微调的经典难题——模型在学习新领域知识时,覆盖了原有的通用能力权重。
五种解决方案:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 数据混合(Data Mixing) | 领域数据 + 通用数据按比例混合训练 | 简单有效,工程成本低 | 需要高质量通用数据集,比例需调参 |
| LoRA 而非全参数微调 | 只更新少量参数,对原始能力的破坏更小 | 天然保留大部分原始能力 | 领域适配深度可能不够 |
| 正则化约束(KL 散度) | 在 loss 中加 KL 散度项,约束微调后的模型不要偏离原始模型太远 | 理论优雅,DPO/PPO 中的 reference model 就是这个作用 | 超参数敏感,约束太强会限制学习 |
| 渐进式微调(Progressive Fine-tuning) | 先通用后领域,逐步收窄训练范围 | 平滑过渡,遗忘较少 | 训练流程复杂,耗时更长 |
| 模型合并(Model Merging) | 分别训练领域模型和通用模型,用 TIES-Merging / DARE 等方法合并权重 | 各模型独立训练,灵活组合 | 合并效果不稳定,需要实验调参 |
数据混合的经验比例:领域数据占 70%-80%,通用数据占 20%-30%。通用数据的来源通常是开源的高质量指令数据集(如 OpenHermes、SlimOrca 等)。比例不是固定的——领域和通用的差距越大,通用数据占比应该越高。
正则化约束的具体做法:
L_total = L_SFT(领域数据) + λ · KL(π_θ ∥ π_ref)
π_θ:当前微调中的模型
π_ref:微调前的原始模型(冻结)
λ:约束强度,越大越保守这正是 DPO 和 PPO 中 reference model 的设计动机——不仅是对齐用的,也是防遗忘用的。
模型合并的前沿方法:
- TIES-Merging:只保留变化最大的参数(trim),解决符号冲突(elect sign),再合并。比简单平均效果好很多
- DARE:随机丢弃大部分参数变化(类似 Dropout),只保留少量关键变化做合并。适合合并多个 LoRA 适配器
实际工程选择:大多数团队用「LoRA + 数据混合」组合,性价比最高——LoRA 天然限制参数更新范围,数据混合进一步补充通用能力。只有在需要极深度的领域适配时,才考虑全参数微调 + 正则化约束。
差距在哪:新手只知道混数据。高手给出了五种系统性方案且理解各自 trade-off。面试官考的是你对微调工程全链路的掌控力。
Q:现有的大模型性能为什么这么好?
来源:字节后端 Agent 开发二面
新手答:“参数量大、数据多。”
高手答:
「参数大 + 数据多」是必要条件,但不是充分条件——同样规模的模型性能差异巨大。大模型性能好是多个关键技术突破的叠加效应:
第一层:架构层面的突破
| 设计 | 贡献 |
|---|---|
| Transformer 自注意力 | 彻底解决了序列建模中的长距离依赖问题,任意两个 token 之间的信息传递不需要逐步传递 |
| 残差连接 + LayerNorm | 使超深网络(100+ 层)的训练成为可能 |
| Decoder-only 架构 | GPT 系列证明了自回归预训练的强大泛化能力 |
| 位置编码演进 | RoPE 等旋转位置编码让模型能外推到训练时未见过的序列长度 |
第二层:规模效应(Scaling Laws)
Kaplan 等人(2020)和 Chinchilla(2022)的研究揭示了幂律关系:
损失 正比于 1/N^α + 1/D^β + 1/C^γ
(N=参数量,D=数据量,C=计算量)关键发现不是「越大越好」,而是三者需要同步增长——单独增大参数量但数据量不够,性能提升会饱和。Chinchilla 证明了同等计算预算下,中等模型 + 更多数据 > 超大模型 + 少数据。
第三层:训练方法的演进
| 阶段 | 方法 | 作用 |
|---|---|---|
| 预训练 | 自回归语言建模(next token prediction) | 学习语言的统计规律和世界知识 |
| SFT | 监督微调(指令遵循数据) | 让模型学会「按指令办事」 |
| RLHF/DPO | 对齐人类偏好 | 让输出更安全、更有帮助、更符合人类期望 |
这三阶段的贡献不对等:预训练提供了 90% 的能力基础,SFT 把能力「激活」,RLHF 做「精修」。
第四层:工程层面的突破
- 混合精度训练(BF16/FP16):在精度损失极小的情况下,显存和计算量减半
- FlashAttention:将 Attention 的显存复杂度从 O(N^2) 降到 O(N),使长序列训练成为可能
- 3D 并行(DP + TP + PP):数据并行 + 张量并行 + 流水线并行,支撑万卡规模训练
- 高质量数据清洗:去重、去毒、质量过滤——数据质量比数量更重要
核心认知:大模型的性能不是单一因素的结果,而是架构设计、规模效应、训练方法、工程优化四个维度同时到位的产物。缺少任何一环,同等参数量的模型性能都会大幅下降。
差距在哪:新手只提到参数和数据两个维度。高手从架构、规模定律、训练三阶段、工程优化四个层面系统解释,且点出了各因素的贡献不对等和协同效应。面试官考的是你对大模型技术栈的全局理解。
Q:vLLM 的 PagedAttention 原理是什么?解决了什么问题?
来源:快手AI应用开发一面
新手答:“vLLM 速度快,用了一些优化。”
高手答:
PagedAttention 解决的核心问题是:KV Cache 的内存碎片化和浪费。
背景问题:LLM 推理时,每个请求需要一块连续内存存储 KV Cache(Key-Value 缓存),长度等于序列长度。传统方案预分配最大长度的连续内存块——但实际请求长度不一,导致大量内存碎片和浪费(浪费率可达 60-80%)。
PagedAttention 的核心思想:借鉴操作系统的虚拟内存分页机制——把 KV Cache 拆成固定大小的“页”(block),按需分配,不要求物理连续。
传统方案:每个请求预分配 max_seq_len 的连续内存
→ 短请求浪费大量空间,无法服务更多并发
PagedAttention:KV Cache 分成固定大小的 block(如 16 tokens/block)
→ 按需分配 block,用页表映射逻辑地址到物理地址
→ 不同请求的 block 可以交错存储在 GPU 显存中具体机制:
| 组件 | 作用 |
|---|---|
| Block | 固定大小的 KV Cache 存储单元(如 16 tokens 的 K 和 V) |
| Block Table | 每个序列维护一个页表,记录逻辑 block → 物理 block 的映射 |
| Block Allocator | 管理空闲 block 池,按需分配和回收 |
| Copy-on-Write | 多个序列共享相同前缀时(beam search),共享 block 直到分叉 |
解决的三个关键问题:
- 内存碎片:block 固定大小,无碎片;分配回收都是整 block 操作
- 内存浪费:按需分配,序列结束立即回收;不预分配最大长度
- 并发吞吐:同样的 GPU 显存能服务 2-4 倍的并发请求(因为浪费减少了)
和操作系统虚拟内存的类比:
| OS 概念 | PagedAttention 对应 |
|---|---|
| 虚拟页 | 逻辑 block(序列中的第 i 个 block) |
| 物理页帧 | 物理 block(GPU 显存中的实际存储位置) |
| 页表 | Block Table |
| 缺页中断 | 序列生成新 token 时分配新 block |
差距在哪:新手只知道”vLLM 快”——没有触及原理。高手从 KV Cache 内存问题出发,讲清了分页思想和具体机制,且用 OS 虚拟内存做类比让面试官秒懂。面试官考的是你对推理优化底层原理的理解——不是调参,是理解为什么这个设计能提升吞吐。
Q:GQA 和 MLA 的原理是什么?各自解决什么问题?
来源:阿里国际AI算法一面
新手答:”都是注意力机制的变体,用来加速推理。”
高手答:
GQA 和 MLA 解决的核心问题相同——KV Cache 的显存开销,但思路完全不同:
GQA(Grouped Query Attention)
标准 MHA 中每个 Query Head 有独立的 KV Head(如 32 个 Q Head → 32 对 KV Head)。GQA 的做法是多个 Q Head 共享一组 KV Head:
MHA: 32 Q Heads → 32 KV Heads(全独立)
GQA: 32 Q Heads → 8 KV Groups(每 4 个 Q 共享 1 对 KV)
MQA: 32 Q Heads → 1 KV Head(极端共享)效果:KV Cache 缩小到 1/4(8 组 vs 32 组),推理时显存占用和带宽压力大幅降低。GQA 是 MHA 和 MQA 的折中——MQA 太激进导致质量下降,GQA 在速度和质量间找到平衡。Llama 2/3、Mistral 都用 GQA。
MLA(Multi-head Latent Attention)
DeepSeek-V2 提出的方案,思路更激进:不是共享 KV Head,而是把 KV 压缩到低维隐空间再缓存:
标准 MHA: 缓存完整的 K, V 矩阵 → 显存 O(n * d_model)
MLA: KV → 低秩投影 → 缓存压缩后的 latent → 推理时再解压还原等价于对 KV Cache 做了一次有损压缩,压缩比可达 10x+。而且 MLA 兼容长上下文——即使序列很长,缓存的 latent 体积也远小于完整 KV。
对比选型:
| 维度 | GQA | MLA |
|---|---|---|
| 核心思想 | 共享 KV Head | 压缩 KV 到低维 latent |
| KV Cache 压缩比 | 4-8x | 10x+ |
| 实现复杂度 | 低(改分组即可) | 高(需要额外投影层) |
| 代表模型 | Llama 3, Mistral | DeepSeek-V2/V3 |
| 适合场景 | 通用、工程简单 | 超长上下文、极限显存优化 |
差距在哪:新手只知道”GQA 比 MHA 快”。高手能清晰区分两种方案的压缩思路(共享 vs 低秩投影)、压缩比差异、以及各自的工程取舍。面试官考的是你对注意力机制显存优化的理解深度。
Q:MoE 架构下为什么参数量大但单 Token 推理成本不一定高?
来源:字节春招大模型测开一面
新手答:”因为 MoE 不是所有参数都用到。”
高手答:
MoE(Mixture of Experts)的核心设计是稀疏激活——模型总参数量很大,但每个 Token 只激活其中一小部分专家。
具体机制:
传统 Dense 模型(如 Llama 70B):
每个 Token → 经过全部 70B 参数 → 计算量 = 70B FLOPs
MoE 模型(如 Mixtral 8x7B,总参 47B):
每个 Token → Router 选择 2/8 个专家 → 只经过 ~14B 参数 → 计算量 ≈ 14B FLOPs所以 Mixtral 虽然总参数 47B,但推理时每个 Token 的计算量只相当于一个 14B 的 Dense 模型。这就是”参数大但推理成本不高”的原因。
Router 的工作方式:
- 每个 Token 的隐藏状态经过一个轻量的 Gate Network(通常是一个线性层 + Softmax)
- Gate 输出每个专家的权重分数
- 取 Top-K(通常 K=2)个分数最高的专家
- 只将 Token 送入这 K 个专家计算,其余专家不参与
为什么不是”完全免费”:
- 显存占用仍然大 — 所有专家的参数都要加载到显存(47B 参数都要放进去),只是计算时不全用
- 通信开销 — 分布式部署时,Token 路由到不同 GPU 上的专家需要 All-to-All 通信
- 负载不均衡 — 热门专家过载、冷门专家空闲,需要辅助 Loss 做负载均衡
一句话总结:MoE 用”空间换时间”的思路——花更多显存存储全部专家参数,但每次推理只激活一小部分,从而在保持模型容量大的同时控制单 Token 计算成本。
差距在哪:新手只说”不是所有参数都用”。高手能解释 Router 机制、Top-K 稀疏激活的具体过程,以及显存大但计算小的本质原因。还能指出 MoE 并非没有代价——显存仍然大、通信有开销。面试官考的是你对模型架构的理解是停留在结论层还是机制层。
Q:什么是灾难性遗忘?微调时如何缓解?
来源:字节春招大模型测开一面
新手答:”就是模型学了新东西忘了旧东西。”
高手答:
灾难性遗忘(Catastrophic Forgetting)是神经网络的固有问题:当模型在新任务/新数据上训练时,权重更新会覆盖掉之前学到的知识,导致旧任务性能急剧下降。
为什么会发生:
神经网络的知识存储在权重中,且是分布式存储——同一组权重同时承载多个任务的知识。当新任务的梯度更新这些权重时,旧任务的”记忆”就被破坏了。这不像数据库可以增量写入,更像是在同一块画布上反复覆盖绘画。
大模型微调中的典型表现:
- 垂直领域 SFT 后,模型在通用 benchmark 上分数暴跌
- 学会了新格式/新任务,但之前能做的基础任务(数学、代码、常识问答)退化
- 多轮 RLHF 后模型变得过度安全、回避性强,丧失有用性
缓解方案(按成本从低到高):
- LoRA/QLoRA — 冻结原始权重,只训练低秩增量。原始知识完整保留在冻结参数中,新知识存储在 LoRA adapter 中
- 数据混合(Replay) — 微调数据中混入一定比例的通用数据(如 5-10% 的 pretraining 数据),防止通用能力退化
- 学习率控制 — 用极小的学习率(1e-5 量级)做 SFT,限制权重偏移幅度
- EWC(弹性权重巩固) — 计算每个参数对旧任务的重要性,重要参数的更新幅度受约束
- 模型合并(Model Merging) — 分别微调多个 adapter,最后用 TIES/DARE 等方法合并权重,保留各任务能力
实际工程中最常用的组合:LoRA + 数据混合 + 小学习率。三者叠加基本能解决 90% 的遗忘问题。
差距在哪:新手只知道现象。高手能解释底层原因(权重分布式存储 + 梯度覆盖),并给出分层的缓解方案,且知道实际工程中用哪几招组合最有效。面试官考的是你对微调风险的认知和工程应对。
Q:BF16 与 FP32 精度差异及训练推理选型?
来源:爱奇艺大模型算法岗二面
新手答:”BF16 精度低但快,FP32 精度高但慢。”
高手答:
BF16(Brain Float 16)和 FP32 的核心区别在于位数分配:
FP32: 1 bit 符号 + 8 bit 指数 + 23 bit 尾数 → 高精度,大动态范围
FP16: 1 bit 符号 + 5 bit 指数 + 10 bit 尾数 → 动态范围小,容易溢出
BF16: 1 bit 符号 + 8 bit 指数 + 7 bit 尾数 → 动态范围=FP32,精度有损BF16 的设计哲学:牺牲尾数精度(7 bit vs FP32 的 23 bit),保留完整的指数范围(8 bit)。这意味着:
- 能表示和 FP32 一样大/小的数(不会溢出)
- 但每个数的精度只有 FP32 的 1/65000
为什么大模型训练优先选 BF16 而非 FP16:
FP16 的指数只有 5 bit,动态范围是 [6e-8, 65504]。大模型训练中梯度经常超出这个范围(梯度爆炸/消失),需要额外做 Loss Scaling。BF16 的动态范围和 FP32 相同,无需 Loss Scaling,训练稳定性大幅提升。
选型决策:
| 场景 | 推荐精度 | 原因 |
|---|---|---|
| 预训练 | BF16 混合精度 | 稳定、显存减半、速度翻倍 |
| SFT 微调 | BF16 | 同上,且 LoRA 的小参数量对精度不敏感 |
| 推理服务 | FP16 或 INT8/INT4 | 追求极致速度,量化后精度损失可接受 |
| 科学计算/小模型 | FP32 | 精度要求高,显存不是瓶颈 |
| 梯度累积的 master weights | FP32 | 确保梯度累加不丢精度 |
混合精度训练的标准做法:
前向计算:BF16(快、省显存)
反向计算:BF16(快)
梯度累积:FP32(防精度丢失)
权重更新:FP32 master copy → 转回 BF16 给下一轮差距在哪:新手只知道”低精度快高精度准”。高手能从位数分配角度解释 BF16 vs FP16 的本质区别(指数位相同/不同 → 动态范围差异),且知道混合精度训练中不同阶段用不同精度的原因。面试官考的是你对训练工程细节的掌握程度。
Q:模型推理慢,排查思路是什么?
来源:阿里国际AI算法一面
新手答:”加显卡,或者换小模型。”
高手答:
推理慢的排查需要分层定位瓶颈,不能上来就加硬件。排查顺序从最常见的原因开始:
第一步:确认瓶颈是 compute-bound 还是 memory-bound
- Prefill 阶段(处理输入):compute-bound,瓶颈在算力。输入越长,QKV 计算量越大
- Decode 阶段(逐 token 生成):memory-bound,瓶颈在显存带宽。每生成一个 token 都要加载全部 KV Cache
大部分推理慢的问题出在 Decode 阶段——模型生成很长的输出时特别明显。
第二步:逐项排查优化项是否开启
| 检查项 | 未开启的影响 | 解决方案 |
|---|---|---|
| KV Cache | 每个 token 重复计算历史 | 确认框架默认开启 |
| FlashAttention | Attention 显存 O(N^2),速度慢 | 升级到 FA2/FA3 |
| 量化(INT8/INT4) | 权重读取带宽翻倍 | AWQ/GPTQ 量化后部署 |
| Batching | 每个请求独占 GPU | 开启 Continuous Batching(vLLM) |
| Tensor Parallel | 单卡算力不够 | 多卡 TP 切分 |
第三步:检查系统层面
- 序列长度过长 — 输入 + 输出超过 4K 后 Attention 计算量急剧增长。截断或摘要化输入
- Batch 太大 — 单 batch 占满显存,导致 OOM 降速。调整 max_batch_size
- CPU offload — 显存不足时 KV Cache 被卸载到 CPU,带宽断崖式下降。加显存或减序列长度
- 网络瓶颈 — 多卡 TP 时 All-Reduce 通信慢。检查 NVLink/PCIe 带宽
第四步:Profile 定位热点
PyTorch Profiler / nsys → 哪个 kernel 耗时最长?
常见热点:Attention kernel > MLP > 通信 > 采样一句话总结:先判断 compute 还是 memory bound → 再查优化项是否全开 → 再看系统配置 → 最后 profile 定位具体算子。
差距在哪:新手直接说”换更好的 GPU”。高手有系统化的排查链路,从瓶颈类型判断开始,逐层检查优化开关、系统配置、算子热点。面试官考的是你有没有真正部署过推理服务——只用 API 的人不会碰到这些问题。