淘优惠

淘优惠

【学习】OpenAI 深度强化学习教程

热门文章 0

展开全文
摘要
Not_GOD
强化学习研究决策制定和控制,以及一个进行决策的 agent 如何学会在一个未知环境中采取最优行动。深度强化学习研究如何在强化学习算法中使用神经网络,使得无需进行人工特征工程直接学习从原始感知数据到原始行动输出的映射变得可能。本文讲解深度强化学习技术。受众是那些已经有了一定的机器学习基础,如监督学习、神经网络和强化学习基础的读者。中文版链接:/2016/05/03/deep-reinforcement-learning-from-openai/英文版链接:/docs/rl原文链接:http://weibo.com/1974561680/Du60ikB8z?type=comment#_rnd1462446645125


【强化学习 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 版的统一,降低了学习成本。

图1. agent.py 中的 Agent 使用 net.py 中的网络,run.py 中通过与 env.py 中的环境互动来进行训练。

如图所示:

  • 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):

将神经网络单独存放到一个文件,能为使用者微调算法提供便利。这种模式把深度学习的网络与强化学习隔开,提高了代码的可读性。我们提供两个实用的例子:

  1. 把图片作为state输入神经网络时,只需要在 net.py 将全连接层修改为卷积层即可,我们提供了这个例子,当网络检测到输入的张量是图片时,会自动启用卷积网络。
  2. 对于高维度状态空间的任务(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. DQN系列的继承层级关系

如图 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. DDPG系列的继承层级关系

如图 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):优化的是实际执行的策略,因此只存在一种策略。

    SARSA

    Off-policy的算法,探索环境使用的策略和要更新的策略不是同一个策略(如Q-learning):一种是Target policy,使我们想要的最佳的目标策略。另一个是Behavior policy,是探索环境的策略,需要大胆探索所有可能的环境,然后交给目标策略去学习。而且交给目标策略的数据不需要 +1

    Q-Learning

    也就是说,探索的策略没变,都是往高价值的格子方向探索并带有10%的探索几率。但是更新格子价值的时候,我们并不是根据探索的下一步来调整格子的价值,而是挑选周围全部可以达到的格子价值的最大值。因此,在Q-learning中,价值低的格子并不能影响周围格子的价值,只有价值高的格子才能影响周围格子的价值。

    这和Sarsa不同,Sarsa下一步格子的价值都会影响到上一步格子,因此在reward为负数的格子周围那些格子的价值也为负数,因此agent会绕的远远地。而Q-learning,没有这个顾虑,因此agent直接就是最短路径拿到reward,因此total-reward会比Sarsa高。

    当我们的强化学习(RL)碰到了深度学习(DL),我们就来到了深度强化学习(DRL)的领域。

    表格法有很大的缺陷:

    1. 表格占用的内存空间巨大。
    2. 当表格极大时,查表效率低下。
    3. 只能表示有限个离散状态和动作。

    现在我们需要更换工具了,我们可以用神经网络来代替表格法,我们可以用S和A作为神经网络的输入,由此输出价值Q。也可以输入S并输出多个Q,每个Q对应一个A。神经网络只需要储存有限的网络参数,我们的任务就是不断调整这些参数,使得输入输出符合我们的预期,而且状态可以泛化,相似的状态输出也差不多,不用像表格法一样需要重新训练。

    其中利用神经网络求解RL的经典算法是DQN。这是2015年发表在Nature上的论文。神经网络的输入是像素级别的图像,使用神经网络近似代替Q表格,49个游戏中有30个超越人类水平。

    DQN

    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的影响,各个状态的价值随着更新都会逐渐区分开来。

    这也是PARL这个框架的特点,它把算法框架拆分为model,algorithm,agent三个部分
    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 - 云+社区 - 腾讯云腾讯

    声明:

    所有文章都为本人的学习笔记,非商用,

    目的只求在工作学习过程中通过记录,梳理清楚自己的知识体系。

    文章或涉及多方引用,如有纰漏忘记列举,请多指正与包涵。

    引用:

    1. 来源: 微笑紫瞳星 / 文章作者: 微笑紫瞳星 / 文章链接:
    2. 强化学习之基于gym环境的DQN算法实战(Pytorch)_Ton的博客-程序员宝宝 - 程序员宝宝
    3. pytorch版代码汇总: