具身系列——比较3种vpg算法方式玩CartPole游戏(强化学习)
文档1方式参考:https://gitee.com/chencib/ailib/blob/master/rl/vpg_baseline_cartpole.py
文档2方式参考:https://gitee.com/chencib/ailib/blob/master/rl/vpg_batchupdate_cartpole.py
文档3方式参考:https://gitee.com/chencib/ailib/blob/master/rl/vpg_standard_cartpole.py
三个文档算法的异同分析及可取之处
一、共同点
-
算法基础
均基于策略梯度方法(Policy Gradient),核心是REINFORCE算法或其改进版本,通过优化策略网络直接输出动作概率分布。 -
环境处理
• 均针对CartPole-v1
环境,适配不同版本的Gym API(处理terminated
和truncated
返回值差异)。• 状态和动作空间的定义方式一致(如
env.observation_space.shape[0]
)。 -
折扣回报计算
均使用折扣因子(Gamma) 对轨迹的未来奖励进行衰减,计算累积回报。 -
框架与优化器
• 使用PyTorch实现神经网络,优化器均为Adam。• 策略网络结构均为全连接网络,输出Softmax动作概率。
二、差异点
特征 | 文档1(带基线REINFORCE) | 文档2(批量REINFORCE) | 文档3(标准策略梯度) |
---|---|---|---|
基线网络 | ✅ 使用Critic网络计算基线值,优势值减少方差 | ❌ 无基线,直接使用折扣回报 | ❌ 无基线,但回报标准化(减均值/标准差) |
更新方式 | 单episode更新(蒙特卡洛) | 批量更新(收集多episode后更新) | 单episode更新,结合滑动平均奖励监控 |
网络结构 | 简单网络(128隐藏层) | 深层网络(4层ReLU) | 中等网络(30隐藏层,tanh激活) |
回报处理 | 优势值 = 回报 - 基线值 | 折扣回报标准化(减均值) | 折扣回报标准化(减均值/标准差) |
兼容性处理 | 动态修补NumPy兼容旧版Gym | 适配不同Gym版本step返回值 | 适配新版Gym的reset/step返回值 |
额外功能 | 动态渲染测试 | 训练/测试结果可视化 | 模型保存/加载、训练时动态开启渲染 |
三、各自的可取之处
1. 文档1:带基线的REINFORCE
• 优势值计算
引入Critic网络预测状态价值作为基线,通过优势值=回报-基线
减少策略更新的方差,显著提升训练效率。
• 网络分离设计
策略网络(Actor)和基线网络(Critic)分离,结构清晰,便于单独优化。
• 兼容性修复
动态修补np.bool8
兼容旧版Gym,避免AttributeError。
2. 文档2:批量更新的REINFORCE
• 批量训练机制
收集多个episode的轨迹后统一更新参数,提升硬件利用率,适合复杂环境。
• 深度网络结构
使用4层ReLU网络,增强状态表征能力,适合高维状态空间。
• 完整可视化
绘制训练/测试奖励曲线,直观展示算法性能,便于调试和分析。
3. 文档3:标准策略梯度
• 回报标准化
对折扣回报进行均值中心化和标准差缩放,避免梯度爆炸/消失,提升稳定性。
• 实用功能完善
支持模型保存/加载、训练时动态渲染控制,适合实际部署和演示。
• 权重初始化
对网络参数显式初始化(正态分布+偏置),加速收敛。
四、总结与建议
• 选择建议
• 需快速收敛:选文档1(带基线)+ 文档3(回报标准化)。
• 需处理复杂状态:选文档2(深层网络)+ 文档1(基线)。
• 需部署和稳定性:选文档3(模型保存+标准化)。
• 改进方向
结合三者的优点:带基线的网络 + 批量更新 + 回报标准化 + 可视化与模型保存。
附文档1算法执行:
Episode 0, Total Reward: 37.0
Episode 50, Total Reward: 31.0
Episode 100, Total Reward: 29.0
Episode 150, Total Reward: 28.0
Episode 200, Total Reward: 26.0
Episode 250, Total Reward: 70.0
Episode 300, Total Reward: 218.0
Episode 350, Total Reward: 346.0
Episode 400, Total Reward: 202.0
Episode 450, Total Reward: 500.0
附文档2算法执行:
附文档3算法执行: