4 训练与适配
4 训练与适配
Section titled “4 训练与适配”1. 精调 sft/grpo 参数有哪些?如何设置,为什么?
Section titled “1. 精调 sft/grpo 参数有哪些?如何设置,为什么?”SFT 和 GRPO 关注的超参数不完全一样。
SFT 常见参数:
- 学习率
- batch size / 梯度累积
- epoch 或 max steps
- warmup 比例
- weight decay
- max length
- LoRA 的
r / alpha / dropout
GRPO 常见参数还会多:
- rollout 数量
- 每个 prompt 的 group size
- KL 系数
beta - clip 范围
ε - reward 权重
- sampling temperature
设置原则:
- 数据少时学习率更保守,防止遗忘
- batch 小时配梯度累积,提升稳定性
- reward 噪声大时,KL 和学习率都要更保守
- 对生成任务,温度太低会影响探索,太高会让奖励方差变大
2. 精调的指标如何设置,如何判断,多个模型选哪个最优?
Section titled “2. 精调的指标如何设置,如何判断,多个模型选哪个最优?”指标要和任务目标一一对应,不能只盯一个总分。
常见做法:
- 通用质量:人工偏好、win rate、格式遵循率
- 任务效果:EM、F1、Rouge、pass@k、工具成功率
- 风险控制:幻觉率、拒答率、毒性、安全违规率
- 工程约束:时延、成本、稳定性
判断多个模型时,通常按“主指标 + 红线指标 + 成本”综合选。
如果两个模型主指标接近,我会优先选:
- 更稳定的
- 坏案例更少的
- 推理成本更低的
因为线上真实价值通常不是“平均分最高”决定的,而是“综合风险最低”。
3. 分别学习一下 PPO、DPO、GRPO:DPO 属于 on-policy 还是 off-policy,和 PPO / GRPO 有什么相似和不同,为什么会使用 DPO,DPO 又有哪些问题?
Section titled “3. 分别学习一下 PPO、DPO、GRPO:DPO 属于 on-policy 还是 off-policy,和 PPO / GRPO 有什么相似和不同,为什么会使用 DPO,DPO 又有哪些问题?”DPO 更接近 off-policy,因为它直接用静态偏好对训练,不依赖当前策略在线采样。
相似点:
- 三者都在做偏好对齐
- 都希望让更优回答概率更高
- 都常结合参考模型或 KL 约束思想
不同点:
| 方法 | 数据 | 是否在线采样 | 特点 |
|---|---|---|---|
| PPO | prompt + reward | 是 | 灵活,但链路复杂 |
| GRPO | prompt + 组内奖励 | 是 | 省 value model,但依赖组采样 |
| DPO | 偏好对 | 否 | 实现简单、稳定、省算力 |
为什么会用 DPO:
- 工程实现轻
- 不需要 reward model 在线打分
- 训练更稳,成本更低
DPO 的问题:
- 强依赖偏好对质量
- 缺少在线探索能力
- 数据分布一旦偏窄,容易把模型拉得过于单一
- 若参考模型或偏好数据有系统偏差,会被直接放大
4. 如果训练 DPO 时正例和负例的 loss 都在下降,应该如何判断这是正常现象、数据问题、参考模型问题还是优化目标设置问题?通常怎么排查和修正?
Section titled “4. 如果训练 DPO 时正例和负例的 loss 都在下降,应该如何判断这是正常现象、数据问题、参考模型问题还是优化目标设置问题?通常怎么排查和修正?”先看你说的“正例和负例 loss”具体定义。
如果是各自的 NLL 都在下降,这可能是正常现象,因为模型整体语言建模能力在变好;关键不是单独看它们,而是看 chosen 相对 rejected 的 margin 是否在扩大。
排查重点:
- 看
log p(chosen) - log p(rejected)是否提升 - 看相对参考模型的偏好边际是否提升
- 看验证集 win rate 是否同步提升
可能的问题:
- 数据问题:chosen / rejected 区分不明显,甚至标反
- 参考模型问题:reference 太弱或太强,KL 约束失衡
- 优化目标问题:
beta、学习率或样本权重设置不合适
修正思路:
- 抽样人工检查偏好对质量
- 调
beta和学习率 - 增加更难、更有区分度的偏好数据
- 区分看 chosen reward、rejected reward、pairwise accuracy,而不是只看总 loss
5. DPO 和 SFT 的区别是什么,可以先 DPO 后 SFT 吗,为什么?
Section titled “5. DPO 和 SFT 的区别是什么,可以先 DPO 后 SFT 吗,为什么?”SFT 是“学示范”,DPO 是“学偏好排序”。
区别:
- SFT 让模型模仿理想答案
- DPO 让模型更偏向 chosen 而远离 rejected
- SFT 更偏基础行为塑形,DPO 更偏对齐偏好细节
通常推荐先 SFT 再 DPO,因为:
- 没有 SFT 的底座,DPO 容易在很差的初始行为上直接做偏好拉扯
- 先学会基本回答格式,再做偏好优化更稳
可以先 DPO 后 SFT 吗:
- 可以,但一般不作为主流程
- 如果 DPO 后再做大规模 SFT,可能把偏好信号又冲淡
- 只有在需要补格式、补任务能力时,才会做小学习率的修复性 SFT
6. 如果把 DPO 用在第一轮对话中,你会如何构造偏好数据集?多轮对话场景下,数据分布通常应该怎样设计?
Section titled “6. 如果把 DPO 用在第一轮对话中,你会如何构造偏好数据集?多轮对话场景下,数据分布通常应该怎样设计?”第一轮对话的偏好数据,重点是让模型学会“第一反应应该怎么答”。
构造方式:
- 覆盖常见用户意图:问答、总结、推理、拒答、工具调用
- 每个 prompt 配
chosen / rejected - rejected 不只是“错”,也可以是啰嗦、跑题、格式错、越权回答
多轮对话场景下要额外关注分布:
- 既要有首轮,也要有追问、澄清、纠错、上下文引用
- 要覆盖短对话和长对话
- 要覆盖正常路径和异常路径,如工具失败、用户反复改口
设计原则是:训练分布要尽量贴近真实会话状态,而不是只堆“完美单轮问答”。
1. 是否知道蒸馏?具体是什么?
Section titled “1. 是否知道蒸馏?具体是什么?”知道。蒸馏本质上是让小模型学习大模型的行为,把“大模型的知识”压缩到“小模型”里。
常见做法是:
- teacher 先对样本给出软标签、logits、中间表示或推理轨迹
- student 不只学真实标签,还学 teacher 的输出分布
典型目标包括:
- logit 蒸馏:对齐 teacher 和 student 的输出分布,常用 KL
- feature 蒸馏:对齐中间层表示
- response / reasoning 蒸馏:学习更完整的回答或推理链
为什么要做蒸馏:
- 提升小模型效果
- 降低部署成本
- 保留大模型的一部分泛化能力
局限也要知道:
- teacher 的错误会被继承
- student 容量太小时,学不全
- 蒸馏数据分布如果太窄,落地泛化会差
1. r 和 是什么,一般如何设置 LoRA 的秩和缩放系数?
Section titled “1. r 和 α\alphaα 是什么,一般如何设置 LoRA 的秩和缩放系数?”LoRA 把权重更新写成低秩分解:
ΔW = BA, 其中 A ∈ R^{r×d_in}, B ∈ R^{d_out×r}这里:
r是低秩维度,决定可训练增量的容量α是缩放系数,实际常写成ΔW = (α / r) BA
设置经验:
r越大,表达能力越强,但参数量和显存也会上去α越大,增量更新影响越强- 常见起点是
r=8/16/32,α取16/32/64
工程上通常先固定一组小值,再通过验证集看是否欠拟合。
2. LoRA会对模型推理有什么影响
Section titled “2. LoRA会对模型推理有什么影响”影响分两种情况:
- 若把 LoRA 权重 merge 回原模型,推理结构不变,额外开销几乎没有
- 若不 merge,而是在线叠加
W x + ΔW x,会多一小段低秩计算
整体上:
- 参数存储更省
- 多个任务可以共享同一个 base model,只切换 adapter
- 低 rank 时额外时延通常不大
真正的推理瓶颈常还是 attention 和 KV cache,而不是 LoRA 本身。
3. LoRA 在微调的时候是加到哪里的
Section titled “3. LoRA 在微调的时候是加到哪里的”最常见是加在线性层上,尤其是 Transformer 里的投影矩阵。
常见位置:
- attention 的
q_proj / k_proj / v_proj / o_proj - FFN 的
up_proj / down_proj / gate_proj
最常见的实践是优先加在 q_proj 和 v_proj,因为这两处通常对任务适配最敏感。
是否加到所有线性层,要看:
- 显存预算
- 数据规模
- 任务复杂度
4. 具体的微调中是怎么实现的?LoRA 的初始化通常怎么做,训练 / 推理的计算复杂度如何变化,梯度这些是怎么算出来的?
Section titled “4. 具体的微调中是怎么实现的?LoRA 的初始化通常怎么做,训练 / 推理的计算复杂度如何变化,梯度这些是怎么算出来的?”实现上,冻结原权重 W,只训练低秩矩阵 A 和 B:
y = Wx + (α / r) BAx初始化常见做法:
A随机小值初始化B初始化为 0
这样初始时 ΔW ≈ 0,不会一开始就破坏 base model。
复杂度变化:
- 训练参数量从
d_out * d_in变成r(d_in + d_out) - 前向多了两次小矩阵乘法
- 反传只更新
A、B,显存和优化器状态明显更省
梯度本质上还是链式法则:
- loss 先对输出
y求梯度 - 再回传到
B和A - 冻结的
W不更新,只参与前向和梯度传播
所以 LoRA 节省的核心不是“不要反传”,而是“只训练一小部分参数”。
5. LoRA 微调的原理是什么?为什么低秩更新通常能够起作用?
Section titled “5. LoRA 微调的原理是什么?为什么低秩更新通常能够起作用?”LoRA 的假设是:很多下游任务需要的参数更新,并不需要一个完整高秩矩阵,低秩子空间里的调整就够了。
直觉上:
- 预训练模型已经学到了强表征
- 下游适配更多是在“轻微旋转和重加权”这些能力
- 所以不必重写整个权重矩阵
它能起作用的原因通常有三点:
- 预训练模型本身离目标解已经不远
- 下游任务有效更新具有低秩结构
- 低秩约束本身还有一点正则化效果,不容易过拟合
它的局限也要知道:
- 任务变化太大时,低 rank 可能不够
- 加的位置选错,适配效果会差
- 多个 adapter 叠加时要注意冲突和 merge 策略
预训练与 SFT
Section titled “预训练与 SFT”1. LLM 怎么评估,评估哪些指标?预训练和 SFT 的评估分别看什么,无幻觉率怎么评估?
Section titled “1. LLM 怎么评估,评估哪些指标?预训练和 SFT 的评估分别看什么,无幻觉率怎么评估?”LLM 评估一般分三层:训练内指标、离线任务指标、线上或人工评估。
- 训练内常看
loss、PPL、tokens/s、稳定性 - 离线常看知识、推理、代码、数学、对话、安全等 benchmark
- 应用侧还会看人工偏好、业务转化、拒答率、时延和成本
预训练更关注:
loss / PPL是否持续下降- 不同语种、领域、长度桶上的困惑度
- 通用能力 benchmark 是否随 scale 正向提升
SFT 更关注:
- 任务完成率、格式遵循率、指令跟随
- 具体任务指标,如 Rouge、F1、EM、Win Rate、人工打分
- 安全性、拒答边界、工具调用成功率
“无幻觉率”通常没有单一标准,常见做法是:
- 构造有标准答案或可检索证据的数据集
- 评估答案是否被证据支持,而不只是“像对的”
- 用 factuality / citation support / answer groundedness 指标
- 结合人工抽检,因为自动评测容易把“流畅但错误”判高
2. 什么是模型的困惑度(PPL),公式是什么
Section titled “2. 什么是模型的困惑度(PPL),公式是什么”困惑度可以理解为模型对真实序列“有多不确定”。越小越好。
对长度为 N 的 token 序列,常见公式是:
PPL = exp(- (1 / N) Σ_t log p(x_t | x_<t))等价地,也可以写成平均负对数似然的指数。
- 若模型把真实 token 概率分得更高,PPL 会更低
- PPL 适合评估语言建模本身
- 但它和最终对话体验、工具调用效果不一定完全一致
3. 预训练 / SFT 的数据清洗流程一般怎么设计?预训练数据处理通常包含哪些环节?
Section titled “3. 预训练 / SFT 的数据清洗流程一般怎么设计?预训练数据处理通常包含哪些环节?”典型流程是“采集 -> 解析 -> 过滤 -> 去重 -> 打分 -> 配比 -> 切分”。
预训练常见环节:
- 数据采集:网页、书籍、论文、代码、问答、论坛、内部语料
- 文本解析:去 HTML、抽正文、统一编码、规范化标点
- 质量过滤:长度、语言、乱码、重复、广告、模板页、低信息密度
- 安全过滤:隐私、敏感内容、违法违规
- 去重:文档级、段落级、近重复、跨源重复
- 打分与分桶:质量分、领域标签、语言标签、长度桶
- 配比采样:按语种、领域、质量分布控制训练混合
SFT 会额外关注:
- 指令-回答格式是否规范
- 多轮角色是否完整
- 回答是否与任务目标一致
- 拒答、工具调用、格式约束是否正确
4. 数据质量过滤通常用哪些规则、模型或打分器?
Section titled “4. 数据质量过滤通常用哪些规则、模型或打分器?”通常是“规则过滤 + 模型打分 + 人工抽检”结合。
规则类:
- 长度阈值、重复率、字符集异常、URL/广告占比
- 语言检测、代码/自然语言分类
- 黑名单词、模板页、爬虫噪声、乱码检测
模型类:
- 质量分类器,判断是否像高质量问答/文章/代码
- 毒性、敏感、隐私识别模型
- 去重 embedding + 相似度模型
- 教师模型或奖励模型给 instruction-following / helpfulness 打分
打分器常见维度:
- 可读性
- 信息密度
- 事实性
- 格式完整性
- 领域相关性
工程上更重要的是:过滤器要高召回坏样本,但不能把有价值的长尾样本误杀太多。
5. 什么样的数据更利于模型学习?数据筛选、去重和课程式组织通常怎么做?
Section titled “5. 什么样的数据更利于模型学习?数据筛选、去重和课程式组织通常怎么做?”更利于学习的数据,通常具备四个特征:正确、清晰、多样、和目标任务一致。
- 正确:事实错误少、标注一致
- 清晰:结构完整,噪声少,指令和答案边界明确
- 多样:覆盖不同领域、风格、长度和难度
- 有信号:不是机械重复,也不是只有模板化空话
数据筛选常做:
- 按质量分保留高信号样本
- 针对目标任务保留高相关数据
- 用长度、语言、来源、难度做分桶
去重常做:
- 精确去重:完全相同文档或样本
- 近重复去重:MinHash、SimHash、embedding 相似度
- 污染检测:和评测集、验证集重合的数据要剔除
课程式组织常做:
- 先易后难,先高质量后长尾
- 先通用能力,再领域数据
- 长上下文、复杂推理数据放在后期逐步增加占比
6. 数据配比如何设计?如何量化评估一个数据配比方案是否合理?
Section titled “6. 数据配比如何设计?如何量化评估一个数据配比方案是否合理?”数据配比本质上是在“能力覆盖、训练稳定、目标任务收益”之间做平衡。
常见设计维度:
- 语种比例
- 领域比例
- 合成数据 vs 真实数据
- 高质量数据 vs 长尾覆盖数据
- 通用指令 vs 专项任务数据
合理的做法不是一次定死,而是通过小规模实验迭代。
常见评估方式:
- 看不同数据桶上的
loss / PPL是否失衡 - 看目标 benchmark 是否提升而非顾此失彼
- 看是否出现某类能力退化,如代码上升但通用问答下降
- 做 ablation,对比不同比例方案的增益曲线
如果某一桶 loss 长期高、目标任务又弱,通常说明该桶占比不足或数据质量有问题。
7. 训练 LLM 最大的困难通常是什么?
Section titled “7. 训练 LLM 最大的困难通常是什么?”通常不是单点问题,而是四类问题叠加:
- 数据:高质量数据稀缺,清洗和配比难
- 训练:超参数、并行策略、稳定性、故障恢复复杂
- 系统:显存、通信、吞吐、成本约束强
- 评估:离线指标和真实产品效果常不完全一致
再往后期还会遇到:
- 复读、遗忘、模式坍缩
- 对齐后能力回退
- 长上下文、工具调用、多轮一致性难评估
所以大模型训练更像系统工程,不只是把卡堆起来。
8. 训练使用过哪些硬件,如何衡量和提升硬件利用率?
Section titled “8. 训练使用过哪些硬件,如何衡量和提升硬件利用率?”面试里通常从“GPU 类型 + 并行规模 + 利用率指标”回答。
常见硬件包括:
- 单机消费卡:
3090 / 4090 - 训练卡:
A100 / H100 / H800 - 多机场景会配高速互联,如
NVLink / InfiniBand
衡量利用率常看:
- GPU Util
- SM 占用
- 显存占用和碎片率
- tokens/s、samples/s、step time
- 通信时间占比
- MFU / HFU
提升思路:
- 增大全局 batch,配合梯度累积
- 混合精度、Flash Attention、激活重计算
- 优化数据加载,避免 dataloader 卡住 GPU
- 减少通信开销,合理选 DDP / ZeRO / TP / PP
- 做 profile,区分瓶颈在算力、显存还是网络
9. DeepSpeed / ZeRO 有哪几个阶段?各自分片什么,代价是什么?
Section titled “9. DeepSpeed / ZeRO 有哪几个阶段?各自分片什么,代价是什么?”ZeRO 的核心是把冗余状态拆开存。
| 阶段 | 分片对象 | 好处 | 代价 |
|---|---|---|---|
| ZeRO-1 | optimizer states | 先省优化器显存 | 通信相对较小,但参数和梯度仍完整复制 |
| ZeRO-2 | optimizer states + gradients | 进一步省显存 | 反传阶段通信更多 |
| ZeRO-3 | optimizer states + gradients + parameters | 显存最省 | 参数按需 gather/scatter,通信和实现复杂度最高 |
补充:
- Offload 会把部分状态放 CPU/NVMe,进一步省 GPU 显存
- 但 offload 会引入 PCIe 或存储带宽瓶颈,吞吐可能明显下降
10. 模型训练时间如何估计?
Section titled “10. 模型训练时间如何估计?”最直接的估计方式是:
训练时间 ≈ 总训练 token 数 / 实际吞吐(tokens/s)其中实际吞吐不是峰值吞吐,要扣掉:
- 数据加载
- checkpoint 保存
- 验证
- 故障恢复
- 通信等待
更工程化的估计会结合:
- 模型参数规模
- 序列长度
- 全局 batch
- GPU 数量和单卡吞吐
- 并行策略和精度类型
所以一般先做一个短跑实验,拿到真实 step time 后再外推,比只按理论 FLOPs 估更可靠。
11. DP 和 DDP 的区别是什么?实际接触过哪些分布式训练 / 并行方案?
Section titled “11. DP 和 DDP 的区别是什么?实际接触过哪些分布式训练 / 并行方案?”DP 一般指单进程多卡的数据并行,DDP 是多进程数据并行。
两者区别:
- DP 由一个进程驱动多张卡,梯度汇总常回主卡,Python 开销大
- DDP 每卡一个进程,各自前向反向,再做梯度同步,扩展性更好
- 现在训练里基本默认优先用 DDP,而不是旧式 DP
常见并行方案:
- Data Parallel / DDP
- ZeRO / FSDP
- Tensor Parallel
- Pipeline Parallel
- Sequence Parallel
- Expert Parallel(MoE)
面试时最好补一句:实际方案选择要看是“显存不够”还是“吞吐不够”。
12. 训练过程中如何做模型监控?你会重点关注哪些指标?
Section titled “12. 训练过程中如何做模型监控?你会重点关注哪些指标?”监控通常分成模型、数据、系统三类。
模型侧:
- train / val loss
- PPL
- grad norm
- 学习率
- 激活、logit、熵是否异常
数据侧:
- 各数据桶采样比例
- token 长度分布
- 坏样本、空样本、重复样本比例
系统侧:
- step time
- GPU Util / 显存
- 通信等待时间
- dataloader 吞吐
- checkpoint 频率和失败率
如果只能盯少量指标,我会优先盯:loss 曲线、grad norm、tokens/s、GPU 利用率、验证集关键指标。
13. 训练时 loss 震荡可能是什么原因造成的?通常如何定位是数据、学习率、batch size、混合精度、分布式同步还是优化器设置导致的问题?
Section titled “13. 训练时 loss 震荡可能是什么原因造成的?通常如何定位是数据、学习率、batch size、混合精度、分布式同步还是优化器设置导致的问题?”loss 震荡通常是“更新步长过大”或“输入分布不稳定”。
常见原因:
- 学习率过高,warmup 不够
- batch 太小,梯度方差大
- 脏数据、长度桶切换剧烈、采样分布突变
- 混合精度溢出,
loss scale不稳定 - 分布式梯度没有正确同步
- 优化器超参数不合适,如
beta、weight decay 设置异常
排查顺序通常是:
- 先看是否在固定 step 周期性震荡,排查数据桶和 scheduler
- 降学习率、加 warmup、加梯度裁剪,看是否明显缓解
- 放大 batch 或增加梯度累积,判断是否是梯度噪声问题
- 看 AMP 日志、是否出现 overflow / NaN
- 在单卡和小数据集复现,隔离分布式同步问题
定位这类问题的关键不是猜,而是做最小变量对照实验。
14. 你如何看待 LLM 的未来发展趋势,当前主要的优化方向有哪些?
Section titled “14. 你如何看待 LLM 的未来发展趋势,当前主要的优化方向有哪些?”趋势大体上是“更强能力 + 更低成本 + 更强可控性”。
主要优化方向:
- 数据工程:更高质量、更少污染、更强合成数据闭环
- 架构与系统:MoE、长上下文、推理缓存、并行优化
- 对齐:更稳的偏好学习、更少 reward hacking
- Agent 化:工具调用、检索、执行、长期记忆
- 多模态:文本、图像、音频、视频统一建模
- 部署:量化、蒸馏、小模型专用化
一个现实判断是:未来未必只有“更大”,更可能是“大模型做 teacher,小模型做高性价比落地”。
15. 一个模型训练通常会经历哪些阶段,比如 pre-train、post-train / alignment?各阶段常用什么 loss 或训练方式?
Section titled “15. 一个模型训练通常会经历哪些阶段,比如 pre-train、post-train / alignment?各阶段常用什么 loss 或训练方式?”一个典型大模型生命周期可以拆成:
- 预训练:学通用语言建模能力,主 loss 是 next-token cross entropy
- 继续预训练:补领域知识或语种,loss 仍以 CE 为主
- SFT:学指令遵循、格式和任务模式,常用监督微调 CE
- 偏好对齐:DPO、PPO、GRPO 等,让输出更符合偏好和规则
- 安全/专项微调:提升拒答、安全、工具调用或特定业务能力
有些流程还会加:
- 蒸馏
- 量化感知训练
- 长上下文继续训练
核心差别是:预训练学“语言分布”,SFT 学“如何回答”,RL 对齐学“回答得更符合偏好”。
16. 大模型 SFT 和预训练的 loss、目标和数据差异是什么?一个 SFT 流程通常怎么做,SFT 数据通常如何构建,SFT 常见问题有哪些,为什么具体任务里会选择 SFT?
Section titled “16. 大模型 SFT 和预训练的 loss、目标和数据差异是什么?一个 SFT 流程通常怎么做,SFT 数据通常如何构建,SFT 常见问题有哪些,为什么具体任务里会选择 SFT?”两者最核心的区别在目标。
| 维度 | 预训练 | SFT |
|---|---|---|
| 目标 | 学通用语言建模 | 学任务格式和指令遵循 |
| loss | 主要是 next-token CE | 通常也是 CE,但只在监督答案区间计算 |
| 数据 | 海量无标注文本 | 指令-回答、多轮对话、任务样本 |
| 结果 | 获得基础能力 | 获得“像助手一样回答”的行为 |
一个 SFT 流程通常是:
- 定义任务和回答规范
- 构建指令数据、多轮样本或格式模板
- 清洗、去重、质量打分
- 训练时做 mask,只让答案部分回传监督
- 在验证集和人工评测上选 checkpoint
SFT 数据构建来源常包括:
- 人工标注
- 历史业务数据清洗
- 高质量规则模板
- teacher model 蒸馏生成再人工筛选
常见问题:
- 数据重复导致复读
- 风格过窄导致泛化差
- 数据分布和线上不一致
- 只学格式,没学到真实能力
- 对已有通用能力产生遗忘
为什么会选择 SFT:
- 成本比从头预训练低很多
- 能快速把基础模型拉到目标任务分布
- 对格式约束、问答风格、工具调用行为很有效
1. 什么是量化,量化具体过程是什么?
Section titled “1. 什么是量化,量化具体过程是什么?”量化就是把原本高精度的权重、激活从 FP32 / FP16 映射到更低比特表示,如 INT8 / INT4,以减少显存、带宽和推理延迟。
核心过程可以概括为:
- 确定量化粒度,如 tensor-wise、per-channel、per-head
- 统计数值范围,得到
scale和zero-point - 把浮点数映射成整数
- 推理时再反量化,或直接用量化算子计算
常见线性量化公式:
q = round(x / scale) + zero_pointx ≈ scale * (q - zero_point)量化的收益:
- 模型更小
- 显存更省
- 推理吞吐更高
代价是:
- 会有精度损失
- 对异常值和激活分布更敏感
2. QAT和PTQ有什么区别,QAT具体过程是什么 Per-Channel,Per-Head量化是什么,为什么这么做
Section titled “2. QAT和PTQ有什么区别,QAT具体过程是什么 Per-Channel,Per-Head量化是什么,为什么这么做”PTQ 是 Post-Training Quantization,先训完浮点模型,再做量化校准。
QAT 是 Quantization-Aware Training,在训练或微调阶段就把量化误差模拟进去,让模型学会适应低比特。
区别:
| 方法 | 时机 | 优点 | 缺点 |
|---|---|---|---|
| PTQ | 训练后 | 简单、成本低 | 精度损失可能更大 |
| QAT | 训练中 | 精度通常更好 | 训练更复杂、成本更高 |
QAT 的典型过程:
- 在前向里插入 fake quant 节点,模拟量化和反量化
- 反向仍用近似梯度更新参数
- 训练结束后导出真实低比特权重
Per-Channel 量化是每个输出通道单独有一个 scale。
- 适合卷积、线性层权重
- 因为不同通道的数值分布差异很大
Per-Head 量化是每个 attention head 单独量化。
- 适合 Q/K/V 或 attention 输出
- 因为不同 head 的激活范围和功能可能不同
这样做的原因是:粒度更细,能更贴合真实分布,减少统一量化带来的误差。
1. PPO / GRPO 公式是什么?它们属于 on-policy 还是 off-policy,为什么需要 clip?PPO 和 DPO 的区别是什么,什么时候会选择 DPO 而不是 PPO / GRPO?KL 散度前的系数(如 beta)有什么含义,通常应该怎么设置?
Section titled “1. PPO / GRPO 公式是什么?它们属于 on-policy 还是 off-policy,为什么需要 clip?PPO 和 DPO 的区别是什么,什么时候会选择 DPO 而不是 PPO / GRPO?KL 散度前的系数(如 beta)有什么含义,通常应该怎么设置?”PPO 的核心目标常写成:
L^PPO = E[min(r_t A_t, clip(r_t, 1-ε, 1+ε) A_t)]其中 r_t = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)。
GRPO 的思路是对同一 prompt 采多条回答,用组内相对奖励构造优势,再做 PPO 风格更新。可写成:
A_i ≈ (r_i - mean(r_group)) / std(r_group)L^GRPO ≈ E[min(ρ_i A_i, clip(ρ_i, 1-ε, 1+ε) A_i)] - β KL(π_θ || π_ref)性质上:
- PPO、GRPO 都属于 on-policy,因为依赖当前策略采样
- DPO 更接近 off-policy,因为它直接吃静态偏好对数据,不需要在线 roll out
为什么要 clip:
- 防止单次更新过猛
- 限制新旧策略偏离太远
- 降低训练不稳定和 reward hacking 风险
PPO / GRPO 和 DPO 的区别:
- PPO / GRPO 需要采样和奖励,优化的是策略改进
- DPO 直接用偏好对把“chosen 概率高于 rejected”写进 loss
- PPO / GRPO 更灵活,可接复杂奖励;DPO 更简单、更稳、更省算力
什么时候选 DPO:
- 有高质量偏好对,但不想搭完整 RL 采样链路
- 训练资源有限
- 更重视稳定性而不是在线探索
beta 常用于 KL 约束强度:
- 大了更保守,模型不容易跑飞,但提升慢
- 小了更激进,容易偏离参考模型甚至坍缩
- 实践上常从小范围网格搜索,并结合 KL 曲线动态调
2. GRPO / Flow GRPO 的训练数据和奖励函数如何设计,整体训练流程怎么做?
Section titled “2. GRPO / Flow GRPO 的训练数据和奖励函数如何设计,整体训练流程怎么做?”GRPO 数据的核心单位是 prompt,因为同一个 prompt 要采样一组候选回答做组内比较。
训练数据通常包含:
- prompt
- 可选的参考答案或规则
- 奖励计算所需上下文,如工具返回、标准解、格式要求
奖励函数常拆成多项:
- 准确性奖励
- 格式奖励
- 长度或简洁性约束
- 安全性惩罚
- 工具调用成功率
整体流程通常是:
- 用当前策略对每个 prompt 采样多条回答
- 计算每条回答的总奖励
- 在组内做标准化或减均值,得到相对优势
- 用 PPO/GRPO 目标更新策略
- 加 KL 约束,避免偏离参考模型过快
如果是 Flow GRPO,一般是在“生成轨迹是连续流/扩散轨迹”的设定下,把最终奖励回传到轨迹优化,但训练骨架仍是“采样 -> 打分 -> 相对优势 -> 约束更新”。
3. GRPO 和 PPO 在计算优势函数过程中有哪些不同?
Section titled “3. GRPO 和 PPO 在计算优势函数过程中有哪些不同?”PPO 的优势函数通常来自 value model:
A_t = R_t - V(s_t)常配 GAE 做时序平滑。
GRPO 的典型做法是不单独训 value head,而是对同组样本用相对奖励构造优势:
- 同一个 prompt 下采多条回答
- 比较谁更好,而不是估计绝对价值
- 常见形式是减组均值、再除组标准差
所以差别在于:
- PPO 更依赖 value baseline
- GRPO 更依赖组内相对排序
- GRPO 省掉 value model,但对组采样质量更敏感
4. GRPO 的优势函数和 reward 有什么不同?
Section titled “4. GRPO 的优势函数和 reward 有什么不同?”reward 是原始打分,回答“这条输出有多好”。
advantage 是用于更新策略的相对信号,回答“这条输出比基线好多少”。
举例:
- reward 可能是
0.82 - 但如果同组平均是
0.90,那它的 advantage 可能是负的
所以:
- reward 是绝对值
- advantage 是中心化、标准化或扣 baseline 后的值
- 真正驱动梯度更新的通常是 advantage,而不是 reward 原值
5. RLHF 和 SFT 的区别是什么?
Section titled “5. RLHF 和 SFT 的区别是什么?”SFT 是监督学习,目标是让模型拟合参考答案。
RLHF 是基于人类偏好或奖励信号做策略优化,目标不是“像标注答案”,而是“更符合偏好”。
两者区别:
| 维度 | SFT | RLHF |
|---|---|---|
| 数据 | 指令-答案 | 偏好、奖励、比较信号 |
| 目标 | 拟合示范 | 最大化奖励 |
| 训练方式 | CE 监督学习 | PPO / GRPO 等策略优化 |
| 特点 | 稳定、简单 | 更灵活,但更难训 |
常见流程是先 SFT 再 RLHF,因为先让模型学会基本回答,再做偏好优化更稳。
6. 什么是 reward hacking?在 GRPO 等 RL 训练中通常如何识别、缓解和评估?
Section titled “6. 什么是 reward hacking?在 GRPO 等 RL 训练中通常如何识别、缓解和评估?”reward hacking 指模型学会了“骗过奖励函数”,而不是真的完成目标。
例子:
- 套模板刷格式分
- 钻评测器漏洞
- 通过冗长回答提高某项打分,但实际更差
识别方式:
- 奖励上升但人工质量下降
- 某个子奖励异常拉高
- 输出风格单一、投机、模式化
缓解手段:
- 奖励拆分并做权重约束
- 引入人工抽检和对抗样本
- 加 KL 约束,避免策略跑偏
- 用多个 reward model 或规则交叉验证
评估时不能只看平均 reward,要看人工 win rate、坏案例占比和安全性指标。
7. GRPO 训练出现熵崩怎么办?通常从奖励尺度、KL 约束、采样温度、优势归一化和学习率等哪些角度排查?
Section titled “7. GRPO 训练出现熵崩怎么办?通常从奖励尺度、KL 约束、采样温度、优势归一化和学习率等哪些角度排查?”熵崩说明策略过快变尖,开始只会输出很窄的一类答案。
优先排查:
- 奖励尺度是否过大,导致少数样本梯度过猛
- KL 系数是否太小,约束不住策略漂移
- 采样温度是否太低,探索不够
- 优势是否未归一化,组内方差太大
- 学习率是否过高
常见修正:
- 压缩 reward 范围或做 clipping
- 增大
beta - 适当提高采样温度或增加候选数
- 做 advantage normalization
- 降学习率、缩小 update ratio
如果熵已经明显塌了,通常需要回退 checkpoint,再从更保守的配置继续训。
8. Flow GRPO 中的 ODE 和 SDE 过程公式能不能推导一下?
Section titled “8. Flow GRPO 中的 ODE 和 SDE 过程公式能不能推导一下?”如果这里的 Flow GRPO 指的是把 GRPO 用到 flow / diffusion 类生成轨迹上,底层轨迹通常写成:
前向或一般形式的 SDE:
dx = f(x, t) dt + g(t) dW_t对应的 probability flow ODE 常写成:
dx = [f(x, t) - 1/2 g(t)^2 ∇_x log p_t(x)] dt直觉上:
- SDE 有随机噪声项
dW_t - ODE 把随机扩散过程改写成确定性流,边缘分布一致
Flow GRPO 本身的 RL 部分并不会改掉这套连续时间动力学,而是在生成轨迹或终态样本上定义 reward,再把相对优势回传给策略/流场参数。
面试里更推荐这样回答:
- 先写 SDE 和 probability flow ODE
- 再说明 RL 优化作用在“轨迹采样分布的偏好更新”
- 如果 interviewer 追具体推导,再确认他指的是哪篇 Flow GRPO 工作,因为不同论文记号不完全一样