对齐与 RL 后训练:小型奖励函数设计与对比实验
作业定位
这份作业接在 13/2-prog 两份 GRPO notebook 之后完成:
fine_tuning_llm_grpo_trl
trl_grpo_reasoning_advanced_reward
目标不是让你“从零实现一个 RL 算法”,而是让你亲手看到:
SFT / prompt 和 RL 后训练 的差别到底在哪里
- reward 设计会怎样改变模型行为
- 多奖励为什么既有用,也可能带来新的副作用
作业目标
请你基于现有 notebook,完成一个 小型奖励函数设计与对比实验。
你需要:
- 选一个小任务
- 设计
2 到 4 个 reward
- 比较不同 reward 组合下的模型行为
- 分析模型变好了什么,又开始“投机”了什么
推荐任务方向
请选择其中一个,或在教师同意后自拟。
方向 A:数学推理
目标:
适合的 reward:
- 最终答案是否正确
- 是否按指定格式输出
- 是否包含中间推理步骤
方向 B:结构化输出
目标:
- 让模型把答案稳定写成 JSON、XML 或固定字段格式
适合的 reward:
方向 C:安全拒答 / 边界回答
目标:
适合的 reward:
- 是否正确拒绝危险请求
- 是否错误拒绝正常请求
- 输出是否符合指定安全模板
方向 D:风格约束回答
目标:
适合的 reward:
- 是否控制在长度范围内
- 是否包含规定的项目符号
- 是否保持指定语气
推荐完成路径
第 0 步:先确定 baseline
请先选一个你要比较的 baseline。
推荐两种最简单的 baseline:
- 只做 prompt,不训练
- 直接使用 notebook 里训练前的模型输出
你不必额外再做一轮 SFT;本作业重点是比较:
- 没有 reward 时,模型怎么答
- 加 reward 后,模型怎么变
第 1 步:选定一个小任务
要求:
不建议一上来做太开放的问题。
越容易检查对错,越适合 reward 设计。
第 2 步:先设计单奖励版本
先只做一个最核心 reward,例如:
correctness_reward
format_reward
目的不是一步到位,而是先看:
第 3 步:再设计多奖励版本
在单奖励基础上,再加入 1 到 3 个 reward。
例如:
你需要解释:
- 为什么这些 reward 要组合在一起
- 每个 reward 想“拉”模型往哪个方向走
第 4 步:做最小对比实验
至少比较下面三种设置:
- baseline
- 单奖励
- 多奖励
如果时间允许,可以再加:
- 改 reward 权重后的版本
第 5 步:收集失败案例
这一部分非常重要。
请至少保留 2 个失败案例,例如:
- 答案不对,但格式很漂亮
- 为了拿高 reward,回答变得很机械
- 输出越来越长
- 模型学会“钻规则空子”
你可以直接参考 notebook 里的哪些部分
基础版 notebook
- 先看 reward function 的最小写法
- 观察
GRPOTrainer 怎么接收 reward
- 理解最小闭环怎样跑通
多奖励版 notebook
- 看多个 reward 怎样一起传进 trainer
- 看结构化输出和 reasoning 任务为什么更依赖 reward design
- 看“答案正确”之外还能优化哪些行为
建议提交内容
请提交一个压缩包,包含下面内容:
- 你修改后的 notebook 或脚本
- 一页到两页短报告
- 至少
3 组代表性输出
- 至少
2 个失败案例
短报告建议结构
1. 任务定义
- 你选了什么任务
- 为什么这个任务适合做 reward 实验
2. reward 设计
- 你设计了哪些 reward
- 每个 reward 的作用是什么
- 你为什么这样组合
3. 对比结果
至少比较:
请不要只写“更好了”,而要具体说:
4. failure case 分析
请明确回答:
- 模型投机了什么
- 哪个 reward 可能被 exploit
- 如果再改一版 reward,你会怎么改
评分重点
这份作业不按“你把分数刷多高”来评,而更看重下面四点:
- 任务是否选得合适
- reward 是否设计得清楚
- 对比是否真实、有代表性
- 你是否真的看懂了 reward 改变模型行为的方式
你真正要带走什么
如果这份作业做完后,你只记住一句话,那应该是:
RL 后训练不只是“让模型更强”,而是“用 reward 把模型推向我们想要的行为”。
真正困难的地方也在这里:
- reward 一旦写得不好,模型也会被推向错误方向
所以这一章最重要的能力,不是会调用 GRPOTrainer,而是开始学会: