雷鸟创新 大模型开发 一面
1. 自我介绍
2. PPO、TRPO、DPO 分别是什么,它们的核心差异在哪
TRPO 的出发点是让策略更新别跨太大步,它通过约束新旧策略的 KL 距离,把优化问题写成一个带信赖域的约束优化,所以理论上比较稳,但实现复杂、计算成本也高。PPO 可以看成是 TRPO 的工程化近似,它不直接解复杂约束问题,而是通过 clip 或 penalty 的方式,限制策略更新过猛,因此在实践里更常用。
DPO 和前两者不太一样,它不是传统在线 RL,而是直接从偏好对里学习一个“更偏向 chosen、压低 rejected”的目标,相当于把 reward optimization 吸收到一个更简单的监督目标中。PPO/TRPO 更像显式做策略优化,DPO 更像利用偏好数据绕过 value learning 和在线 rollout 的重成本。
3. DPO 的损失函数怎么理解,为什么它不需要单独训练 reward model
DPO 的关键点在于,它把“偏好数据背后隐含了一个 reward 差值”这个假设直接写进目标函数里。对同一个 prompt,给一个 chosen 和一个 rejected,模型希望 chosen 的相对对数概率比 rejected 更高,同时这个差值又不能偏离 reference model 太远。最后目标通常写成一个 logistic 形式,本质上是在做一个偏好分类,但分类边界来自策略与 reference 的相对 log-prob 差。
它不需要单独训练 reward model,是因为 reward 的作用被隐含在 pairwise preference 目标里了。不是说 reward 不存在,而是说不再显式训练一个独立 reward network 再接 PPO,而是直接让策略根据偏好对调整输出分布。
import torch import torch.nn.functional as F chosen_logp = torch.tensor([ -1.2, -0.8 ]) rejected_logp = torch.tensor([ -2.1, -1.5 ]) ref_chosen_logp = torch.tensor([ -1.4, -1.0 ]) ref_rejected_logp = torch.tensor([ -1.9, -1.2 ]) beta = 0.1 logits = beta * ((chosen_logp - rejected_logp) - (ref_chosen_logp - ref_rejected_logp)) loss = -F.logsigmoid(logits).mean() print(loss.item())
4. 微调之后为什么还要做 RLHF 或偏好优化,它解决的到底是什么问题
SFT 能解决的是“模型会不会答”和“能不能学会某种输出格式”,但它对“答得是不是更符合人类偏好”这件事约束没那么强。因为 SFT 本质上是在模仿一个参考答案,而真实世界里很多任务并不只有一个标准答案,甚至答案质量高低取决于帮助性、安全性、简洁度、推理完整度这些软指标。RLHF 或 DPO 这类偏好优化,解决的是输出分布再对齐的问题。
举个更直观点的例子,同一个问题两个答案都可能是对的,但一个更啰嗦、一个更有条理;一个虽然正确但不安全,另一个更稳。SFT 很难稳定学出这种细粒度偏好,偏好优化就是把这种“人更喜欢哪个回答”的信号注入进去。
5. LoRA 是什么,它一般加在模型的什么地方,为什么有效
LoRA 的核心思想是冻结原始大权重,只学习一个低秩增量矩阵,把原始参数更新近似成两个小矩阵的乘积。这样一来,可训练参数量和显存占用都会显著下降,但模型依然能获得较强的任务适配能力。它有效的前提是,大模型在很多下游任务上并不需要全参数大幅重写,而是可以通过低秩方向做局部修正。
实际使用时,LoRA 通常加在 attention 的 q_proj、v_proj,有时也加在 k_proj、o_proj 和 MLP 的投影层。最常见的是先加在注意力层,因为这些位置对模型行为影响大、收益也比较稳定。
import torch
import torch.nn as nn
class LoRALinear(nn.Module):
def __init__(self, in_features, out_features, r=8, alpha=16):
super().__init__()
self.weight = nn.Parameter(torch.randn(out_features, in_features), requires_grad=False)
self.A = nn.Parameter(torch.randn(r, in_features) * 0.01)
self.B = nn.Parameter(torch.randn(out_features, r) * 0.01)
self.scale = alpha / r
def forward(self, x):
base = x @ self.weight.t()
lora = (x @ self.A.t()) @ self.B.t() * self.scale
return base + lora
6. RMSNorm 和 LayerNorm 相比,本质上少了什么,为什么很多大模型更喜欢前者
RMSNorm 去掉了均值中心化这一步,只保留按均方根做缩放归一化。也就是说,它不再显式减去均值,而是只控制向量的尺度。这样做减少了一步计算,也让实现更轻。很多大模型更偏向 RMSNorm,不是因为 LayerNorm 不好,而是因为在深层 Transformer 和大规模训练场景里,RMSNorm 已经足够稳定,同时吞吐更友好。
更
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.