Skip to content

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 约束思想

不同点:

方法数据是否在线采样特点
PPOprompt + reward灵活,但链路复杂
GRPOprompt + 组内奖励省 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 和 α\alpha 是什么,一般如何设置 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

工程上通常先固定一组小值,再通过验证集看是否欠拟合。


影响分两种情况:

  • 若把 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_projv_proj,因为这两处通常对任务适配最敏感。

是否加到所有线性层,要看:

  • 显存预算
  • 数据规模
  • 任务复杂度

4. 具体的微调中是怎么实现的?LoRA 的初始化通常怎么做,训练 / 推理的计算复杂度如何变化,梯度这些是怎么算出来的?

Section titled “4. 具体的微调中是怎么实现的?LoRA 的初始化通常怎么做,训练 / 推理的计算复杂度如何变化,梯度这些是怎么算出来的?”

实现上,冻结原权重 W,只训练低秩矩阵 AB

y = Wx + (α / r) BAx

初始化常见做法:

  • A 随机小值初始化
  • B 初始化为 0

这样初始时 ΔW ≈ 0,不会一开始就破坏 base model。

复杂度变化:

  • 训练参数量从 d_out * d_in 变成 r(d_in + d_out)
  • 前向多了两次小矩阵乘法
  • 反传只更新 A、B,显存和优化器状态明显更省

梯度本质上还是链式法则:

  • loss 先对输出 y 求梯度
  • 再回传到 BA
  • 冻结的 W 不更新,只参与前向和梯度传播

所以 LoRA 节省的核心不是“不要反传”,而是“只训练一小部分参数”。


5. LoRA 微调的原理是什么?为什么低秩更新通常能够起作用?

Section titled “5. LoRA 微调的原理是什么?为什么低秩更新通常能够起作用?”

LoRA 的假设是:很多下游任务需要的参数更新,并不需要一个完整高秩矩阵,低秩子空间里的调整就够了。

直觉上:

  • 预训练模型已经学到了强表征
  • 下游适配更多是在“轻微旋转和重加权”这些能力
  • 所以不必重写整个权重矩阵

它能起作用的原因通常有三点:

  • 预训练模型本身离目标解已经不远
  • 下游任务有效更新具有低秩结构
  • 低秩约束本身还有一点正则化效果,不容易过拟合

它的局限也要知道:

  • 任务变化太大时,低 rank 可能不够
  • 加的位置选错,适配效果会差
  • 多个 adapter 叠加时要注意冲突和 merge 策略

1. LLM 怎么评估,评估哪些指标?预训练和 SFT 的评估分别看什么,无幻觉率怎么评估?

Section titled “1. LLM 怎么评估,评估哪些指标?预训练和 SFT 的评估分别看什么,无幻觉率怎么评估?”

LLM 评估一般分三层:训练内指标、离线任务指标、线上或人工评估。

  • 训练内常看 lossPPL、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-1optimizer states先省优化器显存通信相对较小,但参数和梯度仍完整复制
ZeRO-2optimizer states + gradients进一步省显存反传阶段通信更多
ZeRO-3optimizer states + gradients + parameters显存最省参数按需 gather/scatter,通信和实现复杂度最高

补充:

  • Offload 会把部分状态放 CPU/NVMe,进一步省 GPU 显存
  • 但 offload 会引入 PCIe 或存储带宽瓶颈,吞吐可能明显下降

最直接的估计方式是:

训练时间 ≈ 总训练 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 设置异常

排查顺序通常是:

  1. 先看是否在固定 step 周期性震荡,排查数据桶和 scheduler
  2. 降学习率、加 warmup、加梯度裁剪,看是否明显缓解
  3. 放大 batch 或增加梯度累积,判断是否是梯度噪声问题
  4. 看 AMP 日志、是否出现 overflow / NaN
  5. 在单卡和小数据集复现,隔离分布式同步问题

定位这类问题的关键不是猜,而是做最小变量对照实验。


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 或训练方式?”

一个典型大模型生命周期可以拆成:

  1. 预训练:学通用语言建模能力,主 loss 是 next-token cross entropy
  2. 继续预训练:补领域知识或语种,loss 仍以 CE 为主
  3. SFT:学指令遵循、格式和任务模式,常用监督微调 CE
  4. 偏好对齐:DPO、PPO、GRPO 等,让输出更符合偏好和规则
  5. 安全/专项微调:提升拒答、安全、工具调用或特定业务能力

有些流程还会加:

  • 蒸馏
  • 量化感知训练
  • 长上下文继续训练

核心差别是:预训练学“语言分布”,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,以减少显存、带宽和推理延迟。

核心过程可以概括为:

  1. 确定量化粒度,如 tensor-wise、per-channel、per-head
  2. 统计数值范围,得到 scalezero-point
  3. 把浮点数映射成整数
  4. 推理时再反量化,或直接用量化算子计算

常见线性量化公式:

q = round(x / scale) + zero_point
x ≈ 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 的典型过程:

  1. 在前向里插入 fake quant 节点,模拟量化和反量化
  2. 反向仍用近似梯度更新参数
  3. 训练结束后导出真实低比特权重

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
  • 可选的参考答案或规则
  • 奖励计算所需上下文,如工具返回、标准解、格式要求

奖励函数常拆成多项:

  • 准确性奖励
  • 格式奖励
  • 长度或简洁性约束
  • 安全性惩罚
  • 工具调用成功率

整体流程通常是:

  1. 用当前策略对每个 prompt 采样多条回答
  2. 计算每条回答的总奖励
  3. 在组内做标准化或减均值,得到相对优势
  4. 用 PPO/GRPO 目标更新策略
  5. 加 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 原值

SFT 是监督学习,目标是让模型拟合参考答案。

RLHF 是基于人类偏好或奖励信号做策略优化,目标不是“像标注答案”,而是“更符合偏好”。

两者区别:

维度SFTRLHF
数据指令-答案偏好、奖励、比较信号
目标拟合示范最大化奖励
训练方式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 工作,因为不同论文记号不完全一样