深度强化学习实战:如何用Awesome-DRL框架解决稀疏奖励问题

1次阅读
没有评论

共计 2081 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

问题背景:稀疏奖励的困扰

在机器人控制(如机械臂抓取)、游戏 AI(如《星际争霸》微操)等场景中,智能体常常面临稀疏奖励问题。具体表现为:90% 的 episode 中,智能体因未触发关键事件(如成功抓取物体)而仅获得 0 或恒定负奖励。以机械臂控制为例,只有在夹爪距离目标 5cm 内时才会获得 + 1 奖励,其他时间均为 0。这种信号延迟导致传统 RL 算法难以有效学习。

传统方法的局限性

  1. DQN 的缺陷:Q-learning 系列算法依赖稠密奖励更新 Q 值,稀疏奖励下会出现梯度消失
  2. PPO 的困境:尽管策略梯度方法对奖励稀疏性稍强,但实验显示在机械臂任务中,原始 PPO 需要 800 万步训练才能达到 50% 成功率
  3. 关键发现:Hindsight Experience Replay(HER,后视经验回放)通过重构目标状态,将 ” 失败 ” 轨迹转化为 ” 针对替代目标 ” 的成功经验

HER 核心实现(PyTorch 版)

class HERBuffer:
    def __init__(self, capacity, k=4):
        # k: 每个 transition 生成 HER 样本的数量
        self.capacity = capacity
        self.buffer = []
        self.k = k

    def store(self, transition):
        """
        transition 格式: (state, action, reward, next_state, goal, done)
        其中 goal 维度需与 state 中的目标描述部分一致
        """
        if len(self.buffer) == self.capacity:
            self.buffer.pop(0)
        self.buffer.append(transition)

    def sample(self, batch_size):
        indices = np.random.choice(len(self.buffer), batch_size)
        batch = [self.buffer[i] for i in indices]

        # HER 核心:目标替换逻辑
        her_batch = []
        for state, action, _, next_state, _, done in batch:
            for _ in range(self.k):
                # 随机选择后续某状态作为新目标
                future_idx = np.random.randint(indices[i], len(self.buffer))
                new_goal = self.buffer[future_idx][-2]  # 提取 goal 部分

                # 重新计算奖励(需自定义奖励函数)new_reward = compute_reward(next_state, new_goal)
                her_batch.append((state, action, new_reward, next_state, new_goal, done))

        return batch + her_batch

课程学习优化

通过动态调整训练难度加速收敛:

def evaluate_difficulty(episode_returns, window=10):
    """
    基于最近 10 幕的平均回报评估当前难度
    返回:0- 1 之间的标准化难度值
    """
    avg_return = np.mean(episode_returns[-window:])
    difficulty = 1 - sigmoid(avg_return)  # 回报越高难度越低
    return difficulty

# 在采样时应用难度系数
def curriculum_sample(buffer, difficulty):
    """
    难度控制逻辑:- 高难度:优先采样接近目标的 transition
    - 低难度:均匀采样
    """
    if difficulty > 0.7:
        # 计算每个 transition 的目标距离
        distances = [np.linalg.norm(t[0][-3:] - t[-2]) for t in buffer]
        probs = softmax(-np.array(distances))
        idx = np.random.choice(len(buffer), p=probs)
    else:
        idx = np.random.randint(len(buffer))
    return buffer[idx]

避坑指南

  1. 维度不匹配错误
  2. 现象:HER 采样时出现ValueError: shapes (3,) and (4,) not aligned
  3. 解决:确保 state 中目标描述部分的维度与 goal 完全一致

  4. 采样频率过高

  5. 现象:训练初期出现剧烈震荡
  6. 解决:调整 HER 的 k 参数(建议从 2 开始逐步增加)

  7. 奖励塑形失衡

  8. 现象:智能体学会 ” 欺骗 ” 奖励函数(如始终靠近目标但不抓取)
  9. 解决:调整环境原始奖励与 HER 奖励的权重比 $\lambda$

性能验证

实验对比(机械臂 Reach 任务):

方法 收敛步数 最终成功率
PPO (原始) 8.2M 61%
PPO+HER 3.1M 78%
PPO+HER+ 课程 2.7M 85%

深度强化学习实战:如何用 Awesome-DRL 框架解决稀疏奖励问题

TensorBoard 显示:添加课程学习后(蓝色曲线),早期训练阶段的回报提升速度显著加快

开放问题

当前方案仍需手动设计课程难度评估指标。更智能的方向可能是:
– 基于策略熵自动调整难度
– 使用元学习优化课程进度
– 结合人类示范数据初始化课程

正文完
 0
评论(没有评论)