1. 资料
PG 方法核心思路:https://pangruitao.com/post/5164
2. REINFORCE 思路
REINFORCE 就基本按照 PG 的核心思路实现的,详见:https://pangruitao.com/post/5164
先每次采样完整一次游戏,再回溯计算并更新梯度
优势函数也就直接用奖励折现:
\(\sum_{t=0}^{T} \gamma^t r(s_t, a_t)\)。
参数更新方法:
\(\theta \leftarrow \theta + \alpha \nabla_{\theta} \log \pi_{\theta}(a|s) \hat{A}(s, a) \)
且优势函数 \(\hat{A}(s, a)\) 也采用最直接的奖励折现形式:
\(\sum_{t=0}^{T} \gamma^t r(s_t, a_t)\)。
3. REINFORCE 实践
3.1 CartPole-v1 场景说明
先继续和 Q Learning 一样,针对 gym 的 CartPole-v1 场景(控制小车平衡杆)进行学习:
3.2 实现和结果
个人实现基本的 REINFORCE 的 Jupyter Notebook 代码和运行结果见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s1_base_reinforce.ipynb
- 策略神经网络仅 1 层隐藏层,且大小仅为 128*128
得到的训练分数情况如下
其实还挺满意的,Q Learning 我同样大小神经网络,仅最高到 40 分左右就开始骤降。
GP 的无偏估计应该还是挺有价值的(难怪策略梯度学习算法在目前更流行)。
3.3 稳定性优化
3.3.1 梯度 Clip 方法
先尝试了梯度截取的方法,chatGPT 说可以让训练更稳定。
完整 Jupyter Notebook 实现和运行结果见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s2_base_reinforce_clip.ipynb
仅在反向传播梯度计算以后添加一句 clip:
policy_loss.backward()
nn.utils.clip_grad_norm_(policy_net.parameters(), max_norm=clip_norm)
- 其中 clip_norm 是截断的范围(几倍标准差)
不过个人尝试后,这个方法效果至少在这里效果并不明显。且训练开始阶段需要把 max_norm 设置很大,否则基本学不动。但后期改小以后(chatGPT 推荐模型较稳以后设为 2)也并没有对实际稳定性有太多帮助。
个人训练情况:
形如和中国股市一样,完全不稳定。
3.3.2 批量学习
尝试通过批量学习的方式,让批量样本使噪音梯度相互抵消,留下更有价值的梯度,再学习。
先采用样本梯度直接相加的方式实现,详见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s3_base_reinforce_multi.ipynb
- 每批 50 次游戏。梯度相加再进行一次更新
训练情况:
效果并不太好。不过也可以预见,毕竟是梯度相加。
再尝试加入平均梯度,相对于刚才的梯度相加方式,仅把梯度额外除以了批次数量:
policy_loss = T.stack(policy_loss).sum() / batch_size
实现详见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s4_base_reinforce_multi_avg.ipynb
训练情况:
表现和稳定性都好了一些(主要关心稳定性)
3.3.3 尝试加大规模
当稳定性还不错了以后,但成绩又没有达到很高水平(最高500)。则最简单粗暴则是加大神经网络。
先尝试将网络大小从 128 扩展到 256。
实现详见:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s4_base_reinforce_multi_avg.ipynb
训练情况:
似乎并没有太好的提升,反而稳定性更差了(也可能之前稳定性也不足,只是训练时间还不足以体现)
再尝试一下提升大小到 512:https://github.com/Raytto/my_ml_study/blob/main/pg_study/s6_base_reinforce_512.ipynb
训练情况:
依旧很不稳定。
4. 后续
REINFOECE 虽然训练很不稳定,但这套思路是很清晰的。基于这套基本思路发展出后来的改进算法如 AC、PPO 等
AC 方法的思路和实践:https://pangruitao.com/post/5262