把训练拆成数据、更新、并行与反馈四份合同
这套题不把“训练”画成一条算法名流水线,而是分开追踪数据版本与监督分母、一次 optimizer step 的数值状态、跨 rank 的参数与 collective,以及后训练的示范、偏好、奖励和 rollout。四份合同对齐后,才谈效果、显存和成本。
先看整套知识的坐标,再逐题理解
这不是背答案清单。先用地图确认概念之间的依赖,再沿“白话直觉 → 核心结论 → 原理与取舍 → 常见误区”阅读每个知识点。
先看关键链路,单个知识点才不会变成碎片
面试官追问的方向,往往就是这张图里的下一根箭头:输入怎样变化、状态存在哪里、哪一步最贵、失败怎样被验证。
换一个关键词,或切回“全部章节”。
训练之前,先说清模型到底在学什么
高质量回答会把“更多数据”拆成来源、去重、采样和目标函数,而不是默认所有 token 的价值相同。
预训练数据为什么要去重、过滤和做采样配比?#
先用大白话把它讲明白
先分开四件事:quality filtering(质量过滤)处理乱码、模板垃圾等;deduplication(去重)处理语料内部重复;decontamination(去污染)查训练集与评测集重叠;provenance / rights review(来源与权利审计)记录抓取来源、时间、许可与适用政策。它们不能用一个“清洗率”互相替代。
去重论文同时研究近似文档重复与长重复子串:对 C4 等语料去重后,模型逐字复现训练文本的频率降低约 10 倍,并发现标准数据集超过 4% 的验证集受 train–test overlap 影响。数字来自该 2022 实验,不是所有语料的固定比例。
领域采样决定每个 optimizer step 看见哪些 token。RefinedWeb 报告从 Common Crawl 过滤、去重得到 5T token,并公开 600B token 子集,说明网页数据可形成强基线;它不证明“网页越多越好”,也不替代目标分布、权利与隐私审计。
我会把来源/权利、质量过滤、语料内去重、评测去污染、split 和领域采样分别版本化。去重减少重复记忆与无效计算,去污染保护评测可信度,采样塑造能力分布;阈值过强会误删复现、固定短语或低资源语言,所以必须按域报告保留率与误删样本。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
近似文档去重常把文本表示成 shingles,用 MinHash/LSH 召回候选,再以 Jaccard 等规则确认;长逐字子串还可用 suffix array(后缀数组)等不同方法。算法、规范化和阈值都属于数据版本,不能只记一个“已去重”布尔值。
评测去污染要冻结 evaluation snapshot,再查题干、答案与可恢复改写。GPT-3 训练前过滤搜索的是 benchmark 与训练语料的 13-word n-gram(13 词片段)重叠,但论文披露该过滤因 bug 只完成了一部分;事后 clean subset 又按数据集用 5% 分位样本长度选择 N,并把 N 限在 8–13 词,短合成任务另有例外。因此“GPT-3 就是固定 13-gram”只是一句近似概括。语料内重复与 train–test contamination 仍是两套集合关系。
Jaccard(A,B)=|A∩B|/|A∪B|(shingle 集合示意;不是唯一去重判据)工程取舍
更严格阈值减少重复却可能损伤多样性;提高代码、数学或小语种采样会改变其他领域的有效 token 份额。决策应同时看按域保留率、重复簇大小、污染命中、下游质量与记忆风险。
常见误区
“总 token 更多”不是独立信息量更多;“做过去重”也不等于评测无污染、数据有权使用或没有个人信息。四份证据要分别验收。
面试官可能继续问
追问:为什么 MinHash 不适合替代所有长子串检测?split 前怎样把重复簇放到同一侧?多语言去重怎样避免跨语种误杀?
Next-Token Prediction 的 loss 是怎样算出来的?#
先用大白话把它讲明白
对 token 序列 x₀…x_T,输入通常取 x₀…x_{T−1},标签取右移后的 x₁…x_T。每个位置输出 V 个 logits;实现用 log-sum-exp 直接得到真实标签的负对数似然,不必先物化一个可能下溢的概率。
Loss Mask m_t 决定哪些标签进入分子与分母:Padding、跨样本边界或 SFT 的 Prompt token 可被忽略。若一个 batch 只有 900 个有效标签,mean loss 的 N 就应是 900,而不是 batch size、固定序列长度或样本数。
Teacher forcing(教师强制)让每个标签都条件于真实前缀,配合 causal mask 可并行算整段;自由生成则会条件于模型自己采样的历史。因此训练 NLL 是清晰目标,却不能单独替代闭环生成评测。
把序列右移一位,针对每个有效标签计算 −log softmax(logits) 的真实类项,再除以有效标签数。Mask 同时改变监督分子和归一化分母;Teacher forcing 允许整段并行,但生成时前缀来自模型自己,仍要做 rollout 级验收。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
若真实 token 概率从 0.1 升到 0.2,单位置 NLL 从 −ln0.1≈2.303 降到 −ln0.2≈1.609,即使它仍不是 Top-1,交叉熵也已经改善。
Perplexity(PPL,困惑度)是同一 token-level NLL 口径的指数。Tokenizer 会改变 token 数和切分,因此跨 tokenizer 直接比 PPL 通常不公平;至少固定文本、tokenizer、BOS/EOS、滑窗和 mask 口径。
Gradient accumulation(梯度累积)与 DDP 下的目标仍应是整个 effective batch 的 NLL 总和除以全局有效标签总数。各 micro-batch 或 rank 先做 local mean 再等权平均,只在有效标签数相等时等价。vanilla DDP 还会平均各 rank 梯度:可在反传前按全局计数正确缩放 local sum(同时补偿 world size),也可交给明确支持 token-weighted reduction 的框架;不能只把每个 local mean 除以 accumulation steps。
L_global=−Σ_{r,k,t}m_{rkt}·logp_{rkt}/Σ_{r,k,t}m_{rkt};PPL=exp(L_global)工程取舍
Token mean 让长样本贡献更多监督位置;sample mean 会先按样本平均再聚合,两者在变长 batch 中并不等价。领域重加权、packing 与截断还会继续改变“一个 token 有多大权重”。
常见误区
Cross Entropy 不是只检查 argmax,也不是“每条样本、每个 micro-batch 或每个 rank 先平均”这一种固定实现。先问 reduction、ignore_index、packing、DDP 归约与有效 token 分母。
面试官可能继续问
追问:vanilla DDP 平均梯度时,为什么用 local summed NLL / global token count 还要补偿 world size?跨 tokenizer 比较为什么可考虑 bits-per-byte?
Loss 会下降,不等于训练系统就是稳定的
学习率、权重衰减和数值精度共同决定更新质量。面试时要能分清“数学更新”“精度表示”和“故障检测”。
AdamW 为什么把 Weight Decay 从梯度里“解耦”?#
先用大白话把它讲明白
Adam 用一阶矩 m 与二阶矩 v 对损失梯度逐参数缩放。若把 λw 直接加进梯度,正则项也会经过 1/(√v̂+ε) 的自适应预条件,不再等价于经典 weight decay(权重衰减)的统一乘法收缩。
AdamW 把损失梯度更新与 decay 分开,可写成先把旧参数乘 (1−η_tλ),再减 Adam 方向。注意每步实际收缩仍含学习率 η_t;换 cosine schedule 或 step 数会改变累计 decay,所谓“解耦”不是让 λ 与学习率物理无关。
Bias、Norm scale 或 embedding 是否不 decay 是 parameter group(参数分组)配置,不是 AdamW 定理。生产记录必须包含参数名到 group、学习率/decay schedule、β、ε 与 optimizer 实现版本。
AdamW 解耦的是更新路径:损失梯度先由 Adam 的 m̂/v̂ 预条件,decay 则直接作用于旧参数,不经过 v̂。它恢复了乘法衰减语义,但单步收缩仍是 η_tλ,因此学习率日程、训练步数和参数分组都要一起报告。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
忽略最大化模式与 AMSGrad 时,代表性更新为 w_t=(1−η_tλ)w_{t−1}−η_t·m̂_t/(√v̂_t+ε)。fused/foreach 实现可以重排计算,但应匹配这一算法合同。
若无梯度项,T 步后的权重约乘 Π_t(1−η_tλ),小步长下约为 exp(−λΣ_tη_t)。这直接说明相同 λ 配不同总学习率面积,不会产生相同累计衰减。
w_t=(1−η_tλ)w_{t−1}−η_t·m̂_t/(√v̂_t+ε)工程取舍
AdamW 常为每个可训练参数保留 m、v,并可能有 FP32 参数副本,模型状态成本高;状态量化或分片可省显存,但需重新验收数值、通信与恢复。Warmup 是另一个经验性 schedule 选择,不能从“用了 AdamW”自动推出。
常见误区
“AdamW 就是把 L2 项写进 loss 的更快实现”错误;在自适应优化器里两者更新不同。反过来,“解耦后 λ 完全不受学习率影响”也错误。
面试官可能继续问
追问:cosine LR 下总 decay 怎样由 Ση_t 决定?Norm/Bias 排除依据怎样用 ablation 验证?恢复 checkpoint 时漏 optimizer state 会发生什么?
混合精度训练为什么要 Loss Scaling?BF16 和 FP16 怎样选?#
先用大白话把它讲明白
Autocast(自动混合精度)按算子选择 FP16/BF16 或 FP32;它不等于“整个模型强转半精度”。FP16 有 5 位 exponent(指数)与 10 位 fraction(小数),最大有限值 65,504,小梯度也可能下溢;BF16 有 8 位 exponent、7 位 fraction,动态范围接近 FP32,却牺牲更多尾数精度。
FP16 loss scaling 把 loss 乘 S 再反传,使小梯度暂时落进可表示区间;更新前必须除回 S。PyTorch GradScaler 若检测到 inf/NaN 会跳过该 optimizer step、缩小 scale;scale 甚至可能低于 1,因此它不只是“不断放大小梯度”。
做 gradient accumulation(梯度累积)时,同一个有效 batch 内应保持 scale 不变;累积完成后只 unscale 一次,再检查有限值、按未缩放梯度裁剪、step 和 update scale。BF16 通常不需要 FP16 式 scaling,但是否稳定仍取决于模型、算子累积 dtype 与硬件。
混合精度有三件事:autocast 决定算子 dtype,GradScaler 保护 FP16 梯度范围,optimizer 维护更新状态。FP16 常需 scale→backward/accumulate→unscale→finite check→clip→step;BF16 范围接近 FP32、通常省掉 scaling,但尾数更短,不代表处处更精确。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
原始 mixed-precision 论文使用 FP16 权重/激活/梯度、FP32 master weights 与 loss scaling;现代 AMP 的具体参数和累积 dtype 由框架/硬件决定,不能把 2017 配方当所有 runtime 的唯一实现。
理想实数中 unscale 会恢复原梯度;有限精度中已经 overflow 的值无法靠事后除法修复,所以 finite check 必须决定本 step 是更新还是跳过。裁剪 scaled gradient 会把阈值也乘 S,语义错误。
L_s=S·L;g_s=∂L_s/∂w;g=g_s/S;finite(g) 后才 clip 与 step工程取舍
FP16 尾数更多、范围窄;BF16 范围大、尾数少。二者是否更快/更省取决于 GPU、kernel、通信 dtype 与 optimizer 状态;Softmax、Norm、reduction 等敏感路径常保留或累积为 FP32。
常见误区
“BF16 比 FP16 更精确”错误:它主要是范围更大;“用了 BF16 就不会 NaN”也错误,激活爆炸、无效数据或不稳定 loss 仍会失败。
面试官可能继续问
追问:为什么 accumulation 中途不能 update scale?一个 optimizer 跳步、另一个不跳会怎样?FP32 master weights 在哪些实现里仍存在?
模型放不下时,先确定到底要切哪一种状态
不要只背 DP/TP/PP。用“每卡存什么、每步通信什么、气泡或同步在哪里”三问,就能判断方案。
DP、TP、PP 分别切什么?怎样判断用哪一种?#
先用大白话把它讲明白
先把这里的 DP 限定为经典 replicated Data Parallel(复制式数据并行):每个 DP rank 有同一模型副本,处理不同 micro-batch,反向后同步梯度。FSDP/ZeRO 仍有数据并行语义,但不再让所有训练状态常驻复制,不能混成一句“DP 一定完整复制”。
Tensor Parallel(TP,张量并行)把同一算子的矩阵与中间张量切进一个通信组,层内常有 All-Reduce/Reduce-Scatter/All-Gather;Pipeline Parallel(PP,流水线并行)把层分成 stage,micro-batch 在 stage 间传激活与梯度。TP、PP 都可能为容量与吞吐服务,不只是“宽模型/深模型”的机械对应。
3D 并行把 DP、TP、PP 组合,但放置依拓扑:高频 TP collective 常优先留在高速域,PP 还要平衡每 stage 计算与激活字节。Sequence Parallel/Context Parallel 又切序列相关激活,必须说明绑定哪个 process group。
经典 DP 切样本并同步梯度,TP 切层内算子,PP 切层与调度。选择时列每 rank 常驻状态、每层/每 step collective、激活传输、全局 batch 和 PP 气泡,再映射到 NVLink/网络拓扑;实际常组合,而不是只按参数量选一个缩写。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
若每个 DP replica 每次 optimizer step 消化 m 个独立 micro-batch、每个含 b 条序列,则 B_global=b·m·d_DP;TP/PP degree 不增加独立样本数。变长训练还应另外记录 global non-padding tokens。
在各 stage 等速的简化 synchronous flush schedule 中,p 个 stage、m 个 micro-batch 会产生 (p−1) 份 fill/drain 时间:相对理想计算时间的 bubble overhead 是 (p−1)/m;若问它占含气泡总迭代时间的比例,才是 (p−1)/(m+p−1)。基础非交错 1F1B 与 GPipe 的 flush bubble 相同,但把待反传的在途 micro-batch 从 m 个压到最多 p 个;interleaving 才进一步缩短气泡,同时改变通信。
B_global=b_micro·m_per_step·d_DP;bubble/ideal=(p−1)/m;bubble/total=(p−1)/(m+p−1)工程取舍
更大 TP 降单 rank 权重/计算份额,却放大层内延迟敏感通信;更大 PP 降每 rank 层数,却增加边界传输、负载均衡与调度复杂度;增大 m 可摊气泡,也会改变激活内存与有效 batch。
常见误区
“GPU 总数=全局 batch 的乘数”错误。只有承载独立样本副本的 DP 维度进入该公式;把 TP、PP 再乘进去会把同一批样本重复计数。另一个常见错误是不给分母就只报一个“气泡率”。
面试官可能继续问
追问:为什么基础 1F1B 省激活却不改变 flush bubble?Sequence Parallel 与 Context Parallel 各切哪类张量?怎样避免 TP 跨慢链路?
ZeRO 的三阶段各分片什么?它和 Tensor Parallel 是一回事吗?#
先用大白话把它讲明白
ZeRO 针对数据并行组内的模型状态冗余:Stage 1 分 optimizer states;Stage 2 再分 gradients;Stage 3 再分 parameters。TP 则让同一层的计算本身由多 rank 共同完成;两者可组合,但通信时机和语义不同。
用一个明确但非通用的 mixed-precision Adam 账本:每参数 FP16 权重 2B、FP16 梯度 2B、FP32 master weight+m+v 共 12B,未分片是 16B/参数。7B 参数约 112GB(十进制),尚未算激活、临时 unshard、通信 buffer 与碎片。
在 D=8 的理想均匀分片下,Stage 1 约 4P+12P/D=38.5GB/rank,Stage 2 约 2P+14P/D=26.25GB/rank,Stage 3 约 16P/D=14GB/rank。真实 optimizer dtype、padding、模块粒度和峰值 all-gather 会改变数字,所以公式必须和账本假设一起说。
ZeRO-1/2/3 依次分 optimizer、再分 gradient、再分 parameter;它保留数据并行语义,不等于切算子的 TP。7B、D=8 在 16B/参数的教学账本下,常驻模型状态从 112GB 理想降到 38.5/26.25/14GB 每 rank,但激活与临时 unshard 峰值另算。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
截至 2026-07-15,PyTorch FSDP2 的前端名称是 fully_shard;FULL_SHARD 是 FSDP1 的 ShardingStrategy 枚举,不能混称。FSDP2 会分参数、梯度与 optimizer state,模块计算前 all-gather 参数,梯度计算后 reduce-scatter;reshard_after_forward=True 会在前向后释放完整参数、反向前再 gather,False 则以更高内存换掉这次 gather。默认 None 对非 root 模块取 True、root 取 False。它与 ZeRO-3 思想相近,但 DTensor 表示、API、调度与 checkpoint 合同不等同。
原始 ZeRO-Offload 的具体最优策略把 gradients、optimizer states 与 optimizer computation 放到 CPU,参数及前后向仍在 GPU;利用 GPU、CPU 与 NVMe 三层存储的是 ZeRO-Infinity。把两者都简称“Offload 到 CPU/NVMe”会张冠李戴。Activation checkpointing 则丢弃并重算前向激活,省的是另一笔账。
基准≈16P;Z1≈4P+12P/D;Z2≈2P+14P/D;Z3≈16P/D(指定账本)工程取舍
更高 stage 降常驻状态,却增加参数物化、collective 排程和分片 checkpoint 复杂度;CPU/NVMe 扩容量却受 PCIe、内存/存储带宽与预取命中影响。小模型或慢网络上,通信可能比节省更贵。
常见误区
“ZeRO-3 每 rank 永远只出现 1/D 参数”错误。计算前仍要按模块物化所需参数;常驻分片量、瞬时峰值和通信量是三本不同账。把 FSDP2 直接叫 FULL_SHARD 也是版本术语混用。
面试官可能继续问
追问:复算 7B、D=8 三阶段数字;FSDP2 的 reshard_after_forward=False 换来什么;activation checkpointing 为什么不能替代 ZeRO?
SFT 教“怎么答”,偏好优化教“哪种答法更好”
对齐不是一个算法,而是一组不同监督信号。回答时先说明数据形式,再说明目标函数,最后说在线采样、稳定性与评测边界。
SFT 和预训练有什么相同与不同?为什么要做 Prompt Masking?#
先用大白话把它讲明白
SFT(Supervised Fine-Tuning,监督微调)与因果预训练都可用 teacher-forced next-token cross entropy;变化的是样本结构、监督位置、数据分布和更新范围。SFT 可以学格式与行为,也可能写入领域知识或任务技能,不能只说成“教语气”。
Completion/assistant-only mask 会把 Prompt、system/user 或不希望监督的 role 标签设成 ignore_index;这些 token 仍作为 Attention 可见条件。真正参与梯度归一化的是 assistant 有效 token,因此“删标签”与“删输入”完全不同。
截至 2026-07-15 的 TRL 文档中,completion_only_loss=None 的默认行为依 dataset type 而变:prompt-completion 数据只算 completion,language-modeling 数据算完整序列;assistant_only_loss 默认 False,开启时要求 conversational dataset 与能返回 assistant mask 的 chat template(模板用 generation/endgeneration 标记)。多轮究竟监督所有 assistant turns、最后一轮还是特定 tool role,仍必须由模板与数据合同明确,不能靠字符串碰运气。
SFT 常沿用因果 LM Loss,但把示范对话和 Loss Mask 变成新的监督合同。Prompt 仍在输入上下文中,只把非目标位置从 loss 分子与分母排除;模板、role mask、EOS、packing 边界和推理时格式必须逐 token 对账。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
令 a_t=1 表示被监督的 assistant token,则 L_SFT=−Σa_t logπθ(y_t|context,y_<t)/Σa_t。若各 micro-batch 或 rank 的有效 token 数不同,先局部 mean 再简单平均会给它们不同权重;需要按整个 effective batch 的全局 supervised-token 分母聚合。
InstructGPT 的“示范 SFT → 偏好/RL”是代表性配方,不证明所有 SFT 都使用同一种 Prompt mask。框架默认值会随 dataset type 与版本改变,所以 source snapshot、chat template、tokenizer、collator 与训练配置必须同 checkpoint 一起保存。
L_SFT=−Σ_{r,k,t}a_{rkt}·logπθ(y_{rkt}|x,y_{<t}) / Σ_{r,k,t}a_{rkt}工程取舍
Assistant-only 更聚焦交付行为,也放弃对 Prompt token 的直接 LM 监督;full-sequence 更像 continued pretraining。选择取决于目标,关键是同条件比较并检查模板错位、截断和每类 role 的有效 token 占比。
常见误区
Prompt masking 不是 Attention mask,也不是从上下文删除 Prompt;它只控制哪些标签产生 loss。把两种 mask 混用会直接改模型可见信息。
面试官可能继续问
追问:chat template 少一个 EOS 会怎样?packing 后怎样阻断或声明跨样本注意力?不同 rank 的 assistant token 数不等时怎样做全局 token mean?
经典 RLHF 的三步是什么?Reward Model 在学什么?#
先用大白话把它讲明白
以 InstructGPT 为代表的三阶段是:示范数据做 SFT;对同一 Prompt 的多个回答收集排序并训练 Reward Model(RM,奖励模型);让当前策略 rollout,再用 PPO 等 RL 算法优化 RM 奖励。它是经典实例,不是“RLHF”唯一可能流程。
Bradley–Terry 偏好模型把 y_w 胜过 y_l 的概率写成 σ(r_w−r_l)。RM 学的是给定标注准则、标注人群和采样分布下的相对排序;一个标量无法自动表达事实真伪、少数偏好、分歧或不可接受风险。
PPO-RLHF 至少要分清五个逻辑角色:current policy 参与更新,old/behavior policy 提供 rollout 与 importance ratio 分母,reference policy 定义长期 KL 锚点,RM 给反馈,value/critic 估 return baseline。old 与 reference 可能在某一刻权重相同,却不是同一职责;逻辑角色数也不等于必须同时常驻五套完整模型,工程上可共享骨干、冻结快照或缓存 log-prob。
经典 RLHF 是 SFT、成对/排序数据训练 RM、再由当前策略 rollout 并用 PPO 优化。RM 拟合相对偏好,不是绝对正确性;current/old/reference/RM/value 的职责要分开。PPO clipping 只裁剪 surrogate objective 的部分贡献,不能冒充硬信赖域;相对 reference 的 KL 要另行定义和测量。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
RM 常最小化 −logσ(r(x,y_w)−r(x,y_l))。排序可展开成 pair,但同一 prompt 的相关 pair 如何采样、tie/分歧如何处理会改变统计权重。
在线 PPO 从 old/behavior policy 收集样本,再对同一批样本做多轮 minibatch 更新并用 value baseline 降方差;clip(r_t,1−ε,1+ε) 影响目标,却不能保证优化后所有 token ratio 或整体 KL 都在某个硬区间内。独立 held-out human/safety eval 仍是发布证据。
P(y_w≻y_l|x)=σ(r_w−r_l);L_RM=−logσ(r_w−r_l)工程取舍
RM+PPO 能随策略采样并优化不可微序列反馈,却要承担 rollout、current/old/reference/RM/value 的计算、存储或 log-prob 缓存与版本一致性;过强 KL 抑制学习,过弱 KL 让策略离开 RM 有效分布并放大奖励投机。
常见误区
“RM 分数更高=回答更正确/更安全”错误;“PPO clip=策略绝不会跨出 ε”也错误;“old policy 就是 KL reference”同样错误。三者分别是代理信号、目标形状和两个不同时间尺度的策略角色。
面试官可能继续问
追问:reference 与 old policy 为什么不是同一个角色?value model 估什么而 RM 估什么?怎样用 held-out prompt、长度切片和人工复核发现 reward hacking?
DPO 与 PPO-RLHF 的根本区别是什么?什么时候不该简单替代?#
先用大白话把它讲明白
DPO(Direct Preference Optimization,直接偏好优化)在固定的 chosen/rejected 数据上训练,不显式拟合独立 RM,也不在 DPO 更新循环中让当前策略在线 rollout。它把 KL 正则化奖励最优策略与 Bradley–Terry 偏好模型结合,改写成 policy/reference log-ratio 的二分类损失。
在原始推导所出发的 RL 目标 max E[r]−β·KL 中,β 是 KL penalty coefficient(KL 惩罚系数),更大 β 对离开 reference 的惩罚更强;代入 DPO 后,同一个 β 又乘在二分类 logit 上,改变损失温度与梯度。有限数据、有限模型和非凸优化下,调大 β 并不保证实测 KL 单调变小,更不是“KL 必须小于某值”的硬半径。原始 DPO 显式依赖 π_ref;reference-free 是额外实现约定或变体。
原始 DPO 很适合静态完整回答偏好,但不会凭空获得环境转移、在线探索或步骤信用。轨迹也能做成成对样本,然而若动作改变后续状态,只比较扁平文本未必保留可执行环境合同。
DPO 用离线偏好对直接优化当前策略相对 reference 的 chosen/rejected log-ratio;没有独立 RM、value model 或 PPO rollout 回路。它建立在 KL 正则化与偏好模型假设上,适合固定成对反馈;需要在线探索、环境状态和细粒度信用时,不能无条件替代 RL。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
DPO margin 是当前策略相对 reference 的两个 sequence log-prob 改变量之差。它提升 preferred 的相对优势,但 sequence 长度、模板、截断与数据生成 policy 都会影响 log-prob 和离线分布错配。
DPO 论文是在 sentiment、summarization 与 single-turn dialogue 等条件下验证,不是“对所有 RLHF 任务等价 PPO”的定理。比较方法应画 reward–KL/质量–漂移 frontier,并报告实际 KL,而不是只看单点 win rate 或把 β 当成已实现的 KL 预算。
L_DPO=−logσ{β[(logπθ(y_w|x)−logπref(y_w|x))−(logπθ(y_l|x)−logπref(y_l|x))]}工程取舍
DPO 训练链短、无需在线采样;PPO/其他 RL 能随当前策略收集结果并接环境奖励,却更贵、更易漂移。选择取决于反馈形态、覆盖和交互,而不是哪个算法更新。
常见误区
“DPO 就是去掉 RM 的 PPO”错误:它没有 PPO 的 actor–critic、old-policy ratio、advantage 与 clip 回路,而是在特定假设下直接拟合一个隐式 reward 参数化。“β 越大,最终 KL 必然越小”也不是优化保证。
面试官可能继续问
追问:β 变大为什么不等于硬 KL 变小?偏好对来自旧 policy 时怎样测 support mismatch?轨迹级 pair 还缺哪份环境状态与信用信息?
GRPO、LoRA、QLoRA 各自在省什么?为什么不能放在同一维度比较?#
先用大白话把它讲明白
先分三条正交轴:GRPO(Group Relative Policy Optimization,组相对策略优化)是在线策略优化算法;LoRA(Low-Rank Adaptation,低秩适配)决定哪些增量参数可训练;QLoRA 再决定冻结基座怎样以 4-bit 存储并让梯度穿过反量化计算流向 LoRA。三者可以组合,不是三选一。
原始 DeepSeekMath GRPO 对同一问题从 old policy 采样一组输出,以 reward model 评分并做组内均值/标准差归一化,省掉独立 value/critic;目标仍包含 current/old importance ratio、相对 reference 的直接 KL、rollout 与奖励计算。current、old、reference 是三个逻辑角色,不代表实现必须同时常驻三套完整权重:可用冻结快照、缓存 log-prob 或共享基座来实现相同合同。GRPO 也不天然等于 verifier reward,规则或学习式 RM 都可能给分。
LoRA 冻结 W,只训练低秩 BA,主要省 trainable gradients/optimizer states 和每任务产物;经典 QLoRA 以 NF4 存储冻结基座,使用时通常反量化到 BF16 计算,并以 double quantization 压量化常数、paged optimizer 管峰值。LoRA 参数仍以 16-bit 等较高精度训练,不是把 adapter 也固定成 4-bit。
GRPO 省的是 PPO 的 critic 路径,但增加同题多 rollout;LoRA 省可训练参数、梯度和 optimizer state;QLoRA 还压冻结基座的存储。它们分别属于反馈优化、参数化和存储轴,可组合,但组合后 rollout KV、激活、old/reference log-prob 与 reward 成本仍在。
展开原理与工程取舍FORMULA · TRADE-OFF · FOLLOW-UP
原理拆解
LoRA 写作 W′=W+(α/r)BA,其中可训练量是 r(d_in+d_out),而原矩阵是 d_in·d_out;省多少取决于 target modules、rank、dtype 与是否还训练 embedding/norm。
原始 outcome-supervised GRPO 将同组终局 reward 标准化后作为该输出各 token 的 advantage,并用 clipped ratio 更新;若组内 reward 相同,中心化的 advantage 信号为零,但 KL 项仍可能非零。std=0 如何用 ε、跳过或重采样处理属于实现合同;组相对终局分数本身不提供步骤级因果归因。
ΔW=(α/r)BA;Â_i=(R_i−mean(R_group))/std(R_group)(std=0 需实现合同)工程取舍
小 rank 限制适配容量;4-bit 基座节省存储却引入反量化与量化误差,merge 后若再量化也会变数值;GRPO 去掉 critic 仍可能因 G 条长 rollout 成为吞吐/显存主成本。
常见误区
“GRPO 就是可验证奖励”“QLoRA 把整个训练都变成 4-bit”“只训练 adapter 就没有激活成本”“三个策略角色就一定常驻三份权重”都错误。算法、反馈、逻辑快照、可训练状态和前向存储要分别记账。
面试官可能继续问
追问:GRPO 的 reference、old policy 与 reward 各自承担什么合同、哪些可共享存储?LoRA 参数量怎样按 target matrix 手算?量化基座 merge/requantize 为什么不保证逐位一致?