微调与对齐训练
Q:DPO、PPO、GRPO 的区别和优缺点?
来源:阿里 AI Agent 开发一面 / 腾讯 AI 应用开发 / 字节 Agent 实习二面 【阿里国际一面追问:重要性采样在策略差异大时失效 + GRPO vs PPO KL散度区别】
新手答:“都是对齐方法,PPO 用 RL,DPO 不用。”
高手答:
先说大背景:强化学习在大模型中的核心应用是对齐(Alignment)——让模型从“能生成”变成“生成得好”。经典路线是 RLHF(Reinforcement Learning from Human Feedback),即先用人类偏好数据训练一个 Reward Model,再用 RL 算法(如 PPO)优化策略模型。后来 DPO、GRPO 分别从不同角度简化了这条路线。
三者都是大模型对齐的训练方法,核心区别在于奖励信号的来源、数据形态和工程复杂度:
| 维度 | PPO | DPO | GRPO |
|---|---|---|---|
| 训练范式 | 在线强化学习 | 离线偏好优化 | 在线组相对优化 |
| 是否需要 Reward Model | 是(单独训练) | 否(隐式从偏好中学) | 否(组内相对奖励) |
| 是否需要 Critic | 是(Actor-Critic) | 否 | 否 |
| 数据需求 | 实时采样 | 离线偏好对数据 | 实时采样 |
| 训练复杂度 | 高(4 个模型) | 低(1 个模型) | 中(无 Critic) |
PPO(Proximal Policy Optimization):
- 经典在线 RL 方法。训练时模型实时生成回答,Reward Model 打分,用打分信号更新策略
- 需要同时维护 Actor、Critic、Reward Model、Reference Model 四个模型,显存和计算开销大
- 用 clip 机制限制策略更新幅度,防止训练不稳定
- 优点:在线采样能持续探索,效果天花板高;缺点:训练复杂度高,调参困难
DPO(Direct Preference Optimization):
- 核心洞察:把 Reward Model 的训练和策略优化合并成一步,直接从人类偏好对(chosen vs rejected)中学习
- 数学上证明了 DPO 的最优解和 RLHF(PPO)的最优解等价,但绕过了显式的奖励建模
- 优点:训练简单,只需要一个模型,像做 SFT 一样简单;缺点:离线方法,依赖静态偏好数据,无法在线探索
GRPO(Group Relative Policy Optimization):
- DeepSeek 提出。每个 prompt 采样一组回答(比如 8 个),用组内相对排名作为奖励信号——不需要外部 Reward Model,也不需要 Critic
- 比 PPO 轻量(去掉了 Critic),比 DPO 灵活(在线采样)
- 特别适合数学、代码等有明确对错判断的场景——组内相对奖励天然支持“有标准答案”的任务
PPO: query → model → output → reward model → policy update(4 个模型)
DPO: query → chosen/rejected pair → 直接优化(1 个模型)
GRPO: query → N 个候选 → 组内相对排序 → 优化(无 Critic)PPO vs GRPO 深度对比(高频追问):
以下是算法面试中围绕 PPO 和 GRPO 最常见的深度追问:
1. 重要性采样(Importance Sampling)为什么需要?
PPO 和 GRPO 都用旧策略 π_old 采样,用新策略 π_θ 更新。如果不做修正,旧策略的采样分布和新策略的目标分布不匹配,梯度估计有偏。重要性采样通过比率 r(θ) = π_θ(a|s) / π_old(a|s) 来修正这个偏差。
追问:新旧策略差别很大时,重要性采样还有用吗?
不行。当 π_θ 和 π_old 差别过大时,重要性权重 r(θ) 的方差会爆炸——个别样本的权重极大,梯度估计变得不稳定。这正是 PPO 引入 clip 机制的原因:
L_clip = min(r(θ) · A, clip(r(θ), 1-ε, 1+ε) · A)把 r(θ) 截断在 [1-ε, 1+ε] 范围内(通常 ε=0.2),防止单步更新跨度过大。GRPO 同样使用 clip,并额外加 KL 惩罚作为双重保险。
2. GRPO 的 KL 散度和 PPO 的 KL 散度一样吗?
不完全一样。
| 对比 | PPO | GRPO |
|---|---|---|
| KL 约束方式 | 主要靠 clip 隐式约束,部分实现加 KL penalty | 显式 KL 惩罚项,直接加入 loss |
| KL 参考分布 | KL(π_θ ∥ π_old) | KL(π_θ ∥ π_ref),π_ref 通常是 SFT 后的初始策略 |
| 作用 | 防止策略更新过快 | 防止策略偏离 SFT 基线太远(防止”忘记”对齐能力) |
关键区别:PPO 的 KL 是相邻迭代之间的约束(π_θ vs π_old),GRPO 的 KL 是和固定参考策略的约束(π_θ vs π_ref)。GRPO 的 KL 更像一个”锚”,始终拉着模型不要偏离初始对齐状态太远。
3. On-policy vs Off-policy
| 方法 | 类型 | 原因 |
|---|---|---|
| PPO | On-policy(但有 off-policy 近似) | 用当前策略采样,重要性采样修正后可复用少量旧数据 |
| GRPO | On-policy | 每次用当前策略 π_θ 采样 G 个响应,计算组内相对奖励 |
| DPO | Off-policy | 直接用离线偏好数据训练,不需要在线采样 |
PPO 和 GRPO 本质都是 on-policy(需要当前策略的采样),但 PPO 通过重要性采样可以在一批数据上做多个 epoch 的更新,这是一种”温和的 off-policy 近似”。GRPO 也类似。纯 off-policy 方法是 DPO——直接用预先收集的偏好数据。
4. PPO 中 Advantages 是怎么得到的?(GAE)
PPO 用 GAE(Generalized Advantage Estimation) 计算 Advantages:
δ_t = r_t + γ · V(s_{t+1}) - V(s_t) // TD 误差
A_t^GAE = Σ_{l=0}^{T-t} (γλ)^l · δ_{t+l} // 加权求和
γ:折扣因子(通常 0.99)
λ:GAE 系数(通常 0.95),控制偏差-方差权衡GAE 需要一个价值函数 V(s) 来计算 TD 误差——这就是 PPO 需要训练 Critic 网络的原因。GRPO 的核心创新正是去掉了 Critic,用组内相对排名代替,从而避免了训练一个和 Policy 同等规模的 Value Model 的巨大开销。
差距在哪:新手只记了”用不用 RL”这一个区别。高手从训练范式、数据形态、工程复杂度三个角度做了完整对比,且说清了每种方法的设计动机和适用场景。面试官想看的是你理解了本质差异,而不只是记了名字。
追问:DPO 不需要在线采样的核心原因是什么?标准 DPO 训练数据长什么样?
来源:阿里淘天 AI应用开发一面
为什么 DPO 不需要在线采样:
PPO 的训练循环是:模型生成回答 → 奖励模型打分 → 用打分信号更新策略。这个「模型生成回答」就是在线采样——每一步都要用当前策略跑一遍推理,成本极高。
DPO 的核心洞察:奖励函数可以被隐式地表示为策略的函数。Bradley-Terry 偏好模型告诉我们,如果已知人类偏好数据(哪个回答好、哪个差),可以直接优化策略使其对齐偏好,绕过显式奖励模型。数学上,DPO 把奖励建模和策略优化压缩成了一个 loss:
L_DPO = -log σ(β × (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)))不需要奖励模型,不需要在线采样,只需要离线的偏好对数据。
标准 DPO 训练数据格式:
| 字段 | 说明 | 示例 |
|---|---|---|
| prompt | 用户输入 | 「解释量子计算的基本原理」 |
| chosen (y_w) | 人类偏好的好回答 | (准确、清晰的回答) |
| rejected (y_l) | 人类不偏好的差回答 | (含幻觉或啰嗦的回答) |
每条数据是一个三元组 (prompt, chosen, rejected)。数据质量的关键不是数量,而是 chosen 和 rejected 之间的差距要有意义——如果两个回答质量差不多,模型学不到有效信号。
追问:DPO 的 chosen/rejected 数据实际怎么生成?常见的坑?
来源:美团Keeta Agent开发一面
三种生成 chosen/rejected 对的方法:
| 方法 | 流程 | 优点 | 缺点 |
|---|---|---|---|
| 人工标注 | 标注员对同一 prompt 的多个回答排序 | 质量最高 | 成本极高,标注一致性难保证 |
| 模型自生成 + 打分 | 用模型生成 N 个回答,用奖励模型或规则打分选最好/最差 | 可大规模生产 | 打分器本身可能有偏差 |
| 拒绝采样(Rejection Sampling) | 用强模型生成 chosen,用弱模型/未对齐模型生成 rejected | 差距明确 | 强弱差距太大时,模型学到的信号太浅 |
常见的坑:
- chosen 和 rejected 差距太小:两个回答都还行,只是措辞不同——模型学不到有意义的偏好信号,训练 loss 不下降
- chosen 和 rejected 差距太大:一个完美一个胡说——模型只学会了「不要胡说」这种过于简单的信号,对细粒度质量提升没帮助
- 标注不一致:不同标注员对同一对数据的偏好判断不同,导致训练信号矛盾
- 领域偏移:通用偏好数据训练的 DPO 模型在垂直领域(如医疗)表现差——领域内「什么算好回答」的标准和通用场景不同
最佳实践:控制 chosen/rejected 的质量梯度——理想状态是 chosen 比 rejected 好一个明确的档次(如事实正确 vs 含一个事实错误),而非好太多或差不多。
Q:微调方法有哪些?LoRA 和全参数微调的区别?怎么选?
来源:阿里 AI Agent 开发一面 / 字节 Agent 实习一面
新手答:“LoRA 省显存,全参数效果好。”
高手答:
主流微调方法按参数更新范围分三类:
| 方法 | 原理 | 参数量 | 显存 | 适用场景 |
|---|---|---|---|---|
| 全参数微调 | 直接更新所有参数 | 100% | 大,需要多卡 | 需要深度改变模型行为 |
| LoRA | 在原始权重旁插入低秩矩阵,只训练新增参数 | 0.1%–1% | 小 | 领域适配、指令跟随、工具调用格式对齐 |
| QLoRA | LoRA + 4-bit 量化基座模型 | 同 LoRA | 更小(单卡 24GB 可微调 65B) | 资源受限时的首选 |
| Prefix Tuning | 在每层 Attention 前插入可训练的虚拟 token | <0.1% | 极小 | 轻量级任务适配、多租户场景 |
| Adapter | 在 FFN 层后插入小型瓶颈网络 | 1%–5% | 较小 | 多任务共享基座 |
LoRA vs 全参数微调的核心对比:
| 维度 | LoRA | 全参数微调 |
|---|---|---|
| 原理 | 在原始权重旁插入低秩矩阵,只训练新增参数 | 直接更新所有参数 |
| 参数量 | 通常只有原模型的 0.1%–1% | 100% |
| 显存 | 小,适合消费级 GPU | 大,需要多卡 |
| 训练速度 | 快 | 慢 |
| 任务切换 | 方便,换 adapter 即可 | 每个任务一个完整模型 |
| 适用场景 | 领域适配、指令跟随、工具调用格式对齐 | 需要深度改变模型行为的场景 |
LoRA 的核心优势不只是“省显存”,而是方便任务切换和多租户部署——同一个基座模型挂不同 adapter,就能服务不同场景。
怎么选:
- 数据量大(万级以上)+ 要深度改变模型行为 → 全参数微调
- 数据量中等 + 领域适配 / 格式对齐 → LoRA(当前最主流)
- 资源极度受限(单卡消费级 GPU)→ QLoRA
- 需要多任务快速切换 → LoRA / Adapter(换 adapter 不换基座)
- 只做轻量提示适配 → Prefix Tuning
面试官追问:”你自己做过微调吗?”
这类追问不是问”会不会写训练脚本”,而是考察你对微调全流程的工程认知。回答结构:数据 → 方法选型 → 训练细节 → 评估。即使没亲手做过大规模微调,也应该说清楚:用什么数据(多少条、什么格式、怎么清洗)、为什么选这个方法(LoRA vs 全参数)、训练时关注什么指标(loss 曲线、过拟合检测)、怎么评估效果(离线评测 + 在线 A/B)。
差距在哪:新手只知道两种方法且只说了一个维度。高手把主流微调方法按参数效率做了系统对比,并给出了场景化的选型建议。面试官考的是”你理不理解微调方法的设计动机,能不能根据资源和需求做选型”。
追问:LoRA 的 A、B 两个矩阵分别怎么初始化?逻辑推理任务的秩该偏大还是偏小?训推一体时权重 Merge 怎么做?
来源:阿里淘天 AI应用开发一面(三连追问)
这三个问题串起来考的是 LoRA 从训练到部署的完整认知:
矩阵初始化:
- A 矩阵(降维矩阵):随机高斯初始化(均值 0,方差小)
- B 矩阵(升维矩阵):零初始化
- 为什么 B 用零初始化?因为 ΔW = BA,B=0 意味着训练开始时 ΔW=0,模型从原始预训练权重出发——保证微调初期不破坏已有能力
秩(rank)选择:
| 任务类型 | 推荐秩 | 原因 |
|---|---|---|
| 简单对话/格式调整 | r = 4~8 | 输出模式变化小,低秩足以捕获 |
| 领域知识注入 | r = 16~32 | 需要学习新知识,更新量更大 |
| 逻辑推理/数学 | r = 32~64(偏大) | 推理能力依赖多层复杂交互,低秩会欠拟合 |
逻辑推理任务秩偏大的核心原因:推理链的正确性依赖于注意力头之间精细的协作模式,这种模式的参数空间维度高,低秩近似会丢失关键信息。
权重 Merge: 部署时把 LoRA 分支合并回主权重:W_merged = W_original + α × B × A。合并后推理路径和原始模型完全相同——零额外延迟,因为不再有旁路分支。α 是 LoRA 的 scaling factor(通常 α/r)。合并是不可逆的——如果需要切换多个 LoRA 适配器,保留未合并版本。
Q:给定时间序列,如何用 ML 筛选特征,再基于规则建模?
来源:阿里 AI Agent 开发一面
新手答:“提取特征,训练模型,看 feature importance。”
高手答:
先把原始序列变成可学习的特征:
统计特征:均值、方差、最大最小值
趋势特征:移动平均、环比
波动特征:标准差、变异系数
周期特征:傅里叶分量、周期自相关
滞后特征:lag 值、rolling lag然后用 XGBoost / LightGBM / 随机森林训练,输出的关键因子整理成多条规则做线上解释。
好处是既保留了 ML 筛特征的能力,也兼顾了规则系统的稳定和可解释——线上跑的是规则,但因子是 ML 选出来的。
差距在哪:新手只说了思路没说具体特征。高手列出了五类特征且说清了 ML 和规则如何衔接。面试官考的是你能不能把 ML 和规则系统结合起来满足可解释性要求。
Q:kernel 级别的优化,比如用 CUTE DSL 或手写 CUDA 做 fusion?
来源:阿里 AI Agent 开发一面
新手答:“就是把多个算子合成一个,减少开销。”
高手答:
kernel 级别优化的核心目标是减少访存开销、减少 kernel launch 次数、提高并行利用率。很多模型推理慢,不一定是算力不够,更多是 memory bound。
算子融合的思路:
- 纵向融合:把连续的 elementwise 操作(如 LayerNorm + Dropout + Add)合成一个 kernel,减少中间结果写回显存
- 横向融合:把多个独立但可以并行的小 kernel 合并,减少 launch overhead
- 访存优化:利用 shared memory、寄存器缓存,减少 global memory 访问
工具链选择:手写 CUDA 最灵活但成本高;Triton 降低门槛但灵活性有限;CUTE DSL 在特定场景下能兼顾性能和开发效率。选哪个取决于场景对性能的极致要求程度和团队的工程能力。
差距在哪:新手只说了“合成一个”。高手区分了纵向/横向/访存三个优化方向。面试官考的是底层技术深度。