面灵AI→

腾讯 WXG 大模型算法暑期实习面经:强化学习、LoRA 与手撕 PPO

时间
2026-10
来源
牛客网

《面试题目》

  1. 介绍一下你的论文,以及你用到的强化学习算法(GRPO、PPO、reward model),并说明马尔可夫决策过程(MDP)的基本要素。
  2. bf16、fp16 和 fp32 有什么区别?各自怎么做计算?
  3. LoRA 微调的细节有哪些?量化相关的知识了解多少?
  4. 手撕:实现 PPO。
  5. 手算马尔可夫决策过程的 γ(折扣因子)阈值。
  6. 算一下模型 SFT 阶段的参数量大小以及显卡利用率。
  7. 手撕:判断两个链表是否相交(hot100)。
  8. 如何使一个输入向量 x 经过一个或多个全连接层后,其输出向量 y 所在子空间的基底尽可能接近标准正交基?
  9. 和使用强化学习训练大模型相比,使用强化学习训练小模型需要做出哪些改变?

《参考解析》

MDP、PPO 与 GRPO:把「优化目标」讲在公式之前。 语言模型的强化学习把生成过程建模成 MDP:状态是当前上下文(prompt + 已生成 token),动作是下一个 token,策略就是模型本身,奖励通常稀疏地落在序列末尾(reward model 或规则打分)。PPO 的目标是最大化带优势的期望回报,同时用重要性采样比 r_t = π_θ/π_old 复用旧策略采到的数据,并用 clip 把比值限制在 [1-ε, 1+ε] 防止一步更新太远;工程上还要用 GAE 估优势、用 value head 估基线、用 KL 惩罚拉住与参考模型的距离。GRPO 去掉价值网络,改为对同一 prompt 采样一组回答、用组内归一化的相对好坏当优势,省掉一个模型和它的显存开销,DeepSeek 系列的 RL 就是这么做的——回答时把「省掉 critic、奖励是相对的」这一点说出来,比背公式更值钱。手撕 PPO 通常不要求完整 RLHF 框架,而是实现核心的 clip 损失:算出新旧策略下动作的对数概率、比值、未裁剪项与裁剪项、取两者较小值再加负号当 loss,能讲清 detach 谁、梯度只走新策略就达标。

精度格式:尾数位数决定精度,指数位数决定范围。 fp32 是 1 位符号 + 8 位指数 + 23 位尾数;fp16 是 5 位指数 + 10 位尾数,动态范围窄,训练时容易溢出,所以常配 loss scaling;bf16 是 8 位指数 + 7 位尾数,范围和 fp32 一致、精度低,做深度学习时几乎不用改超参,是主流训练精度。混合精度训练的常规做法是权重存 fp32 主副本、前向反向用 bf16/fp16 算、累加与更新回到 fp32,既省显存和算力又不丢收敛性;推理侧还有 int8/int4 量化(per-channel 或 per-group 的 scale 与 zero point,激活做 per-token 动态量化),误差主要来自离群值,所以才有 SmoothQuant、AWQ、GPTQ 这类专门处理离群通道的方法。面试里能补一句「精度损失最后要看评测集而不是看 bit 数」通常加分。

LoRA 与量化:低秩假设 + 冻结主干。 LoRA 冻结原权重 W,在旁边学一个低秩增量 ΔW = BA,A 用随机高斯初始化、B 初始化为 0,所以训练开始时增量恰好为零,不会破坏预训练能力;秩 r 与缩放 α/r 是一对要一起调的旋钮,r 越大容量越强也越容易过拟合。实践细节包括:一般只加在注意力(q/k/v/o)投影上,加在 MLP 上的收益要看任务;学习率通常比全参微调高一个量级;合并回基座(merge)后推理没有额外开销,但多个 LoRA 同时服务要保留未合并形态并注意 batch 内混装。QLoRA 则是先把基座量化到 4bit(NF4 + 双重量化)再挂 LoRA,梯度只回传到 LoRA 分支,让单卡微调大模型成为可能,代价是整体慢一些、量化误差需要评测确认。

两个「算一算」的题:先定公式再代数字。 γ 阈值那类问题本质是折扣回报的收敛条件:$\sum_{t=0}^{\infty} \gamma^t R = R/(1-\gamma)$,要求它有限就是 $|\gamma| < 1$;如果题目给的是「奖励延迟 k 步后才有、且要求方差或累积偏差不超过某个界」,就是把这个等比级数写成带 γ^k 的形式再解不等式——先说清假设(奖励是否有界、是否平稳、是否按步衰减),再代数,比直接甩一个数字稳。SFT 参数量与显存估算的套路是:参数量 = 注意力(4·d² 的投影,含 GQA 时 K/V 按 n_kv_heads 缩)+ MLP(按门控结构约 3·d·d_ff)+ 词表嵌入;训练显存 ≈ 参数 × 精度字节 + 梯度 + Adam 优化器状态(fp32 的 m、v 各一份,约参数的 12~16 字节/参数)+ 激活值(与 batch、序列长度成正比);显卡利用率则要看算力峰值与实际 FLOPs 的比值,注意中小 batch 下往往是访存或 kernel 启动开销受限,而不是算力打满。

正交基那道题问的是「约束怎么落进损失函数」。 希望某个全连接层输出的各维基底接近标准正交,等价于让输出协方差矩阵接近单位阵的缩放,常见三种做法:一是初始化就用正交初始化(对权重矩阵做 QR 或 SVD 分解得到正交矩阵),二是加正则项——直接对 WᵀW - I 取 Frobenius 范数当惩罚,或者在 batch 维度上惩罚特征协方差矩阵的非对角项(类似 whitening / Barlow Twins 的思路,同时把对角压到 1 以固定尺度),三是结构上做归一化,如 LayerNorm 之后再接线性层配合权重衰减。回答时记得区分「权重正交」和「输出正交」:前者约束参数矩阵,后者约束激活分布,面试官追问的往往是后者,因为它才是影响表示退化、梯度尺度的那个量。

小模型做 RL 与大模型做 RL 的差别。 大模型 RL 的瓶颈主要在算力与稳定性:rollout 成本高,所以要做大批量、异步采样、多轮复用;策略容易在 KL 上跑偏,需要更保守的 clip 与 KL 系数。小模型(几 B 以内)能力上限低、对奖励噪声更敏感,常见调整是:奖励设计要更稠密(过程奖励、规则校验、格式奖励占比更高),否则稀疏奖励下几乎学不到东西;训练更依赖 SFT 冷启动,先把格式和任务分布对齐再上 RL;batch 更小、迭代更快,但更容易过拟合到某一类奖励 hack,需要用留出评测集盯住退化;此外小模型常要配上蒸馏或拒绝采样(从大模型拿正样本再自训练),单靠 RL 很难把知识补进来。原帖还提到手撕「相交链表」——hot100 里用双指针等长走法(各自走完自己再走对方的路径)能在 O(1) 空间内判交点,这类题在算法岗面试里出现,通常只是确认代码基本功,别在上面耽误太多时间。