Fastai在计算机视觉和表格学习方面的表现令人惊叹。有人希望RL的情况也一样。这个回购协议的目的是要有一个尽可能容易启动的框架,但也为测试新代理而设计。
fast-rl的Python项目详细描述
快速强化学习
本回购协议不隶属于杰里米·霍华德或他的课程,可在此处找到:此处 我们将使用fastai库中的组件来构建和训练我们的强化学习(rl) 代理. < /P>
请注意,下面是现有rl框架的详细介绍:
然而,Pythorch中也有一些框架,最引人注目的是Facebook的地平线:
我的动机是现有的框架通常使用tensorflow,这并不反对tensorflow,但是我有 使用Pythorch在较短时间内完成更多任务。
Fastai在计算机视觉和表格学习方面的表现令人惊叹。有人希望RL的情况也一样。 这个回购协议的目的是要有一个尽可能容易启动的框架,但也要为测试而设计 新代理。
目录
- 安装
- beta todo
- 代码
- 版本控制
- 贡献
- 样式 < > >
- [X]mdpdatabunch:完成到有用的程度。请参考:
测试/测试环境
示例: - [X]DQN代理:参考
测试/测试学习者/测试基本模型迷宫
。这个测试是 有点像地狱的风景。你会注意到我计划使用学习者回调来实现一个fit函数。另外请注意,健身房迷宫环境 至少对于离散测试是很重要的,因为你可以用模型的奖励来加热迷宫。 完成了dqn agent的基本学习/优化。它无疑是不稳定的。请注意下一步。 - [X]agentInterpretation:第一种方法是热映射 具有超级重要调试预期回报的环境。在上面的代码中,我们用迷宫测试 有充分的理由。与其他环境相比,迷宫热图奖励非常简单。
- []学习者基础:在DQN和添加DDQN、固定目标、DDDQN之后,我们需要转换这个(最有可能)混乱的测试 变成一个合适的物体。与基础学习者相似。
- []DDPG代理:我们需要至少有一个代理能够执行连续的环境执行。注意,我们 可以通过binning使离散代理能够在连续域中操作。
- []学习者重构:DDPG可能会把一切都搞砸,哈哈。我们需要重新思考学习者/也许尝试 消除本机Fastai库方法的一些自定义方法。
- []像Fastai这样的单一全局拟合功能。更好的是,实际上只需使用它们的通用拟合功能。
- 环境应该是可pickle和可序列化的。它们应该能够多次关闭和启动 在运行时。
- 对于每个步骤,代理所需的信息不应超过环境的图像或状态值。这意味着 不应期望环境允许输出接触点、子目标或striPS式逻辑输出。
- 关闭/启动:某些环境(pybullet)存在关闭和启动不同环境的问题。 幸运的是,我有一个叉子弹头,所以这些修改将被强制执行。
- pickling:能够将环境封装为
.pkl
对于保存它和所有信息非常重要 它产生了。 - 可串行化:如果我们想进行并行处理,环境需要可串行化才能在 这些过程。
- 环境可以更容易无目标,或者有一个单一的目标,其中openai定义为
env
和goalenv
- 在if语句的情况下,允许"pep 8每行多个语句",只要它们仍然是 在列限制内。
安装
很快我就想添加一些脚本来安装一些复杂的依赖项。我们有两个步骤:
1.a快速
安装fastai
或者如果你是水蟒(这是一个好主意,我会使用水蟒),你可以做:conda安装-c pytorch-c fastai fastai
1.b可选/附加环境
开放所有健身房:PIP安装健身房[全部]
迷宫:git克隆https://github.com/mattchantk/gym maze.git
CD健身迷宫
python setup.py安装
2实际回购
git克隆https://github.com/josiahls/fast reinforcement learning.git
CD快速强化学习
python setup.py安装
βtodo
目前这些是我个人迫切需要的东西,然后好的东西将使这个回购 有价值的东西。它们按我计划执行的顺序列出。
关键
fromfast_rl.core.EnvsimportEnvsfromfast_rl.core.MarkovDecisionProcessimportMDPDataBunch# At present will try to load OpenAI, box2d, pybullet, atari, maze.# note "get_all_latest_envs" has a key inclusion and exclusion so if you don't have some of these envs installed, # you can avoid this here.forenvinEnvs.get_all_latest_envs():max_steps=50# Limit the number of per episode iterations for now.print(f'Testing {env}')mdp_databunch=MDPDataBunch.from_env(env,max_steps=max_steps,num_workers=0)ifmdp_databunchisNone:print(f'Env {env} is probably Mujoco... Add imports if you want and try on your own. Don\'t like 'f'proprietary engines like this. If you have any issues, feel free to make a PR!')else:epochs=1# N episodes to runforepochinrange(epochs):forstateinmdp_databunch.train_dl:# Instead of random action, you would have your agent heremdp_databunch.train_ds.actions=mdp_databunch.train_ds.get_random_action()forstateinmdp_databunch.valid_dl:# Instead of random action, you would have your agent here and have exploration to 0mdp_databunch.valid_ds.actions=mdp_databunch.valid_ds.get_random_action()
基本dqns最大的问题之一是q值经常移动。实际的基本dqn应该 成为一个固定目标DQN,但是让我们转移到一些调试工具,这样我们更有效。
可测试代码:
fromfast_rl.agents.DQNimportDQNfromfast_rl.core.LearnerimportAgentLearnerfromfast_rl.core.MarkovDecisionProcessimportMDPDataBunchdata=MDPDataBunch.from_env('maze-random-5x5-v0',render='human')model=DQN(data)learn=AgentLearner(data,model)epochs=450callbacks=learn.model.callbacks# type: Collection[LearnerCallback][c.on_train_begin(max_episodes=epochs)forcincallbacks]forepochinrange(epochs):[c.on_epoch_begin(episode=epoch)forcincallbacks]learn.model.train()forelementinlearn.data.train_dl:learn.data.train_ds.actions=learn.predict(element)[c.on_step_end(learn=learn)forcincallbacks][c.on_epoch_end()forcincallbacks][c.on_train_end()forcincallbacks]
结果:
<表><广告>我相信特工在第一集之后就爆炸了。别担心!我们会做一个RL翻译看看 继续!
用法示例:
fromfast_rl.agents.DQNimportDQNfromfast_rl.core.InterpreterimportAgentInterpretationv1fromfast_rl.core.LearnerimportAgentLearnerfromfast_rl.core.MarkovDecisionProcessimportMDPDataBunchdata=MDPDataBunch.from_env('maze-random-5x5-v0',render='human')model=DQN(data)learn=AgentLearner(data,model)epochs=10callbacks=learn.model.callbacks# type: Collection[LearnerCallback][c.on_train_begin(max_episodes=epochs)forcincallbacks]forepochinrange(epochs):[c.on_epoch_begin(episode=epoch)forcincallbacks]learn.model.train()forelementinlearn.data.train_dl:learn.data.train_ds.actions=learn.predict(element)[c.on_step_end(learn=learn)forcincallbacks][c.on_epoch_end()forcincallbacks]# For now we are going to avoid executing callbacks here.learn.model.eval()forelementinlearn.data.valid_dl:learn.data.valid_ds.actions=learn.predict(element)ifepoch%1==0:interp=AgentInterpretationv1(learn)interp.plot_heatmapped_episode(epoch)[c.on_train_end()forcincallbacks]<表><广告>
如果我们改变:
interp=AgentInterpretationv1(learn)interp.plot_heatmapped_episode(epoch)
至:
interp=AgentInterpretationv1(learn)interp.plot_episode(epoch)
我们可以为特定剧集制作以下情节:
<表><广告>由agentEnterpretation对象决定,我们需要调试或改进代理。 我们将在创建适合学习者的功能的同时进行此操作。
附加的
代码
一些关键的收获是Fastai使用回调。回调不仅允许日志记录,实际上还可以添加 对泛型fit函数的回调可以彻底改变其行为。我的目标是建立一个简单的图书馆 尽可能在服务器或自己的计算机上运行。我也对这种易于扩展的方式感兴趣。
我有几个假设,我认为代码/支持算法应该遵循:
理性:
一些额外的假设:
这些假设对于我们从其他回购中实现其他env是必要的。我们不想被束缚在 开放式健身房。
版本控制
目前回购正处于阿尔法阶段。我计划把这个从alpha版本移到伪beta/working版本。 无论版本如何,我们都将遵循python风格的版本控制
alpha版本:...例如0.1.0.
Git+工作流
样式
Fastai没有严格遵循从Guidos推荐中派生的谷歌Python风格指南",
不过,在本回购协议中,我们将使用本指南。
但是,有些例外情况(通常在fastai中发现):