#模块四:SFT、PEFT 与对齐训练

#37. SFT 是什么?它和预训练有什么本质区别?

#标准答案

SFT(Supervised Fine-Tuning)本质上是拿高质量的指令-回答样本去教模型“遇到这类输入时,应该怎样输出”。它关心的是行为对齐、任务格式、回答风格和遵循指令的能力;而预训练更多是在海量无标注文本上学习语言规律、世界知识和通用表示,所以它解决的是底座能力问题。

一句好记的话是:预训练决定模型”懂多少”,SFT 决定模型”怎么把懂的东西说出来”。所以很多模型在预训练后虽然已经有知识,但没有经过 SFT 时,回答往往不稳定、不听话、格式也不受控。


#深度解析

1. 目标函数的数学差异

  • 预训练(CLM):最大化无标注文本的联合概率
  L_pretrain = -Σ log P(x_t | x_1, x_2, ..., x_{t-1}; θ)

数据是连续文本,没有输入输出配对。

  • SFT:最大化给定输入下期望输出的条件概率
  L_SFT = -Σ log P(y_t | x, y_1, ..., y_{t-1}; θ)

数据是 (instruction, response) 对,模型只学习”给定 instruction 后生成 response”。

本质区别:预训练学的是”语言怎么工作”,SFT 学的是”我该怎么回应”。

2. 数据规模与分布差异

维度 预训练 SFT
数据量 TB 级(数万亿 token) MB-GB 级(万-百万条)
数据来源 网页、书籍、代码、百科 人工标注、合成数据、对话记录
数据成本 低(爬虫获取) 高(人工标注每条 $0.1-$5)
数据格式 连续文本 (input, output) 配对
epoch 通常 1 轮(数据太大) 通常 1-3 轮(防止过拟合)

3. 学习率与优化差异

参数 预训练 SFT
学习率 1e-4 ~ 3e-4 1e-5 ~ 1e-4(通常小 10x)
warmup 长(如 2000 steps) 短(如 100 steps)
batch size 极大(百万级 token/batch) 小(16-128 条)
优化器 AdamW / Adam AdamW(常配合 LoRA)

学习率更小的原因:预训练是从随机或弱初始化开始,需要大学习率快速探索;SFT 是在已收敛的权重上微调,大学习率会破坏已有能力。

4. SFT 的效果边界

SFT 不能教会模型”它本来不知道的东西”:

  • 如果底座没见过”量子纠缠”,SFT 数据里也没有,模型就不可能回答好相关问题
  • SFT 改变的是行为(怎么回答),不是知识(知道什么)

所以:知识不足 → 需要 continue pretraining;行为不对 → 需要 SFT。

5. 面试官常见深挖追问

  • ”SFT 数据里,instruction 和 response 哪个质量更重要?”
    • 答:response 质量更重要。instruction 只是触发条件,response 是模型实际要学习的目标分布。但 instruction 的多样性和清晰度也很重要——如果 instruction 太单一,模型会过拟合到特定 prompt 格式。
  • ”SFT 时 loss 降得很低,但线上效果很差,为什么?”
    • 答:可能是分布过拟合。SFT loss 低说明模型”记住了训练集中的回答”,但测试集的指令分布和训练集不同。解决:1)增加 instruction 多样性;2)混入通用数据;3)控制 epoch(不要训到 loss 趋近于 0);4)用 LoRA 限制参数量。
  • ”为什么 SFT 数据通常要做'格式统一'?”
    • 答:如果训练数据中有的用 ”Q: ... A: ...”、有的用 ”用户: ... 助手: ...”、有的用 ”### Instruction: ... ### Response: ...”,模型会学到混乱的格式分布,推理时输出格式不稳定。统一格式(如全部用 ChatML 或 Alpaca 格式)能让模型更稳定地学习到”正确的回应模式”。

#38. LoRA 的核心思路是什么?

#标准答案

LoRA 的核心思路是:不要去大改整张权重矩阵,而是假设“真正需要学习的更新”其实落在一个低秩子空间里。于是训练时冻结原模型参数,只额外学习两个小矩阵,让它们的乘积形成一个低秩增量,再把这个增量加回原线性层。

这样做的好处是三重的:第一,训练参数量大幅下降;第二,显存和优化器状态更省;第三,底座模型主体不动,更容易保留原能力。所以 LoRA 的本质不是”少训一点参数”,而是用低秩假设把更新压缩了。


#深度解析

1. 为什么”更新是低秩的”这个假设站得住脚?

Aghajanyan 等人(2021)的研究发现:预训练大模型在微调时,权重更新的有效秩其实很低。直观理解是——大模型经过海量预训练后,已经学到了非常丰富的通用表示;微调只是让它”往特定方向偏一点”,不需要推翻整个表示空间。这个”偏量”往往只涉及少数几个关键方向,所以用低秩矩阵来近似是合理的。

数学上,如果完整更新的秩是 r_full(实际观测往往只有几十),而 LoRA 的秩是 r,只要 r ≥ r_full,LoRA 就能无损表示真实更新。实践中 r=816 往往就够了。

2. 参数量的具体对比

假设要微调一个线性层,输入维度 d_in=4096,输出维度 d_out=4096

  • 全参数微调:需要训练 4096 × 4096 = 16,777,216 个参数
  • LoRA (r=16):需要训练 A: 4096×16 + B: 16×4096 = 65,536 + 65,536 = 131,072 个参数
  • 压缩比:16,777,216 / 131,072 = 128×

一个 7B 模型有约 200 个线性层(attention + FFN),全参数微调要训 7B 参数;LoRA 只训约 200 × 131K ≈ 26M 参数,是原来的约 1/270。

3. 秩 r 的选择:不是越大越好

r 值 参数量 适用场景 风险
1-4 极小 简单任务、快速实验 可能容量不足
8-16 大多数下游任务 sweet spot
32-64 中等 复杂任务、大 domain gap 接近全参数效率
128+ 接近全参数 低秩优势不明显

r 太小(如 1):模型只能沿一个方向调整,表达能力受限。 r 太大(如 256):参数量接近全参数,LoRA 的意义下降。

4. 为什么 LoRA 通常只应用于线性层?

因为线性层的更新天然是矩阵形式,低秩分解(BA)可以直接套用。LayerNorm、Embedding、偏置的参数量本来就很小的参数量,用 LoRA 分解没有收益。Attention 中的 Q/V 投影通常是 LoRA 的重点,而 K 投影有时不加 LoRA(因为 K 主要影响 key 的表示,对下游任务敏感度较低)。

5. 面试官常见深挖追问

  • ”LoRA 的 A 和 B 初始化有什么讲究?”
    • 答:A 通常用高斯随机初始化,B 初始化为零。这样训练开始时 BA = 0,增量为零,模型从原参数开始,保证训练初期稳定。如果 B 也随机初始化,训练一开始就会有较大扰动。
  • ”LoRA 和 Adapter 有什么区别?”
    • 答:Adapter 是在原网络中插入小的 bottleneck 层(通常是 down-project + activation + up-project),修改了网络拓扑;LoRA 是在原线性层旁路加低秩增量,不改变网络结构。Adapter 需要改 forward 路径,LoRA 可以直接合并回原始权重(W' = W + BA),推理无额外开销。
  • ”如果 LoRA 训完后想部署,怎么处理 BA?”
    • 答:最简单的方式是把 BA 合并回原权重:W' = W + BA,然后丢弃 A 和 B。这样推理时跟原模型完全一样,没有任何额外计算。如果需要保留多个任务的 adapter,可以动态加载不同 BA 到同一底座上。

#39. QLoRA 比 LoRA 多做了什么?

#标准答案

QLoRA 可以理解成“量化版 LoRA”。它不是直接在全精度底座上挂 LoRA,而是先把底座模型以更低精度形式加载进显存,再只训练上面的 LoRA adapter。这样相比普通 LoRA,会进一步减少权重存储和训练时的显存占用。

它适合的典型场景是:底座模型太大,普通 LoRA 也快放不下,但你又不想走全参数微调。代价则是量化会引入额外数值误差,所以在特别敏感的任务上,效果可能比全精度 LoRA 略差。


#深度解析

1. QLoRA 的"双量化"机制

QLoRA 的核心不是简单地把 FP16 权重转成 INT8,而是用了更精细的 NF4(Normal Float 4-bit)量化:

  • 第一次量化:把权重分组(如每 64 个参数一组),计算每组的统计量(均值、标准差),然后用 NF4 表示组内参数。NF4 的特点是根据正态分布的累积分布函数来设计量化点,让量化误差在常见值域更小。
  • 第二次量化:对第一次量化的缩放因子(scale)再做量化。因为每组的缩放因子本身也占用显存,对它们做 8-bit 量化可以进一步节省。

这就是为什么叫"双量化"——权重被量化一次,权重的元数据(缩放因子)又被量化一次。

2. 显存占用的具体对比

以微调 LLaMA-65B 为例(batch_size=1, seq_len=512):

方案 底座显存 梯度显存 优化器状态 LoRA 参数 总显存
全参数微调 130 GB 130 GB 260 GB - ~520 GB
LoRA (FP16) 130 GB ~1 GB ~2 GB ~0.5 GB ~133 GB
QLoRA (NF4) ~40 GB ~1 GB ~2 GB ~0.5 GB ~43 GB

QLoRA 把底座从 130GB 压到 40GB,总显存从 133GB 降到 43GB,单张 A100 就能微调 65B 模型。

3. 为什么用 NF4 而不是 INT4?

神经网络权重通常近似正态分布(以 0 为中心,两边对称)。INT4 的量化点是均匀分布的,对正态分布不是最优;NF4 的量化点根据正态分布的分位数设计,在权重常见的值域(接近 0 的区域)有更细的粒度,量化误差更小。

4. 分页优化器(Paged Optimizer)

QLoRA 还引入了分页优化器来应对"显存峰值"问题。训练过程中某些步骤(如梯度累积、验证)会短暂需要更多显存。分页优化器把这些临时数据放到 CPU 内存,需要时再换入 GPU,避免 OOM。

5. 面试官常见深挖追问

  • "QLoRA 的量化误差会在训练中累积吗?"
    • 答:会的。底座权重被量化后,前向传播的激活值就带上了量化误差。但 LoRA 增量 BA 是在全精度下训练的,它可以部分补偿底座的量化误差——训练过程中 BA 会学到"如何纠偏"。这就是为什么 QLoRA 的效果往往比直接做 4-bit 推理要好:因为 adapter 有学习能力。
  • "QLoRA 训完后,底座还是 NF4 吗?部署怎么办?"
    • 答:是的,底座保持 NF4。部署时可以把 BA 合并回去:W_NF4 + BA。如果需要更高精度,可以把底座反量化到 FP16 再合并。很多框架(如 transformers, PEFT)支持自动合并。
  • "什么任务不适合 QLoRA?"
    • 答:对数值精度极度敏感的任务,如精确数学计算、代码执行(需要生成可运行代码)、需要细粒度推理的任务。另外,如果底座本身的 4-bit 量化就导致效果严重下降(如某些小模型或已经量化过一次的模型),QLoRA 的纠偏空间也有限。

#40. 什么是 PEFT?为什么它适合大模型微调?

#标准答案

PEFT(Parameter-Efficient Fine-Tuning)是参数高效微调的总称,LoRA、Adapter、Prefix Tuning、Prompt Tuning 都可以看作 PEFT 家族成员。它们的共同点不是方法形式一样,而是都在做一件事:尽量少改参数,却让模型获得足够的任务适配能力。

它之所以特别适合大模型,是因为全参数微调不仅显存贵、训练慢、存储多个任务版本也很重,而且很多业务任务根本不值得为了一点适配去重训整个底座。所以 PEFT 的价值,本质上是把”可用效果”和”可承受成本”拉到一个更合理的平衡点。


#深度解析

1. PEFT 四大方法的原理对比

方法 修改位置 核心思想 可训练参数量(以 7B 模型为例) 典型超参
LoRA Attention/FFN 的权重矩阵旁路 低秩分解:W = W₀ + BA ~8-33M (r=8~32) rank r, α=2r
Adapter 每层 Transformer 后插入小 FFN 瓶颈结构:down-proj + non-linear + up-proj ~2-5M/层 bottleneck dim
Prefix Tuning 每层 K/V 前添加可学习前缀 冻结模型,只学 prefix 嵌入 ~0.1% 参数量 prefix length
Prompt Tuning 输入层添加可学习软提示 冻结整个模型,只优化 prompt tokens ~20K-200K prompt length

2. LoRA 为什么有效:低秩假设的数学直觉

核心假设:微调带来的权重变化 ΔW 是低秩的。

W_full = W_pretrain + ΔW
其中 ΔW ∈ R^(d×d),但 rank(ΔW) << d

LoRA 参数化:ΔW = B × A
  B ∈ R^(d×r), A ∈ R^(r×d), r << d
  参数量从 d² 降到 2×d×r

对于 4096×4096 的权重矩阵:

  • 全参数:16.8M 参数
  • LoRA (r=16):2 × 4096 × 16 = 131K 参数
  • 压缩比:128 倍

3. 各方法的适用场景与选择策略

场景 推荐方法 原因
单任务、追求最佳效果 LoRA 表达能力最强,接近全参数微调
多任务、需快速切换 Adapter 每层独立插入,任务切换只需换 adapter
极少量数据、分类任务 Prompt Tuning 参数量最小,不易过拟合
生成任务、长上下文 Prefix Tuning 对生成任务效果好,prefix 能影响注意力模式
资源极度受限 Prompt Tuning / BitFit 只训练 bias 或 prompt,<0.01% 参数

4. 各方法的兼容性

LoRA + 量化 = QLoRA(节省显存)
Adapter + 多任务 = 每个任务一个 adapter 文件
Prefix Tuning + 长文本 = prefix 提供额外上下文信号

实践中LoRA 最常用,因为:

  1. 推理时无额外开销(W = W₀ + BA 可合并)
  2. 与量化兼容好(QLoRA)
  3. 社区生态成熟(Hugging Face PEFT 库)

5. 面试官常见深挖追问

  • ”LoRA 的 rank r 怎么选?r 越大效果越好吗?”
    • 答:不是越大越好。r 决定 ΔW 的表达能力:r 太小(如 1-2)→ 欠拟合;r 太大(如 128+)→ 接近全参数,失去 PEFT 意义。经验法则:简单任务 r=8-16 足够,复杂任务 r=32-64。可以用 SVD 分析预训练权重的有效秩来指导选择。
  • ”为什么 LoRA 通常只加在 Attention 的 Q/V 投影上,不加在 FFN 上?”
    • 答:经验发现 Attention 的 Q/V 投影对任务适配最敏感。FFN 参数量大但 rank 高,低秩分解收益小。但最新研究(如 DoRA)表明在 FFN 上也加 LoRA 能进一步提升效果,只是性价比不如 Attention 高。
  • ”Adapter 和 LoRA 推理时的区别?”
    • 答:LoRA 的 BA 可以在推理前合并回 W₀(W = W₀ + BA),推理零额外开销。Adapter 需要在前向传播时额外过一层 bottleneck FFN,增加约 5-10% 的推理延迟。所以 LoRA 更适合 latency 敏感场景。
  • ”PEFT 会加剧 catastrophic forgetting 吗?”
    • 答:PEFT 反而能缓解遗忘。因为大部分预训练权重被冻结,保留了通用能力。只微调少量参数,模型不会轻易”忘记”预训练知识。但 PEFT 学到的任务特定知识可能和预训练知识冲突,这时需要正则化或任务隔离策略。

#41. RLHF 的典型三阶段流程是什么?

#标准答案

RLHF 的经典三阶段流程通常这样讲。第一阶段先做 SFT,用人工示范数据把模型调到“基本会按要求回答”;第二阶段收集偏好对,比如两条回答里哪条更好,再训练 reward model,让它学会近似人类偏好;第三阶段用 PPO 等强化学习方法,让策略模型去最大化这个奖励。

它的目标不只是让模型"事实更正确",而是让输出整体上更符合人类偏好,比如更有帮助、更安全、更自然、更少冒犯。所以 RLHF 解决的是"人喜欢怎样的回答",而不只是"哪句在语法上对"。


#深度解析

1. 三阶段的本质分工

阶段 目标 数据 训练方式 输出
SFT 让模型"学会基本应答格式" 人工写的高质量 (prompt, response) 对 监督学习 策略模型 π_SFT
Reward Model 让模型"学会判断好坏" 同一问题的两个回答 + 人类偏好标签 对比学习 Reward 模型 r(x,y)
PPO 让模型"主动优化回答质量" 用当前策略采样回答,Reward 模型打分 强化学习 优化后的策略 π_RL

2. Reward Model 的训练细节

给定一个问题 x 和两个回答 (y_w, y_l),其中 y_w 是人类偏好的(win),y_l 是不被偏好的(lose)。Reward 模型的 Bradley-Terry 损失:

L = -log σ(r(x, y_w) - r(x, y_l))

其中 σ 是 sigmoid。当 r(x, y_w) > r(x, y_l) 时,损失趋近于 0;反之损失很大。

Reward 模型通常比策略模型小(如 7B 策略配 1B reward),因为判断好坏比生成回答容易。

3. PPO 的 Clip Objective

PPO 的目标函数:

L_CLIP = E[min(ratio * A, clip(ratio, 1-ε, 1+ε) * A)] - β * KL(π_RL || π_SFT)

其中:

  • ratio = π_RL(y|x) / π_SFT(y|x):新策略与旧策略的概率比
  • A:优势函数(Advantage),估计当前回答比平均水平好多少
  • clip:防止策略更新过大(ε 通常 0.1-0.2)
  • KL 惩罚:防止新策略偏离 SFT 太远

Clip 的作用:如果 ratio 已经很大(如 > 1+ε),即使 advantage 为正也不再增加奖励,避免策略"走太远"。

4. RLHF 的常见失败模式

失败模式 现象 根因
Reward Hacking 模型学会讨好 reward 模型而非人类 Reward 模型不是完美的人类代理
模式崩溃 模型总是输出同一种"安全"回答 KL 惩罚太强或 reward 模型太窄
长度偏见 模型倾向于输出更长回答 Reward 模型天然偏好更完整的回答
训练不稳定 PPO 损失剧烈波动 优势估计不准、学习率敏感

5. 面试官常见深挖追问

  • "为什么 Reward Model 会 overfit 到表面特征?"
    • 答:Reward 模型只在偏好对上训练,而偏好数据量远小于预训练数据。它可能学到一些"捷径"(如更长的回答得分更高、包含特定关键词得分更高),而不是真正理解回答质量。这就是 reward hacking 的根源。
  • "PPO 的 KL 惩罚和 DPO 的 KL 约束有什么区别?"
    • 答:PPO 的 KL 是显式加在目标函数里的惩罚项,每次更新都约束;DPO 的 KL 是隐式的——DPO 的推导中,最优策略形式本身就包含 KL 约束,不需要额外超参调 β。
  • "如果 Reward Model 和策略模型规模一样大,会有什么问题?"
    • 答:训练成本翻倍。另外,规模相近时 reward model 可能"太聪明",能识别出策略模型的很多 trick,导致 reward hacking 更隐蔽但危害更大。实践中 reward model 通常比策略模型小 1/4 到 1/7。

#42. DPO 和 PPO / RLHF 相比,最大的区别是什么?

#标准答案

DPO 和传统 PPO 式 RLHF 最大的区别在于:它不再显式分成“先训 reward model,再做在线 RL”两步,而是直接把偏好数据转成一个可监督优化的目标,让模型提升被偏好答案的相对概率、压低被拒绝答案的相对概率。

这带来的好处是流程更短、训练更稳、工程复杂度更低,不需要在线采样和 RL 调参地狱。缺点是它的灵活性通常不如完整 RLHF,尤其当你需要复杂奖励设计、在线探索或多目标权衡时,传统 RL 框架仍更有表达力。


#深度解析

1. DPO 的损失函数推导

DPO 的核心洞察:在 Bradley-Terry 模型假设下,人类偏好可以被表示为隐式 reward 的 logistic 形式:

P(y_w > y_l | x) = σ(r(x, y_w) - r(x, y_l))

DPO 更进一步:它证明了在最优 RL 策略下,reward 可以表示为策略概率和参考策略概率的比值:

r(x, y) = β * log(π(y|x) / π_ref(y|x)) + β * log Z(x)

把这个 reward 表达式代入 Bradley-Terry 模型,就得到 DPO 的损失函数:

L_DPO = -log σ(β * log(π(y_w|x)/π_ref(y_w|x)) - β * log(π(y_l|x)/π_ref(y_l|x)))

其中:

  • π:当前策略模型
  • π_ref:参考模型(通常是 SFT 后的模型,固定不训练)
  • β:温度系数,控制对参考策略的偏离程度

2. DPO 的本质:隐式 reward + 离线优化

特性 PPO/RLHF DPO
Reward 模型 显式训练 隐式包含在损失中
采样方式 在线采样(当前策略生成) 离线(偏好数据已固定)
训练稳定性 需要小心调参 更稳定(监督学习)
灵活性 高(可设计复杂 reward) 低(只能表达成对偏好)
计算成本 高(需要 reward model + 在线生成) 低(只需要策略和参考模型)

3. DPO 的 β 参数怎么调?

  • β 太大:模型不敢偏离参考策略,偏好学习不充分
  • β 太小:模型可能偏离太远,输出变得奇怪或不连贯
  • 通常从 β=0.1 开始调,根据效果微调

β 的直观含义:控制"愿意为了迎合偏好而牺牲多少参考策略的likelihood"。

4. DPO 的局限

  • 分布外泛化差:DPO 只在已有的偏好对上训练,对训练时没见过的问题类型,优化效果不确定
  • 长度偏见:跟 RLHF 一样,DPO 也可能学到偏好更长的回答
  • 无法表达复杂奖励:比如"回答要有帮助且安全"这种多目标,DPO 只能折合成成对偏好,不如 RLHF 灵活

5. 面试官常见深挖追问

  • "DPO 的参考模型为什么固定不训练?"
    • 答:参考模型提供"锚点"——它代表了 SFT 后的基础能力。DPO 的目标是"在保持基础能力的前提下向偏好方向优化"。如果参考模型也一起训练,就失去了锚定作用,模型可能跑飞。
  • "DPO 和对比学习(Contrastive Learning)有什么关系?"
    • 答:DPO 本质上是一种有监督的对比学习:拉近偏好回答、推远拒绝回答。但 DPO 的特殊之处在于它通过 Bradley-Terry 模型把偏好和策略概率联系起来,有明确的 RL 理论支撑,不只是启发式对比。
  • "如果偏好数据有噪声(标注者意见不一致),DPO 和 PPO 谁更鲁棒?"
    • 答:DPO 通常更鲁棒。因为 DPO 是离线监督学习,噪声数据的影响是一次性的;PPO 是在线采样,如果 reward model 被噪声影响,会持续产生错误的训练信号,错误会被放大。

#43. 为什么很多人会说“做完 SFT 之后模型反而变傻了”?

#标准答案

很多人说“做完 SFT 模型变傻了”,本质上是在说:模型被高强度地拉向一类特定回答分布后,原来更广泛的能力空间被压缩了。如果 SFT 数据太窄、格式太死、任务覆盖不够,模型就可能变得特别会一种答法,但在别的场景下更迟钝。

从训练视角看,这通常不是模型真的”智商下降”,而是行为分布被过度收缩,导致探索性下降、回答多样性下降,甚至覆盖掉原本的泛化能力。面试时如果你能把它解释成”分布过拟合”而不是一句玩笑话,会更专业。


#深度解析

1. “变傻”的数学直觉:KL 散度视角

设预训练后模型的输出分布为 P_pretrain(y|x),SFT 后变为 P_SFT(y|x)

SFT 的目标是最小化:

L_SFT = -E_{(x,y)~D_SFT}[log P_SFT(y|x)]

如果 SFT 数据 D_SFT 分布很窄(如全是简短回答),模型会被拉向这个窄分布。对预训练时见过的多样化输入 x',新的输出分布可能与原来相差很大:

KL(P_pretrain(y|x') || P_SFT(y|x')) 增大

这就是”变傻”的本质:模型在 SFT 分布上表现好了,但在预训练分布上的行为被改变了。

2. 导致”变傻”的四大典型原因

原因 现象 机理
数据太窄 只会一种答法 分布支持集太小,模型没见过其他回答模式
格式太死 所有回答都是一个模板 输出前缀高度一致,模型学到强偏置
长度压缩 回答变短、变简单 SFT 数据中回答普遍偏短,模型学到”短=好”
过度优化 对训练集过拟合 学习率太大或 epoch 太多,参数离开原最优区

3. 量化感受:SFT 数据量与”变傻”程度

SFT 数据量 数据多样性 典型现象
1K 条 严重过拟合,几乎只会模板回答
10K 条 基本可用,但长尾问题表现差
100K 条 分布较丰富,”变傻”现象明显减轻
1M+ 条 很高 接近预训练分布广度,基本不变傻

所以”变傻”和数据量/多样性强相关。数据少时尤其要小心。

4. 如何缓解”变傻”

方法 原理 实施要点
混入通用数据 保持原分布的梯度方向 SFT 数据中加 10-30% 通用对话
降低学习率 更新幅度小,不远离原分布 通常 1e-5 或更低
控制 epoch 防止过度拟合 SFT 分布 通常 1-2 轮
用 LoRA 冻结原参数,只改少量方向 r=8-16 通常足够
DPO/RLHF 后续 用偏好数据纠正 SFT 的偏差 需要高质量偏好数据

5. 面试官常见深挖追问

  • ”SFT 后模型回答变短了,怎么诊断和解决?”
    • 答:诊断:统计 SFT 数据中的 response 长度分布,如果训练数据中回答普遍偏短,模型就学到了”短回答=正确”。解决:1)在 SFT 数据中加入长回答样本;2)训练时对短回答加惩罚(或长回答加奖励);3)用 RLHF/DPO 阶段纠正长度偏差。
  • ”如果 SFT 数据全是'好的回答',没有'坏的回答',会有什么问题?”
    • 答:模型只学到了”什么是对的”,但没学到”什么是错的”。这导致两个问题:1)模型对错误输入也可能一本正经地回答;2)模型缺乏”拒绝回答”的能力(如面对有害请求时不会说”不”)。解决:加入负面示例和拒绝回答的训练样本。
  • ”SFT 后模型在训练集上的 accuracy 很高,但在真实用户测试上很差,这是什么问题?”
    • 答:这是训练-测试分布不匹配。可能原因:1)SFT 数据的 instruction 风格过于统一,真实用户提问方式多样;2)SFT 数据没有覆盖真实场景的 edge case;3)训练时过拟合到了表面模式(如特定关键词)。解决:增加 instruction 多样性、做对抗性数据增强、控制过拟合。

#44. 灾难性遗忘在微调里是怎么发生的,你会怎么缓解?

#标准答案

灾难性遗忘的本质是:模型在新任务上更新得太猛,参数被强行推向一个更窄的新分布,结果把原先在通用语料或旧任务上学到的能力覆盖掉了。典型诱因包括:新数据太单一、学习率过高、训练步数过长、全参数微调改动范围太大。

缓解方法也要围绕“别让更新过猛”来设计,例如混入通用数据防止分布塌缩、减小学习率、控制 epoch、优先用 PEFT、做多任务训练,或者加一些保持原能力的正则项。回答时最好讲成“为什么会忘”和“怎么减缓这个忘”,而不是只背方法名。


#深度解析

1. 遗忘的数学直觉

模型参数空间是高维的。预训练让模型落在一个"通用能力"的局部最优附近。微调时,梯度方向被新任务数据主导,参数沿着新任务的损失梯度下降。如果学习率太大或步数太多,参数会"走太远",离开原来的局部最优,进入新任务的区域,旧能力就被"覆盖"了。

想象一个二维参数空间的等高线图:预训练在 A 点(通用能力高),新任务的最优在 B 点。从 A 直接走到 B,可能经过一片"旧能力很低"的区域。

2. 具体缓解策略及原理

策略 原理 适用场景 代价
混入通用数据 保持旧任务梯度方向的存在,防止参数只被新任务拉走 数据获取容易 训练时间增加
降低学习率 每步更新更小,参数不会走太远 几乎所有场景 收敛更慢
LoRA/Adapter 只改少量参数,主体参数冻结 大多数下游任务 效果上限略低
EWC (Elastic Weight Consolidation) 给重要参数加正则约束,不让它们变化太大 多任务序列学习 需要计算 Fisher 信息矩阵
Replay Buffer 保留部分旧样本,训练时一起回放 增量学习 存储开销
知识蒸馏 用原模型当教师,新模型同时拟合新任务和旧输出 需要保留原模型 训练复杂

3. 为什么 PEFT(LoRA)能缓解遗忘?

因为 PEFT 冻结了原模型的大部分参数(~99.5%),只训练极少的 adapter 参数。原参数空间基本不动,所以旧能力被保留。Adapter 学习的是"在不动原空间的前提下,怎么扭曲输入/输出才能适配新任务"——相当于在原能力基础上做"微调增量",而不是"整体搬迁"。

4. 面试官常见深挖追问

  • "如果我必须用全参数微调,怎么最大程度减少遗忘?"
    • 答:三板斧:1)学习率降到预训练的 1/10 甚至 1/100;2)混入 10-30% 的通用数据(如预训练语料或指令数据);3)控制 epoch(通常 1-3 轮就够,不要过拟合)。如果还不行,考虑 EWC 或 L2-SP(只惩罚远离原参数的变化)。
  • "多任务训练和混合数据防止遗忘,本质区别是什么?"
    • 答:多任务训练是同时优化多个任务的目标函数,模型需要找到一个"兼顾所有任务"的参数点;混合数据只是让旧任务的梯度仍然存在,本质上还是在优化单一目标(新任务),只是数据更丰富。多任务训练更系统,但设计更复杂;混合数据更简单直接。
  • "灾难性遗忘和过拟合有什么区别?"
    • 答:过拟合是"在新任务训练集上好、测试集上差";灾难性遗忘是"在新任务上好、在旧任务上差"。一个模型可以同时不过拟合新任务,但严重遗忘旧任务。解决过拟合用 dropout、早停、数据增强;解决遗忘用参数约束、混合数据、PEFT。

#45. 什么时候应该全参数微调,什么时候应该 LoRA / QLoRA,什么时候根本不该微调?

#标准答案

判断要不要全参数微调,关键先看问题类型。若任务和底座差异非常大、对效果上限要求极高、数据和算力也充足,那全参数微调值得考虑;若任务只是中等程度适配,而且资源有限,LoRA/QLoRA 往往性价比更高。

更重要的是第三种情况:如果问题的本质其实是知识更新、证据追溯或外部文档约束,那很多时候根本不该先微调,而应该先做 RAG。因为这时你需要的是”让模型能查到最新知识”,不是”把知识硬塞进参数”。


#深度解析

1. 决策树:什么时候用什么方法

问题分析:
├─ 需要注入的是知识/事实?
│   ├─ 知识经常变化? → RAG(知识在库中,随时更新)
│   └─ 知识固定且量大? → Continue Pretraining
├─ 需要注入的是行为/风格/格式?
│   ├─ 数据充足(10K+)且算力够? → 全参数 SFT
│   └─ 数据少或算力受限? → LoRA / QLoRA
└─ 底座和任务差异极大?
    └─ 全参数微调(但成本极高)

2. 三种方法的资源消耗对比

以 7B 模型为例:

方法 可训练参数 显存需求 训练时间 存储成本
全参数微调 7B 80-150GB 数天 每个任务一个 14GB checkpoint
LoRA (r=16) ~33M (0.5%) 20-40GB 数小时 每个任务一个 60MB adapter
QLoRA (4bit) ~33M 10-20GB 数小时 每个任务一个 60MB adapter
RAG 0(不微调) 推理显存 无训练 向量库索引

3. 全参数微调的适用边界

真正需要全参数微调的场景很少:

  • 底座和目标任务分布差异极大(如通用模型 → 特定生物医学领域)
  • 追求绝对效果上限(如竞赛、研究 SOTA)
  • 数据量极大(如 100M+ 条高质量领域数据)

大多数业务场景(如客服、写作助手、代码补全)LoRA 足够。

4. “不该微调”的场景

场景 原因 正确做法
知识经常更新 微调后知识仍滞后 RAG + 定期更新索引
需要证据溯源 微调后模型”编造”来源 RAG(retrieval 结果可作为引用)
数据量极小(<100 条) 过拟合严重 prompt engineering / few-shot
多租户/多任务 每个任务一个微调模型,维护成本爆炸 RAG + 共享底座

5. 面试官常见深挖追问

  • ”如果 LoRA 效果不够好,什么时候该升级到全参数微调?”
    • 答:先排查 LoRA 效果不好的原因:1)rank 太小 → 尝试 r=64/128;2)只加了 Q/V 投影 → 尝试所有 attention 层 + FFN;3)数据质量差 → 清洗数据;4)学习率不对 → 调参。如果这些都试过仍不够,且业务确实需要那最后 1-2% 的提升,才考虑全参数微调。
  • ”一个公司有 100 个业务场景,每个都用 LoRA 微调,怎么管理?”
    • 答:用”底座 + 多个 adapter”的架构。底座共享(7B),每个场景一个 adapter(60MB)。推理时动态加载对应 adapter:1)内存节省:底座常驻显存,adapter 按需加载;2)快速切换:换场景只需加载几十 MB;3)独立迭代:每个场景的 adapter 可以独立训练、独立版本管理。
  • ”RAG 和微调可以一起用吗?什么顺序?”
    • 答:可以,而且常常一起用。典型顺序:1)先用 RAG 解决知识召回问题;2)再用 SFT/LoRA 训练模型”如何更好地利用检索到的内容”(如引用格式、信息整合风格)。RAG 解决”知道什么”,微调解决”怎么说”。

#46. 你怎么判断一个问题更适合 RAG 还是更适合 fine-tuning

#标准答案

判断 RAG 还是 fine-tuning,最核心的问题是:你要改的是模型“知道什么”,还是“怎么做事”。如果知识经常变化、需要引用外部证据、要求答案可追溯,那更偏向 RAG;如果你想改变的是输出风格、任务流程、工具使用习惯、拒答边界,那更偏向微调。

很多真实系统并不是二选一,而是组合使用:用 RAG 解决"知识从哪里来",用 fine-tuning 解决"模型拿到知识后怎样按业务规则表达出来"。这句话说出来,通常就已经比单纯选边站成熟很多。


#深度解析

1. RAG vs Fine-tuning 的本质分工

维度 RAG Fine-tuning
改什么 知识来源(外部检索) 模型行为(参数更新)
更新速度 实时(改索引即可) 慢(需重新训练)
证据溯源 有(retrieval 结果可展示) 无(知识在参数中)
数据需求 文档库 成对的训练数据
成本 索引 + 推理 训练 + 部署
风险 检索失败 → 回答错误 训练数据偏差 → 行为偏差

2. 决策矩阵:具体问题具体分析

问题诊断:
├─ 模型"不知道"正确知识?
│   ├─ 知识经常更新? → RAG
│   ├─ 知识固定但量大? → Continue Pretraining + RAG
│   └─ 知识在训练数据中已有? → 检查 retrieval 质量
├─ 模型"知道"但"说不好"?
│   ├─ 格式不对? → SFT
│   ├─ 风格不对? → SFT
│   └─ 安全边界不对? → RLHF/DPO
└─ 两者都有?
    └─ RAG + Fine-tuning 组合

3. 组合使用的典型架构

用户 Query
    ↓
[Query Rewrite] → 优化检索 query
    ↓
[Retrieval] → 从知识库召回相关文档
    ↓
[Rerank] → 精排,选出最相关的 top-k
    ↓
[Prompt Construction]
    "基于以下资料回答问题:[文档1]...[文档k]\n问题:{query}"
    ↓
[LLM Generation] ← 这里可以用 SFT 过的模型
    ↓
[后处理] → 引用检查、格式校验

SFT 的作用:让模型更擅长"利用检索到的内容"——如正确引用、不 hallucinate、按指定格式整合多段信息。

4. 常见误区

误区 真相
"RAG 比微调高级" 两者解决不同问题,不是替代关系
"微调后就不需要 RAG 了" 微调的知识仍滞后于训练数据,无法实时更新
"RAG 可以替代所有知识注入" RAG 检索失败时模型可能 hallucinate,需要 fallback
"先微调再 RAG" 通常先 RAG 看效果,不够再微调,避免过度工程

5. 面试官常见深挖追问

  • "如果 RAG 检索到的文档有错误,模型会跟着错吗?"
    • 答:很可能。模型倾向于"忠实"于 prompt 中提供的上下文(尤其是经过 SFT 训练的模型)。如果检索到错误文档,模型可能直接引用错误信息。缓解:1)reranker 过滤低质量文档;2)多源交叉验证;3)模型输出置信度评估;4)人工审核高风险答案。
  • "微调后的模型做 RAG,和直接用底座做 RAG,有什么区别?"
    • 答:微调后的模型更擅长:1)遵循指令格式(如"基于资料回答");2)正确引用和总结检索内容;3)拒绝回答检索不到的问题(而不是 hallucinate)。底座模型可能忽略 prompt 中的检索资料,直接凭参数记忆回答。
  • "一个系统同时需要实时知识(RAG)和特定行为(SFT),怎么设计训练流程?"
    • 答:1)底座模型;2)通用 SFT(学会对话格式、安全边界);3)领域 SFT(如果有领域特定行为);4)上线时接入 RAG(实时知识)。注意:SFT 阶段就要包含"基于资料回答"的训练样本,让模型学会利用检索内容。

#47. RLHF、DPO、IPO、ORPO 这类方法的共同目标是什么,它们训练信号差在哪里?

#标准答案

RLHFDPOIPOORPO 这些方法虽然训练形式不同,但共同目标都一样:让模型输出更符合人类偏好,而不是只拟合原始语料分布。它们关心的是“哪种回答更受欢迎、更有帮助、更安全”,而不只是下一个 token 的似然。

差别主要在训练信号怎么构造。有的方法显式训练 reward model,再用 RL 去追奖励;有的方法直接从偏好对出发优化相对概率;还有的方法在目标函数里做更稳定或更简洁的改写。所以面试里可以先讲共同目标,再讲信号差异,这样结构更清楚。


#深度解析

1. 四种方法的训练信号对比

方法 训练信号 是否需要 Reward Model 是否需 RL 核心公式/思想
RLHF 人类偏好 → RM 打分 → PPO 优化 L_PPO = E[min(ratio·A, clip·A)] - β·KL
DPO 人类偏好 → 直接优化策略 L_DPO = -log σ(β·log(π_w/π_ref) - β·log(π_l/π_ref))
IPO 人类偏好 → 更稳定的离线优化 在 DPO 基础上加正则,防止过拟合到偏好对
ORPO 偏好 + SFT 合并在一步 把 odds ratio 直接加入 SFT loss,无需参考模型

2. 从 RLHF 到 DPO:为什么可以去掉 Reward Model?

DPO 的核心洞察:在 Bradley-Terry 模型假设下,最优策略和 reward 之间存在一一对应关系。

RLHF 路径:
偏好数据 → 训练 RM → PPO 优化策略 → 策略最大化 RM 分数

DPO 路径:
偏好数据 → 直接优化策略(策略本身隐含 reward)

数学上,DPO 证明了:给定参考模型 π_ref,满足 KL 约束的最优策略 π* 可以直接从偏好数据中学到,不需要显式建模 reward。

3. 四种方法的适用场景

场景 推荐方法 原因
数据充足、算力充足、追求最佳效果 RLHF 表达能力最强,但工程最复杂
偏好数据少、不想训练 RM DPO 简单直接,效果接近 RLHF
偏好对噪声大、担心过拟合 IPO 正则化更强,对噪声更鲁棒
极简工程、一步完成 SFT+对齐 ORPO 不需要参考模型,显存省

4. 各方法的工程复杂度排序

复杂度从高到低:
RLHF (需训练 RM + PPO,3 个模型同时驻留显存)
  > DPO (需参考模型 π_ref + 策略模型,2 个模型)
  > IPO (同 DPO,但正则化更稳)
  > ORPO (只需 1 个模型,SFT 和对齐一步完成)

5. 面试官常见深挖追问

  • "DPO 为什么说不需要 Reward Model,它的假设是什么?"
    • 答:DPO 假设人类偏好服从 Bradley-Terry 模型:P(y_w > y_l) = σ(r(y_w) - r(y_l))。在这个假设下,可以推导出:最优策略 π* 和 reward r 之间存在闭式解。因此不需要显式训练 RM,直接从偏好数据优化策略即可。但这个假设也意味着:如果偏好数据不满足 BT 模型(如存在循环偏好 A>B>C>A),DPO 效果会下降。
  • "RLHF 和 DPO 的效果差距有多大?"
    • 答:论文报告和实践经验显示:在相同偏好数据上,DPO 通常能达到 RLHF 90-95% 的效果,但训练成本低 50-70%。差距主要来自:RLHF 的 online 采样能探索更多回答空间,而 DPO 是 offline 的(只在给定偏好对上优化)。如果偏好数据覆盖好、质量高,DPO 足以替代 RLHF。
  • "ORPO 为什么不需要参考模型?"
    • 答:ORPO 把 SFT 和对齐合二为一。它的 loss 有两部分:1)SFT loss(标准 next-token prediction);2)odds ratio loss(让 chosen 回答的 odds 大于 rejected)。因为 odds ratio 是基于当前策略自身计算的,不需要额外的参考模型 π_ref。这使得 ORPO 的显存需求最低,但理论上对齐强度也略弱于 DPO。
  • "IPO 相比 DPO 改进了什么?"
    • 答:DPO 有一个已知问题:当策略模型对 chosen 和 rejected 的回答概率都接近 0 或都接近 1 时,梯度信号会消失或爆炸。IPO 通过修改 loss function,在这些极端情况下仍保持稳定的梯度。简单说,IPO 是 DPO 的"更稳版本"。

#48. 如果偏好数据很少、很贵,你还会怎么做对齐?

#标准答案

如果偏好数据很少、很贵,第一反应不应该是“那就硬凑更多”,而是先把现有数据价值榨干。常见做法包括:提高数据筛选质量、优先覆盖最关键场景、让强模型给出辅助反馈、做蒸馏、增加规则约束,或者先搭出评测闭环,让少量偏好数据真正打在高价值问题上。

换句话说,偏好数据稀缺时,重点不是追求表面数量,而是提高每条数据的监督密度和业务价值。很多时候,把范围收缩到几个核心场景,反而比泛泛全覆盖更有效。


#深度解析

1. 偏好数据稀缺时的策略矩阵

策略 适用场景 代价 效果上限
数据增强 现有数据质量好但少 低(自动扩展)
强模型蒸馏 有 API 访问强模型(GPT-4/Claude) API 费用 中高
合成偏好对 有 SFT 模型可采样 计算成本
规则/约束对齐 安全边界、格式约束明确 维护成本 低-中
自举(Bootstrapping) 有少量种子数据 迭代周期长

2. 强模型蒸馏:最实用的捷径

步骤:

  1. 用少量高质量 prompt,让 GPT-4/Claude 生成多个回答
  2. 用 GPT-4 做 judge,给回答打分/排序
  3. 把 (prompt, chosen, rejected) 三元组作为 DPO 训练数据
成本估算:
- 生成:1000 条 prompt × 2 个回答 × $0.01 = $20
- 评判:1000 条 × $0.005 = $5
- 总成本:~$25 获得 1000 条偏好对

相比人工标注($1-5/条),成本降低 50-200 倍。

3. 合成偏好对:用模型自己生成

如果只有 SFT 模型,没有强模型 API:

  1. 对每个 prompt,用 SFT 模型采样 4-8 个回答(temperature > 0)
  2. 用 reward model 或规则打分(如:格式正确 +1,有引用 +1,长度适中 +1)
  3. 选最高分和最低分组成偏好对

局限:SFT 模型采样的回答质量可能都不够高,偏好对的"区分度"有限。

4. 规则约束:不用偏好数据也能对齐

对于安全/格式类约束,可以用规则直接惩罚:

  • 输出包含敏感词 → 直接给低分
  • 格式不符合 JSON schema → 直接给低分
  • 回答长度超出限制 → 直接给低分

这种方式不需要偏好数据,但只能处理"可规则化"的约束,无法捕捉 subtle 的人类偏好。

5. Self-Play / Iterative DPO:自举提升

迭代循环:
1. 用当前模型采样回答
2. 用当前 reward model / judge 打分
3. 选高分 vs 低分构建新偏好对
4. 用新数据训练 DPO
5. 重复 1-4

SPIN、Self-Rewarding Language Models 等论文证明了这种自举的有效性——模型通过自我对抗不断提升。

6. 面试官常见深挖追问

  • "蒸馏 GPT-4 的偏好数据,会不会有 legal 问题?"
    • 答:取决于使用条款。OpenAI 的服务条款禁止用输出开发竞争模型。但用自己的模型生成 + 自己的 judge,或开源模型(如 Llama)做教师,没有这个问题。实际工程中,建议用自己的 SFT 模型做采样,配合规则/人工审核,避免法律风险。
  • "如果只有 100 条人工偏好数据,怎么最大化利用?"
    • 答:1)数据筛选:只保留"区分度大"的 pair(即 chosen 和 rejected 差距明显);2)数据增强:对 prompt 做 paraphrase,扩展 3-5 倍;3)小学习率 + 早停:防止过拟合;4)结合规则约束:人工数据捕捉 subtle 偏好,规则处理明确约束;5)冷启动后启动合成数据流水线。
  • "DPO 对偏好数据质量敏感吗?"
    • 答:非常敏感。DPO 的假设是:chosen 确实比 rejected 好。如果数据有噪声(如 chosen 实际更差),DPO 会强行拉大概率差距,导致模型学到错误偏好。建议:1)人工审核 top 20% 的关键 pair;2)用一致性检查(多个 judge 是否都选同一个);3)过滤掉"平局"pair(chosen 和 rejected 质量太接近)。