【学习】OpenAI 深度强化学习教程
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
|
【强化学习 185】ElegantRL
前面跟一个朋友聊天,给我介绍了他们做的强化学习框架 ElegantRL 。这里给大家介绍一下。
一句话概括强化学习:Agent 不停地与环境互动,通过反复尝试的方式进行学习,在一定的不确定性下做出决策,最终达到探索(尝试新的可能)与利用(利用旧的知识)之间的平衡。
深度强化学习(DRL)在解决对人类有挑战性的多个现实问题中展示了巨大的潜力,例如自动驾驶,游戏竞技,自然语言处理(NLP)以及金融交易等。各种各样的深度强化学习算法及应用正在不断涌现。ElegantRL能够帮助研究人员和从业者更便捷地「设计、开发和部署」深度强化学习技术。ElegantRL的elegant体现在以下几个方面:
- 轻量:Tutorial 版将一直维持在 1000 行以内,并保持与正式版拥有相同的 API。
- 高效:性能向 Ray RLlib 靠拢,支持多GPU 训练。
- 稳定:比 Stable Baseline 3 更加稳定。
ElegantRL 基于 Actor-Critic 框架搭建深度强化学习算法,每一个 Agent(即 DRL 算法)由 Actor 网络和 Critic 网络组成。利用 ElegantRL 完整简洁的代码结构,用户可以非常轻松地开发自己的 Agent。这一点比较适合入门学习强化学习和科研做强化学习算法的同学。
总述:文件结构和函数
上述文件可以在此路径下找到:ElegantRL/elegantrl at master ・ AI4Finance-Foundation/ElegantRL。
ElegantRL的“小”最直观的体现就是:整个库只有3个文件,即 net.py, agent.py, run.py。再加上一个 env.py 用于存放与训练环境有关的代码。在 Tutorial 版用少于 1000 行的代码实现了一个完整的 DRL 库。请注意,Tutorial 版的 ElegantRL 只是用来学习的,它可以快速地让人了解一个DRL库最为核心的结构。如果想要进一步把 ElegantRL 当做生产工具,则需要使用正式版的 ElegantRL,它的文件结构和函数保持了与 Tutorial 版的统一,降低了学习成本。
如图所示:
- env.py:包含与 Agent 互动的环境
- 包括PreprocessEnv类,可用于对gym的环境进行改动。
- 包括自主开发的股票交易环境作为用户自定义环境的例子。
- net.py:包含三种类型的网络,每个类型均包括一个网络基类,以便于针对不同算法进行继承与派生。
- Q网络
- Actor网络
- Critic网络
- agent.py:包含不同用于算法的Agent。
- run.py:提供用于训练和测试的基本函数。
- 参数初始化
- 训练
- 评测
我们从一个较高的层面描述这些文件之间的关系。首先,初始化 env.py 文件中的环境和 agent.py 文件中的 Agent 类。Agent 类既包含了 net.py 文件中的网络,又与 env.py 文件中的环境进行互动。在 run.py 中进行的每一步训练中,Agent 都会与环境进行互动,产生transitions并将其存入回放缓存(Replay Buffer)。之后,Agent 从 Replay Buffer 中获取数据来更新它的网络。每隔一段时间,都会有一个评测器(Evaluator)来评测策略的得分,并保存表现好的策略。我们也提供了“demo.py”文件作为示例,可以帮助用户更好地理解这个过程。
网络类的集合 net.py
net.py 文件存放了算法库会使用到的4类神经网络:
'''Q 网络''' class QNet(nn.Module): class QNetDuel(nn.Module): class QNetTwin(nn.Module): class QNetTwinDuel(nn.Module): '''Policy 网络(Actor)''' class Actor(nn.Module): class ActorPPO(nn.Module): class ActorSAC(nn.Module): '''Value 网络(Critic)''' class Critic(nn.Module): class CriticAdv(nn.Module): class CriticTwin(nn.Module): '''参数共享 网络(Shared)''' class SharedDPG(nn.Module): class SharedSPG(nn.Module): class SharedPPO(nn.Module):
将神经网络单独存放到一个文件,能为使用者微调算法提供便利。这种模式把深度学习的网络与强化学习隔开,提高了代码的可读性。我们提供两个实用的例子:
- 把图片作为state输入神经网络时,只需要在 net.py 将全连接层修改为卷积层即可,我们提供了这个例子,当网络检测到输入的张量是图片时,会自动启用卷积网络。
- 对于高维度状态空间的任务(high-dimensional task),共享网络的参数能明显提升RL算法性能。我们也提供了共享不同算法的网络参数的例子。
DRL算法的构建 agent.py
agent.py 存放了不同的 DRL 算法。在这一部分,我们将分别描述 DQN 系列算法和 DDPG 系列算法。我们将会发现 ElegantRL 中每一个 DRL 算法的 Agent 都继承自它的基类。
DQN系列中的Agent类:
class AgentDQN: class AgentDuelingDQN(AgentDQN): class AgentDoubleDQN(AgentDQN): class AgentD3QN(AgentDoubleDQN):
如图 2 所示,ElegantRL 中 DQN 系列 Agent 的继承层级关系为:
- AgentDQN:标准的DQN Agent。
- AgentDoubleDQN:为了减少过高估计而包含两个 Q 网络的Double-DQN Agent,继承自AgentDQN。
- AgentDuelingDQN:采用不同的 Q 值计算方式的 DQN Agent,继承自 AgentDQN。
- AgentD3QN:AgentDoubleDQN 和 AgentDuelingDQN的结合,继承自 AgentDoubleDQN。
DDPG系列中的Agent类:
class AgentBase: class AgentDDPG(AgentBase): class AgentTD3(AgentDDPG): class AgentPPO(AgentBase): class AgentSAC(AgentBase): class AgentModSAC(AgentSAC): class AgentSharedAC(AgentBase): class AgentSharedSAC(AgentBase): class AgentSharedPPO(AgentBase):
如图 3 所示,ElegantRL 中 DDPG 系列的继承层级关系为
- AgentBase:所有 Actor-Critic 框架下 Agent 的基类,包括
【强化学习】RL学习笔记总结
挖坑,写得很杂,还没整理;
书籍/教材
- 李宏毅老师的《深度强化学习》
- 周博磊老师的《强化学习纲要》
- 李科浇老师的《世界冠军带你从零实践强化学习》
link:
博客/文章:
- 岳路飞:强化学习路线图
- 强化学习实践教学 | 微笑紫瞳星
论文/期刊
Github:
- 文章部分ppt截图和视频截图来来自于百度飞桨的视频课程
强化学习算法按照环境是否已知(或者说是否已知状态之间的转移概率)可以分为无模型(model-free)和基于模型(model-based)的,其中针对model-free算法的研究比较热门;
而在Model-free算法中又可以按照学习目标分为Value-based算法和Policy-based算法。
我们给每一个状态都赋予一个“价值”的概念,例如下图C状态的价值大于A状态,也就是往C走离奖励更近。我们的做法是让Agent总是往价值高的地方移动,这样就能找出一个最优的策略。一旦函数优化到最优了,相同的输入永远是同一个输出。
代表方法:Sarsa、Q-learning、DQN。
基于价值的算法根据学习方式不同又可以分为On-policy和Off-policy的:
On-policy的算法,探索环境使用的策略和要更新的策略是一个策略(如SARSA):优化的是实际执行的策略,因此只存在一种策略。
Off-policy的算法,探索环境使用的策略和要更新的策略不是同一个策略(如Q-learning):一种是Target policy,使我们想要的最佳的目标策略。另一个是Behavior policy,是探索环境的策略,需要大胆探索所有可能的环境,然后交给目标策略去学习。而且交给目标策略的数据不需要 +1
也就是说,探索的策略没变,都是往高价值的格子方向探索并带有10%的探索几率。但是更新格子价值的时候,我们并不是根据探索的下一步来调整格子的价值,而是挑选周围全部可以达到的格子价值的最大值。因此,在Q-learning中,价值低的格子并不能影响周围格子的价值,只有价值高的格子才能影响周围格子的价值。
这和Sarsa不同,Sarsa下一步格子的价值都会影响到上一步格子,因此在reward为负数的格子周围那些格子的价值也为负数,因此agent会绕的远远地。而Q-learning,没有这个顾虑,因此agent直接就是最短路径拿到reward,因此total-reward会比Sarsa高。
当我们的强化学习(RL)碰到了深度学习(DL),我们就来到了深度强化学习(DRL)的领域。
表格法有很大的缺陷:
- 表格占用的内存空间巨大。
- 当表格极大时,查表效率低下。
- 只能表示有限个离散状态和动作。
现在我们需要更换工具了,我们可以用神经网络来代替表格法,我们可以用S和A作为神经网络的输入,由此输出价值Q。也可以输入S并输出多个Q,每个Q对应一个A。神经网络只需要储存有限的网络参数,我们的任务就是不断调整这些参数,使得输入输出符合我们的预期,而且状态可以泛化,相似的状态输出也差不多,不用像表格法一样需要重新训练。
其中利用神经网络求解RL的经典算法是DQN。这是2015年发表在Nature上的论文。神经网络的输入是像素级别的图像,使用神经网络近似代替Q表格,49个游戏中有30个超越人类水平。
DQN的做法类似于Q-learning和神经网络的组合。首先神经网络的训练方法是监督学习,其中训练的样本就是输入状态变量,输出动作Action,我们通过Q-learning不断更新这些样本,然后送到神经网络中进行训练,期望拟合出一个和原来Q表格差不多的神经网络。
DQN提出了两个创新点使得其更有效率也更稳定。
第一个是经验回放。经验回放可以充分利用off-policy的优势,可以利用Behavior Policy探索的数据特征形成一组组数据,并且可以随机打乱,使得神经网络可以重复多次地进行学习。这样可以打乱样本的关联性,而且能提高样本利用率。
第二个是固定Q目标。增加了算法的平稳性。由于在探索过程中的Q也是时时刻刻都在变化的,因此我们训练的神经网络很难去逼近它的值,因此我们需要把Q值固定一段时间来训练参数,这是Q网络。我们需要另外一个一样的网络(target Q网络),Q网络的作用是产生一个Q预测值,直接用来决策产生action。而target Q是产生一个Q目标值,我们需要训练网络让这两个值越接近越好,这个Loss就是网络需要优化的目标,利用这个Loss我们就可以更新Q网络的参数。刚开始我们的网络的输出是随机的,但是受到reward的影响,各个状态的价值随着更新都会逐渐区分开来。
Tutorial 代码:OpenAI Baseline:代码详解:深度强化学习专栏 -- 2.手撕DQN算法实现CartPole控制
上面我们所学的是value-based,通过探索将Q价值更新到最优,然后根据Q价值来选择最优的动作。下面我们讲policy-based,动作选择不再依赖价值函数,而是根据一个策略走到底,看最后的总收益决定算法好坏,好Action将在以后有更大的概率被随机到。
基于策略:我们直接让一条策略走到底,然后用最后的reward来判断策略是好是坏。好的策略能在以后的行为中获得更高的触发几率。由于输出的是几率,因此同样的输入会获得不同的输出,随机性更强。
代表方法:Policy Gradient。
可以看到,智能体通过直接输出一个动作选择的概率来选择下一步的action,这个策略是可以优化的,但是执行一个action之后有多种状态的可能性,这也就是环境的随机性。不断输出动作到新的状态到游戏结束称为完成一个episode,这一串的交互称为一个episode的轨迹(Trajectory)。
期望回报是穷举所有在该策略下的轨迹能拿到的回报(Reward)的平均值,在实际运用中我们无法穷举,也不能得出状态转移概率,但是我们可以通过运行多个episode然后将得到的reward取平均近似认为是期望回报。
由于我们没有label对我们的网络进行更新,这时候就需要利用我们的期望回报了,我们通过梯度上升法使得我们的reward变大,那么就能使得策略变好,经过推导可以得出我们更新的梯度公式如下:
重点来了!!!我们使用的更新方式是Policy Gradient,也就是策略梯度,我们的loss依旧通过交叉熵方式获得,但还需要乘以一个 作为权重,也就是我们计算出来的总收益!总收益越高的说明我们的决策越好, 越大,我网络会用较大的梯度来进行更新,反之 较小则用小梯度更新。这样进行多次更新之后,我们网络算出来的决策就会越来越趋近于好的决策。
对于离散的动作,我们直接采用价值计算的原始公式,然后用梯度上升法即可,具体操作可以用蒙泰卡罗采样的方法代替:
对于连续动作(对于离散动作同样适用),例如代码中的例子:
其中对于每个动作价值Q的计算都是在完成一个episode之后,利用带折扣的Reward从后往前进行计算的。还有一种就是利用神经网络来近似价值函数的方法,称为Actor-Critic。
在连续动作空间的求解中,前面讲的Sarsa,DQN,Q-learning,Reinforce都是没有办法处理的。这时候我们就需要用神经网络的输出代表一个动作的“幅度”,而不是单纯决定做某个动作。例如我们可以用一个-1到1的输出来控制小车的速度,正数是前进,负数是后退,绝对值越大速度越快。
我们有两个神经网络,一个Actor,一个Critic。
- Actor的任务是对外输出动作并且根据Critic的打分来调整自己的参数来获得更好的输出,使得Critic打分更高。
- Critic的任务是对Actor的输出做评估(预测),并且通过reward不断调整自己的预测能可能地接近reward。这也就是一个Q网络。
DDPG借鉴了DQN的技巧,也就是目标网络和经验回放。并且可以输出确定的动作(即动作的幅度),并且是一个单步更新的Policy网络。
这里我们使用强化学习算法框架库:PARL。这里涵盖了很多的经典算法,又能复现一些最新的流行算法。看代码的学习方式,也是最快上手的学习方式。直接扫左上角二维码来学习。其中多智能体是一个热门的研究方向,被认为更接近人类社会的交互形式
前面的是和算法相关的库。另外一类是和环境相关的库。GYM是学术界比较喜欢的环境库。环境分为离散控制场景和连续控制场景,离散控制是输出只有有限个量,例如控制方向时只有向左向右,一般使用atari环境评估。连续控制是输出是一个连续的量,例如机械臂旋转的角度,一般使用mujoco环境来评估。
百度飞桨基于PARL的入门实践教程
基于RL的负载均衡、可靠性问题(副本和故障域)、迁移扩容:基于强化学习的数据分华为QTune:DS-DDPG腾讯CDBTune:DDPG:腾讯云CDB的AI技术实践:CDBTune - 云+社区 - 腾讯云腾讯
声明:
所有文章都为本人的学习笔记,非商用,
目的只求在工作学习过程中通过记录,梳理清楚自己的知识体系。
文章或涉及多方引用,如有纰漏忘记列举,请多指正与包涵。
引用:
- 来源: 微笑紫瞳星 / 文章作者: 微笑紫瞳星 / 文章链接:
- 强化学习之基于gym环境的DQN算法实战(Pytorch)_Ton的博客-程序员宝宝 - 程序员宝宝
- pytorch版代码汇总:
版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。