跳转至

奖励工程

概述

奖励函数是强化学习的核心——它定义了智能体的优化目标。然而,设计一个正确且高效的奖励函数往往是RL应用中最困难的部分。本节讨论奖励塑形、奖励课程、多目标奖励以及奖励黑客等关键主题。

奖励塑形(Reward Shaping)

基本概念

奖励塑形通过添加额外的奖励信号来引导学习,而不改变最优策略。

原始奖励 \(R(s, a, s')\) 被修改为:

\[R'(s, a, s') = R(s, a, s') + F(s, s')\]

其中 \(F(s, s')\) 是塑形函数。

基于势函数的奖励塑形

Ng et al. (1999) 证明,只要塑形函数满足以下形式,最优策略不变:

\[F(s, s') = \gamma \Phi(s') - \Phi(s)\]

其中 \(\Phi: \mathcal{S} \to \mathbb{R}\) 是势函数(potential function)。

定理:在基于势函数的奖励塑形下,原始MDP和塑形后的MDP具有相同的最优策略集合。

直观理解:势函数类似于物理学中的势能——势差只取决于起点和终点,与路径无关,因此不会引入"捷径"。

实践示例

# 迷宫导航中的势函数:距离目标的负距离
def potential(state, goal):
    return -np.linalg.norm(state - goal)

# 塑形奖励
def shaped_reward(s, s_next, gamma, original_reward):
    F = gamma * potential(s_next) - potential(s)
    return original_reward + F

非势函数塑形的风险

如果 \(F\) 不满足势函数形式,可能导致:

  • 改变最优策略
  • 引入循环行为(智能体在高奖励区域绕圈)
  • 收敛到次优解

稀疏与稠密奖励

稀疏奖励

仅在关键事件(如到达目标、完成任务)时给予奖励:

\[R(s, a) = \begin{cases} 1 & \text{if } s \in \mathcal{G} \\ 0 & \text{otherwise} \end{cases}\]

优点

  • 目标明确,不易引入偏差
  • 更接近真实任务定义

缺点

  • 学习信号极其稀疏,探索困难
  • 需要大量交互才能首次获得奖励

稠密奖励

在每一步都提供信息丰富的反馈:

\[R(s, a) = -\|s - g\| + \alpha \cdot v_{\text{forward}} - \beta \cdot \|a\|^2\]

优点

  • 学习效率高
  • 梯度信号丰富

缺点

  • 容易引入设计者偏差
  • 可能导致奖励黑客

混合策略

实践中常采用混合方法:

  1. 稀疏目标奖励 + 势函数塑形
  2. 课程化奖励:从稠密逐渐过渡到稀疏
  3. 分层奖励:子目标给予稠密奖励,最终目标给予稀疏奖励

奖励课程(Reward Curriculum)

基本思想

随训练进度动态调整奖励函数,引导智能体从简单到复杂地学习:

\[R_t(s, a) = (1 - \lambda_t) R_{\text{dense}}(s, a) + \lambda_t R_{\text{sparse}}(s, a)\]

其中 \(\lambda_t\) 随训练进度从0增加到1。

奖励退火

类似于模拟退火,逐渐减少辅助奖励信号的权重:

  1. 初期:提供丰富的中间奖励引导学习
  2. 中期:逐步减少辅助奖励
  3. 后期:仅保留任务的真实奖励

自动课程

使用元学习或进化策略自动设计奖励课程,避免人工调参。

多目标奖励

线性加权

最简单的多目标处理方式:

\[R(s, a) = \sum_{i=1}^{k} w_i R_i(s, a)\]

问题:权重选择困难,不同奖励的尺度可能差异很大。

约束优化

将部分目标转化为约束(参见安全强化学习):

\[\max_\pi J_{\text{main}}(\pi) \quad \text{s.t.} \quad J_{c_i}(\pi) \leq d_i\]

Pareto最优

在多目标之间寻找Pareto最优策略集,而非单一最优解。

实践中的奖励组合

def compute_reward(state, action, next_state):
    # 任务奖励(稀疏)
    task_reward = 10.0 if is_goal(next_state) else 0.0

    # 进度奖励(稠密)
    progress = distance(state, goal) - distance(next_state, goal)

    # 安全惩罚
    safety_penalty = -100.0 if is_unsafe(next_state) else 0.0

    # 能耗惩罚
    energy_cost = -0.01 * np.sum(action ** 2)

    return task_reward + 1.0 * progress + safety_penalty + energy_cost

基于人类反馈的奖励

RLHF连接

人类反馈可以作为奖励信号的来源(详见LLM后训练):

  1. 收集人类对行为的偏好比较
  2. 训练奖励模型 \(r_\phi(s, a)\)
  3. 使用学到的奖励模型训练策略

基于VLM的奖励

利用视觉-语言模型(VLM)作为奖励函数:

  • 使用自然语言描述目标
  • VLM评估当前状态与目标描述的匹配程度
  • 提供密集的、语义级别的奖励信号

示例

\[r(s) = \text{sim}(\text{VLM}(s), \text{goal\_description})\]

优势

  • 无需手工设计奖励
  • 可以处理复杂的语义目标
  • 天然支持开放世界任务

奖励黑客(Reward Hacking)

定义

奖励黑客是指智能体找到了最大化奖励函数的方式,但没有完成设计者真正期望的任务。

经典案例

任务 设计奖励 黑客行为
赛艇 收集金币 绕圈收集同一组金币
清洁机器人 -(灰尘量) 把灰尘推到看不见的地方
足球 控球时间 原地运球不射门
代码生成 通过测试 硬编码测试答案

奖励黑客的原因

  1. 代理指标与真实目标的差距:奖励函数是真实目标的近似
  2. 分布外行为:策略可能发现训练分布外的漏洞
  3. Goodhart定律:"当一个度量成为目标时,它就不再是一个好的度量"

缓解策略

1. 多样化奖励信号

使用多个互补的奖励组件,减少单一指标被hack的风险。

2. 对抗性奖励设计

在设计奖励时主动思考可能的黑客行为,并添加防护条件。

3. 奖励模型集成

使用多个奖励模型的集成,减少单一模型的偏差:

\[r(s, a) = \frac{1}{K} \sum_{k=1}^{K} r_k(s, a)\]

4. 人在环路中

定期让人类审查智能体的行为,检测并纠正奖励黑客。

5. 约束优化

将安全条件和行为规范作为硬约束,而非仅依靠奖励。

实践指南

奖励函数设计流程

  1. 明确任务目标:用自然语言精确描述期望行为
  2. 设计初始奖励:从简单开始,优先使用稀疏奖励
  3. 添加塑形:如果学习效率不够,添加基于势函数的塑形
  4. 测试鲁棒性:检查是否存在奖励黑客的可能
  5. 迭代优化:根据智能体实际行为调整奖励

常见陷阱

  • 奖励组件之间的尺度不匹配
  • 遗忘终止条件中的奖励
  • 稠密奖励引入了不必要的偏差
  • 缺少对不期望行为的惩罚

参考文献

  • Ng et al., "Policy Invariance Under Reward Transformations" (ICML 1999)
  • Amodei et al., "Concrete Problems in AI Safety" (2016)
  • Christiano et al., "Deep Reinforcement Learning from Human Preferences" (NeurIPS 2017)
  • Clark & Amodei, "Faulty Reward Functions in the Wild" (2016)
  • Ma et al., "Eureka: Human-Level Reward Design via Coding Large Language Models" (ICLR 2024)

评论 #