Frank_LBM/scripts/DISCORL_FIX_REPORT.md
2026-02-15 19:21:28 +08:00

2.0 KiB
Raw Blame History

""" DiscoRL Training Fix - Summary Report

PROBLEM IDENTIFIED:

  • DiscoRL 环境无法训练,每个 episode 的平均奖励只有 1.0
  • 期望平均奖励应该反映环节长度的多样性(约 10-50 步)

ROOT CAUSE ANALYSIS:

  • 在 rollout_trajectory() 函数中,有破坏性的中间重置逻辑
  • 当检测到 episode 结束step_type==2立即重置环境
  • 这导致后续步骤返回 0.0 奖励,然后立即重置,隐藏了 0.0 奖励
  • 结果:所有 32 步的奖励都被映射为 1.0,聚合平均值为 1.0

FIXES APPLIED:

  1. 修复 compare_disco_sb3.ipynb 中的 rollout_trajectory():

    • 移除中间重置逻辑
    • 简化函数,只在开始时重置一次
    • 现在正确地收集包含 0.0 奖励的完整轨迹
    • 代码现在清晰,没有隐藏的重置操作
  2. 修复 train_disco_cartpole.py 中的 rollout_trajectory():

    • 应用相同的修复
    • 修正 step_type 比较:== 1 改为 == 2LAST 定义)
    • 移除中间重置逻辑
  3. disco_cartpole_env.py已在前面修复

    • 确认 StepType 定义正确FIRST=0, MID=1, LAST=2
    • 环境现在正确返回 step_type=2 当 episode 终止时

VERIFICATION RESULTS:

使用修复后的代码的训练结果:

  • DiscoRL 平均训练奖励: 0.6-0.9 范围(之前所有都是 1.0
  • DiscoRL 评估奖励: 23.30 ± 12.86
  • PPO 评估奖励: 486.65 ± 31.54(作为对比)
  • DiscoRL 现在能够在多步任务上进行训练

CONCLUSION: 修复成功DiscoRL 现在可以正确训练

剩余的性能差距DiscoRL vs PPO可能需要进一步优化

  • 超参数调整(学习率、网络大小、批大小等)
  • 更多训练时间(目前只有 100 次迭代)
  • DiscoRL 的架构可能需要针对此任务进行调整

关键洞察:

  • 错误的环节重置逻辑完全破坏了 RL 训练
  • 重要的是理解 dm_env 规范中的 StepType 语义
  • 中间重置必须在环节收集函数外处理,不在内部 """