重构 PPO/TRPO 训练流程并添加对比绘图

- PPO: 改为 Actor/Critic 联合小批量训练,新增梯度裁剪 (max_grad_norm),
  分离 actor_lr/critic_lr,添加 get_value(),GAE 部分补充论文公式注释
- TRPO: 添加 get_value(),调整 tau 从 0.97 到 0.95
- Networks: 移除 PolicyNet 输出层的 tanh,初始化 log_std=0 以增强探索
- Main: 抽取 train_agent() 通用训练函数,新增 TRPO 训练和 PPO vs TRPO
  对比曲线图(原始曲线 + 滑动平均平滑曲线)
This commit is contained in:
2026-04-02 16:36:55 +08:00
parent 96cd594be9
commit 771eba8607
4 changed files with 121 additions and 155 deletions
+4 -4
View File
@@ -36,11 +36,11 @@ class PolicyNetwork(nn.Module):
nn.Linear(hidden_dim, hidden_dim),
nn.Tanh(),
nn.Linear(hidden_dim, action_dim),
nn.Tanh() # 关键修复:强制均值输出在 [-1, 1] 之间,防止动作空间爆炸
# 论文原文: tanh 只用于隐藏层激活,输出层是线性的
# 加 tanh 会在 action 接近边界时梯度趋零(饱和),阻碍学习
)
# 初始对数标准差设为 -0.5 (对应的标准差约为 0.6)
# 较小的初始方差有助于防止初期探索步子迈得太大导致系统崩溃
self.action_log_std = nn.Parameter(torch.full((1, action_dim), -0.5))
# 初始对数标准差设为 0(std=1.0),提供充足的初始探索
self.action_log_std = nn.Parameter(torch.zeros(1, action_dim))
def forward(self, state):
# 计算动作均值并将其缩放到实际的物理边界内