本文记录了我见到的一些强化学习问题,并会持续更新。
学习
我建议按以下顺序学习:
- Python(或其它语言)
- PyTorch(或其它深度学习软件包)
- 深度监督学习(例如 MNIST 手写识别)
- 表格型强化学习(例如 Q-Learning、TD($\lambda$))
- 深度 Q-Learning(例如 DQN、D3QN)
- 策略梯度方法(例如 DDPG、SAC、PPO、TD3)
- 进阶成果(例如 AlphaGo、MuZero、Agent57)
Python
菜鸟教程(中文)
多臂老虎机
深度强化学习
进阶成果
MuZero,知乎(中文)
现有工具包
RLlib
https://docs.ray.io/en/master/rllib.html
- 流行的全能型开源库
- 需要花时间学习
ElegentRL
https://github.com/AI4Finance-Foundation/ElegantRL
- 轻量且可扩展的开源库
- 容易学习
- 仍在开发和改进中
环境
一般来说,Environment 类派生自 gym.Env,并遵循其接口定义。
一般来说,Environment 的计算开销主要集中在 CPU。
状态
表示
许多流行的 CNN 结构并不适合强化学习,包括:
- Batch Norm
- 平移不变操作,例如池化
有时还需要:
- 在深层网络的输出层使用正交归一化
- 随参数数量增加而采用较低的学习率,或冻结参数
奖励
设计
奖励设计没有统一标准。原则上,奖励越密集,学习越快;收敛性能则取决于奖励所提供的引导。
经验回放缓冲区
经验回放缓冲区应尽可能大,以便描述环境和策略。
当经验回放缓冲区无法足够大时,可以尝试降低学习率。
优先经验回放(PER)
优先经验回放会使深度网络的数据发生分布偏移;当奖励密集时,这会对性能产生很大影响。通常,我们在训练早期使用 PER。
作为一种改进,可以尝试自模仿学习。
自我博弈
没有可用基线时,如何评估策略?
一种思路是:维护一个由历史策略组成的基线策略集合。
- 在训练期间记录历史策略。
- 按“支配关系”对策略分级,也就是更高等级的策略压制更低等级的策略。
- 从每个等级抽取策略,组成基线策略集合。
测试方法
强化学习方法比监督学习方法更复杂。出现 BUG 时,往往会不知道该如何继续。下面是一些建议:
- 从易到难。 例如,通过 DQN 构建 D3QN,通过基础环境构建困难环境,在“gridworld”“cartpole”等简单环境上测试强化学习方法,或者基于成熟工作修改强化学习方法。
- 为方法中的每个模块编写测试,例如经验回放缓冲区。
- 进一步学习强化学习、PyTorch/Tensorflow、Python 等知识。
工具
- PyCharm profiler
- memory_profiler、line_profiler
- Pytorch.autograd:profiler、grad_check、anomaly_detection
- 断点
- Print()