53 lines
2.0 KiB
Markdown
53 lines
2.0 KiB
Markdown
"""
|
||
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 改为 == 2(LAST 定义)
|
||
- 移除中间重置逻辑
|
||
|
||
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 语义
|
||
- 中间重置必须在环节收集函数外处理,不在内部
|
||
"""
|