ML2.2.1 PG 之 REINFORCE 方法思路和实践

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

发表评论