奖励函数
奖励函数把可观察结果转成数值反馈,决定策略学习倾向于哪些行为;它只是实际目标的一种表达。
理解与应用
奖励函数是在强化学习中为行为或结果给出数值反馈的规则。奖励可以来自程序测试、环境状态、人工偏好或模型评审。策略优化的是这些反馈对应的回报,所以“想让助手把事情办好”必须被转成可观察、可计算的标准,才会进入学习过程。
例如报销查询任务的真实目标是准确解释退回原因。一个奖励设计可以在原因正确且证据对应时给成功奖励,再按工具调用次数收取小成本。但如果“原因正确”只是检查回答中有没有“发票”两个字,系统就可能通过到处提发票得分;如果每次检索都加分,它还可能学会不停检索。这里的问题不是模型不努力,而是它努力优化了一个不够准确的代理目标。
只在任务结束给奖励,容易难以判断哪一步有帮助;逐步给奖励能提供更密集的信号,却又可能鼓励为了得分而增加步骤。奖励权重和折扣决定这些取舍,需要用完整轨迹和独立验收检查。权限则属于另一层约束:不能设计成“越权扣一点分,但完成任务多加几分”,让不可接受动作有机会划算。训练奖励可以引导效率与质量,运行系统仍应硬性拒绝未经授权的操作。
动手试一试:节省调用是否掩盖了越权
两条轨迹是手工构造的评分记录。只比较成功与调用成本,越权捷径会得更高分;加入独立授权门槛后,它仍不能被采用。这并不是训练实验,而是检查评分规则是否与允许的行为范围一致。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
traces = [
{"name": "授权查询", "success": 1, "calls": 2, "authorized": True},
{"name": "越权捷径", "success": 1, "calls": 1, "authorized": False},
]
for trace in traces:
reward = trace["success"] - 0.05 * trace["calls"]
admissible = trace["authorized"] and trace["success"] == 1
print(f'{trace["name"]}:奖励 {reward:.2f},允许采用 {admissible}')运行结果
授权查询:奖励 0.90,允许采用 True 越权捷径:奖励 0.95,允许采用 False
常见误区
- 可测量的代理指标可能与真实目标分离,分数提高也可能是奖励投机。
- 过程奖励如果只奖励动作发生,可能鼓励无意义地增加调用或篇幅。
- 安全约束不能被当作可用更高成功奖励抵消的小额惩罚。
前置与延伸
建议先读
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Spinning Up:Key Concepts in RL ↗
核对状态/观测、策略、轨迹、奖励与回报的定义;标准库示例是离散算例。 · 核验:2026-10-10
- Training language models to follow instructions with human feedback ↗
作者原始论文区分监督微调、偏好奖励模型和后续强化学习阶段;不把它们合并为同一训练方法。 · 核验:2026-10-10