百度 AI Infra 一面 (3)
Q: Trust Region和PPO的关系?
TRPO(Trust Region Policy Optimization):通过约束策略更新步长保证单调改进。核心约束:KL(pi_old || pi_new) <= delta。求解需要二阶优化(Fisher 信息矩阵 + 共轭梯度法),计算复杂度高且实现困难。
PPO 是 TRPO 的简化近似:
- 用 clip 机制代替 KL 硬约束:将比率 r(theta) = pi_new(a|s) / pi_old(a|s) 裁剪到 [1-eps, 1+eps](eps 通常 0.2)
- Loss = min(r * A, clip(r, 1-eps, 1+eps) * A)
- 效果上实现了类似的”不要更新太远”的目标,但无需求解约束优化
- 计算只需一阶梯度(标准 SGD),实现简单且效果接近 TRPO
关系总结:PPO 是 TRPO 的一阶近似 + 工程友好版本。牺牲了理论上的单调改进保证,换来了实现简单和训练稳定。在实践中 PPO 已完全取代 TRPO。
Q: PPO是on-policy还是off-policy?
On-policy。PPO 要求训练数据来自当前策略(或非常接近当前策略),通过 clip 机制保证 on-policy 假设的有效性。
具体解释:
- 每次迭代:用当前策略收集一批轨迹(rollout)-> 计算优势函数 -> 用这批数据更新策略多个 epoch(通常 3-5 个 epoch)
- 多 epoch 复用同一批数据是为了提高样本效率,但 clip 确保策略不会偏离数据采集时的策略太远
- 更新完成后旧数据作废,需要重新采样
与 off-policy 的区别:off-policy 方法(如 DQN、SAC)可以使用任意旧策略产生的数据训练(通过 replay buffer),样本效率更高但训练稳定性通常更差。
Q: 为什么PPO需要Importance Sampling?
原因:在实际实现中,数据采集(rollout worker)和策略更新(learner)之间存在时间差:
- 采集数据时用的是”行为策略” mu(当时的模型参数)
- 更新时模型参数已经变化为”目标策略” pi(经过部分 gradient step)
- 二者不完全相同,直接用数据估计 pi 的梯度会有偏
重要性采样修正:
1 | gradient ≈ E_{a~mu} [pi(a|s)/mu(a|s) * A * grad(log pi(a|s))] |
比率 pi/mu 修正了采样分布的偏差,使得用 mu 采集的数据也能无偏估计 pi 的梯度。
PPO 的处理:直接在 loss 中使用比率 r = pi_new/pi_old,clip 操作同时限制了 IS 比率的范围,防止方差爆炸。这是 PPO 简洁且有效的核心设计。
Q: PPO中clip如何根据优势函数A的正负限制上下界?
PPO 的 clip 机制针对 A 的正负分别施加不同方向的约束:
A > 0(好动作,应该鼓励):
- 无 clip 时 loss = r * A,梯度倾向于增大 r(增大该动作概率)
- clip 限制 r 的上界为 1+eps:min(r*A, (1+eps)*A) = min(r, 1+eps) * A
- 效果:防止一步更新中过度增大好动作的概率(避免过拟合到单个好轨迹)
A < 0(坏动作,应该抑制):
- 无 clip 时 loss = r * A(A<0),梯度倾向于减小 r(减小该动作概率)
- clip 限制 r 的下界为 1-eps:min(r*A, (1-eps)*A) = max(r, 1-eps) * A(注意 A<0 翻转不等号方向)
- 效果:防止一步更新中过度减小坏动作的概率
双向 clip 的整体效果:无论好动作还是坏动作,策略更新幅度都被限制在 [1-eps, 1+eps] 范围内(约 +-20%),保证了训练稳定性。
Q: PPO的损失函数怎么计算?GAE中lambda的作用?
PPO 总 Loss = L_clip + c1 * L_value + c2 * L_entropy
- L_clip:策略损失,clip 后的 surrogate objective
- L_value:价值函数损失,MSE(V_pred, V_target),训练 critic
- L_entropy:策略熵 bonus,鼓励探索防止过早收敛。c2 通常 0.01
GAE(Generalized Advantage Estimation):
优势函数 A_t 的估计方式决定了方差-偏差 trade-off。GAE 通过 lambda 参数平滑插值:
1 | A_t^GAE = sum_{l=0}^{T-t} (gamma * lambda)^l * delta_{t+l} |
Lambda 的作用:
- lambda = 0:A_t = delta_t(单步 TD),低方差但高偏差(只看一步)
- lambda = 1:A_t = R_t - V(s_t)(Monte Carlo return),低偏差但高方差(看完整轨迹)
- lambda = 0.95(常用):折中方案,兼顾方差和偏差
直觉:lambda 控制”看多远的未来”。小 lambda 只关注即时反馈(稳定但短视),大 lambda 考虑长远收益(准确但波动)。
Q: GRPO的损失计算?序列级别损失如何给到每个token?
GRPO 的核心流程:
- 对每个 prompt x 采样 G 个回答 {y_1, …, y_G}
- 对每个回答计算 reward r_i(如数学答案正确性)
- 组内归一化:advantage_i = (r_i - mean(r)) / std(r)
- 策略梯度:对每个 token 的 log probability 乘以序列的 advantage
序列级 reward 到 token 级 loss 的传递:
1 | L = -E_x [1/G * sum_i (advantage_i * sum_t log(pi(y_i_t | x, y_i_{<t})) / |y_i|)] |
- 每个 token y_i_t 的 loss weight = advantage_i(该序列的归一化奖励)
- 除以 |y_i|(序列长度)做长度归一化,防止长序列主导梯度
- 加 KL 惩罚项:beta * KL(pi || pi_ref) 防止偏离参考策略过远
关键设计:无需 Critic/Value 网络(用组内相对排名代替绝对 baseline 估计),大幅简化了训练 pipeline。
Q: GRPO有哪些变体?
| 变体 | 核心改进 | 解决的问题 |
|---|---|---|
| DAPO | 动态分配采样资源,对难 prompt 多采样 | 样本效率低(简单 prompt 浪费算力) |
| Dr.GRPO | 去除长度归一化中的隐式长度偏差 | GRPO 倾向生成长回答(长=更多 reward 信号) |
| RLOO | Leave-One-Out 基线估计代替组均值 | 组均值估计方差大(组内只有 4-8 个样本) |
| GSPO | 组内排序生成 pairwise 对做 DPO-style 优化 | 更充分利用组内对比信息 |
| Online DPO | 在线采样 chosen/rejected 对 | 结合 GRPO 的在线采样和 DPO 的稳定训练 |
Q: 分布式训练中优化器/梯度/模型参数的显存比例?FSDP和DeepSpeed Zero-1/2/3?
显存构成(以 7B 模型 + Adam + FP16 混合精度为例):
| 组件 | 每参数字节数 | 7B模型总计 |
|---|---|---|
| FP16 模型参数 | 2B | 14 GB |
| FP16 梯度 | 2B | 14 GB |
| FP32 master weight | 4B | 28 GB |
| FP32 momentum | 4B | 28 GB |
| FP32 variance | 4B | 28 GB |
| 总计 | 16B | 112 GB |
优化器状态(12B/参数)占总显存的 75%,是最大的开销来源。
ZeRO / FSDP 分级切分策略:
| 策略 | 切分内容 | 显存节省 | 额外通信 |
|---|---|---|---|
| ZeRO-1 | 优化器状态 | ~4x(每卡 84->42 GB) | 梯度 AllReduce + 参数 AllGather |
| ZeRO-2 | 优化器 + 梯度 | ~8x(每卡->28 GB) | 梯度 ReduceScatter + 参数 AllGather |
| ZeRO-3/FSDP | 全部(optimizer+grad+param) | ~N倍(N=卡数) | 前向/反向时 AllGather 参数,用完释放 |
ZeRO-3 通信量最大(每次前反向都需要 AllGather 全部参数),但显存最省。FSDP 是 PyTorch 对 ZeRO-3 的原生实现。
Q: Agentic RL是什么?
将 LLM Agent 的多步决策过程(工具调用、搜索、代码执行等)建模为强化学习问题,通过 RL 训练优化整个决策轨迹。
形式化:
- State:当前对话历史 + 环境反馈
- Action:LLM 生成的文本(可能包含工具调用指令)
- Reward:任务完成度(如代码测试通过率、网页任务成功率)
- Policy:LLM 本身
与标准 RLHF 的区别:
- 标准 RLHF:单轮 response 的质量评估(immediate reward)
- Agentic RL:多步交互的最终结果评估(delayed reward),需要 credit assignment
代表工作:
- SWE-Agent + RL:训练 agent 自动修复代码 bug
- WebAgent + RL:训练 agent 操作网页完成任务
- DeepSeek-R1:在推理过程中通过 RL 优化 CoT 策略
挑战:环境交互成本高(每步需要执行工具/代码)、reward 稀疏(只有最终结果有信号)、动作空间巨大(自然语言生成)。
Q: 手撕:二叉树的层次遍历,并记录每个节点在第几层?
(编程题)