1. 资料
PG 方法核心思路:https://pangruitao.com/post/5164
2. PPO 算法思路
PPO 是基于 AC 的进一步优化。AC 的思路和实现见:https://pangruitao.com/post/5262
其核心优化思路是: 限制策略更新幅度
- AC 的策略更新可以导致策略分布变化过大,从而影响训练的稳定性。
- PPO 引入了 Clipped Objective,通过对策略比率的更新幅度进行限制,避免单次更新过大。
更新幅度定义为:
- \(r_t(\theta) = \frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)} = \exp\left(\log \pi_\theta(a|s) – \log \pi_{\theta_{\text{old}}}(a|s)\right)\)
更新时对幅度进行限制,使更新公式为
- \(L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\left( r_t(\theta) \cdot \hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) \cdot \hat{A}_t \right) \right]\)
3. PPO 算法实践
3.1 CartPole-v1 场景说明
先继续和 Q Learning 一样,针对 gym 的 CartPole-v1 场景(控制小车平衡杆)进行学习:
3.2 实现和结果
个人实现基本的 AC 的 Jupyter Notebook 代码和运行结果见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s12_ppo.ipynb
- 策略神经网络仅 1 层隐藏层,且大小仅为 128*128
得到的训练分数情况如下
看起来相比 AC 并没有明显提升。
尝试扩大网络,并通过积累一个 batch 的经验再统一更新追求稳定性,实现 Jupyter Notebook: https://github.com/Raytto/my_ml_study/blob/main/pg_study/s13_ppo_256.ipynb
- 每层神经元数量从 128 增加到 256
分数有所提升,但稳定性依旧有限。看来 PPO 也是需要精心设计和调整的,并不万能。