主要内容

rlDDPGAgent

深度确定性策略梯度(DDPG)强化学习代理

描述

深度确定性策略梯度(DDPG)算法是一种参与者-评论家、无模型、在线、非策略强化学习方法,它计算出最大限度地提高长期奖励的最优策略。动作空间只能是连续的。

有关更多信息,请参见深度确定性策略梯度(DDPG)代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

根据观察和行动规格创建代理

例子

代理= rlDDPGAgent (observationInfoactionInfo使用默认初始化选项,为具有给定观察和操作规范的环境创建深度确定性策略梯度代理。代理中的行动者和评论家使用从观察规范构建的默认深度神经网络observationInfo以及动作规范actionInfo.的ObservationInfo而且ActionInfo的属性代理设置为observationInfo而且actionInfo分别输入参数。

例子

代理= rlDDPGAgent (observationInfoactionInfoinitOpts使用给定的观察和操作规范为环境创建深度确定性策略梯度代理。属性中指定的选项配置的默认网络initOpts对象。有关初始化选项的详细信息,请参见rlAgentInitializationOptions

从演员和评论家创建代理

例子

代理= rlDDPGAgent (演员评论家agentOptions使用默认DDPG代理选项创建具有指定参与者和评论家的DDPG代理。

指定代理选项

代理= rlDDPGAgent (___agentOptions创建DDPG代理并设置AgentOptions属性agentOptions输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

代理初始化选项,指定为rlAgentInitializationOptions对象。

参与者,指定为rlContinuousDeterministicActor.有关创建角色的详细信息,请参见创建策略和值函数

评论家,指定为rlQValueFunction对象。有关创建批评的更多信息,请参见创建策略和值函数

属性

全部展开

观察规范,指定为强化学习规范对象或定义维度、数据类型和观察信号名称等属性的规范对象数组。

如果通过指定演员和评论家来创建代理,则ObservationInfo匹配参与者和评论家对象中指定的值。

你可以提取observationInfo从现有环境或代理中使用getObservationInfo.您还可以使用rlFiniteSetSpecrlNumericSpec

动作规范,作为强化学习规范对象指定,定义诸如维度、数据类型和动作信号的名称等属性。

由于DDPG代理在连续操作空间中操作,因此必须指定actionInfo作为一个rlNumericSpec对象。

如果通过指定演员和评论家来创建代理,则ActionInfo匹配参与者和评论家对象中指定的值。

你可以提取actionInfo从现有环境或代理中使用getActionInfo.您还可以使用rlNumericSpec

代理选项,指定为rlDDPGAgentOptions对象。

如果使用循环神经网络创建具有默认参与者和评论家的DDPG代理,则AgentOptions。年代equenceLength32

经验缓冲区,指定为rlReplayMemory对象。在训练过程中,代理存储它的每个经验(年代一个R年代D)放在缓冲区中。在这里:

  • 年代是当前对环境的观测。

  • 一个是代理所采取的动作。

  • R采取行动的奖励是什么一个

  • 年代是采取行动后的下一次观察吗一个

  • D是否在采取行动后发出“完成”信号一个

选项,在选择操作时使用探索策略,指定为以下逻辑值之一。

  • 真正的—选择动作时,使用基础代理探索策略。

  • —选择动作时使用base agent greedy策略。

试剂的取样时间,指定为正标量或-1.将此参数设置为-1允许基于事件的模拟。的价值SampleTime中指定的值AgentOptions

在Simulink金宝app中®环境中,RL代理块,在其中指定代理执行每个SampleTime秒模拟时间。如果SampleTime-1,块从它的父子系统继承采样时间。

在MATLAB中®环境时,每当环境前进时执行代理。在这种情况下,SampleTime输出经验中连续元素之间的时间间隔是否由返回sim卡火车.如果SampleTime-1,返回的输出体验中连续元素之间的时间间隔反映了触发代理执行的事件的时间。

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练好的强化学习代理
getAction 从给定环境观察的代理、参与者或策略对象获取操作
getActor 从强化学习代理中得到actor
setActor 强化学习代理的集合角色
getCritic 从强化学习代理获得评论家
setCritic 强化学习代理集评论家
generatePolicyFunction 生成计算代理或策略对象的策略的函数

例子

全部折叠

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DDPG Agent控制双积分系统.来自环境的观测是一个包含质量的位置和速度的矢量。作用是一个标量,表示施加在质量上的力,范围从-2到2牛顿。

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);

获得观察和行动规范。

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

代理创建函数随机初始化演员网络和评论家网络。通过固定随机生成器的种子来确保重现性。

rng (0)

根据环境观察和操作规范创建策略梯度代理。

agent = rlDDPGAgent(obsInfo,actInfo)
agent = rlDDPGAgent with properties: ExperienceBuffer: [1x1 rl.replay.]rlReplayMemory] AgentOptions: [1x1 rl.option. option.]rlDDPGAgentOptions] UseExplorationPolicy: 0 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlNumericSpec] SampleTime: 1

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰特(obsInfo (1) .Dimension)})
ans =1x1单元阵列{[0.0182]}

现在可以在环境中测试和训练代理。你也可以使用getActor而且getCritic分别提取演员和评论家,和getModel从行动者或评论家中提取近似器模型(默认为深度神经网络)。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DDPG Agent用图像观察摆动和平衡摆.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。动作是表示扭矩的标量,范围从-2到2nm。

环境= rlPredefinedEnv(“SimplePendulumWithImage-Continuous”);

获得观察和行动规范

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个代理初始化选项对象,指定网络中每个隐藏的全连接层必须具有128神经元(不是默认数量,256).

initOpts = rlAgentInitializationOptions“NumHiddenUnit”, 128);

代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。

rng (0)

根据环境观察和操作规范创建DDPG代理。

agent = rlDDPGAgent(obsInfo,actInfo,initOpts);

从行动者和评论家中提取深度神经网络。

actorNet = getModel(代理);criticNet = getModel(get批评家(代理));

显示批评网络的层,并验证每个隐藏的全连接层有128个神经元

criticNet。层
ans = 13x1带有图层的图层数组:1的concat串联连接3输入沿着维度1 2的relu_body ReLU ReLU 3“fc_body”完全连接128完全连接层4的body_output ReLU ReLU 5 input_1的图像输入50 x50x1图片6 conv_1二维卷积64 3 x3x1旋转步[1]和填充[0 0 0 0]7‘relu_input_1 ReLU ReLU 8“fc_1”完全连接128完全连接层9“input_2”功能输入1功能10“fc_2”完全连接128完全连接层11“input_3”功能输入1功能12 'fc_3'全连接128全连接层13 '输出'全连接1全连接层

情节演员和评论家网络

情节(layerGraph (actorNet))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

情节(layerGraph (criticNet))

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

要检查代理,请使用getAction从随机观察中返回动作。

getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
ans =1x1单元阵列{[-0.0364]}

现在可以在环境中测试和训练代理。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DDPG Agent控制双积分系统.来自环境的观测是一个包含质量的位置和速度的矢量。作用力是一个表示力的标量,范围从-2到2牛顿。

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);

获取环境观察和操作规范对象。

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

演员网络和评论家网络是随机初始化的。通过固定随机生成器的种子来确保重现性。

rng (0)

对于DDPG代理,评论家估计一个q值函数,因此它必须将观察信号和动作信号都作为输入,并返回一个标量值。

为了在评论家中近似q值函数,使用深度神经网络。将每个网络路径定义为一个层对象数组。从环境规范对象中获取观察和操作空间的维度,并为输入层指定一个名称,以便稍后显式地将它们与适当的环境通道关联起来。

定义观察和行动路径obsPath = featureInputLayer(prod(obsInfo.Dimension),Name=“netOin”);actPath = featureInputLayer(prod(actInfo.Dimension),Name=“netAin”);定义公共路径:沿着第一维连接commonPath = [concatenationLayer(1,2,Name= .“concat”) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(1)];为layerGraph网络添加路径cNet = layerGraph(obsPath);cNet = addLayers(cNet, actPath);cNet = addLayers(cNet, commonPath);%连接路径cNet = connectLayers(cNet,“netOin”“concat /三机一体”);cNet = connectLayers(cNet,“netAin”“concat / in2”);绘制网络情节(cNet)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

%转换为dlnetwork对象cNet = dlnetwork(cNet);显示权重数总结(cNet)
Initialized: true可学习数量:251 input: 1 'netOin' 2 features 2 'netAin' 1 features

使用cNet,以及输入层的名称。DDPG代理使用rlQValueFunction对象来实现批评家。

rlQValueFunction(cNet,obsInfo,actInfo,...ObservationInputNames =“netOin”...ActionInputNames =“netAin”);

用随机的观察和行动输入检查批评家。

getValue(评论家,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.4260

要在参与者中近似策略,请使用神经网络。对于DDPG代理,参与者执行一个确定性策略,该策略由一个连续确定性参与者实现。在这种情况下,网络必须将观察信号作为输入并返回操作。因此,输出层必须拥有与可能的操作数量一样多的元素。

%创建一个网络,用作底层actor逼近器aNet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(nummel (actInfo))];%转换为dlnetwork对象aNet = dlnetwork(aNet);显示权重数总结(aNet)
初始化:true可学习的数量:201输入:1 '输入' 2个特征

使用以下命令创建参与者actorNetwork.DDPG代理使用rlContinuousDeterministicActor对象来实现参与者。

actor = rlContinuousDeterministicActor(aNet,obsInfo,actInfo);

使用随机观察输入检查actor。

getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-0.2327]}

使用参与者和评论家创建DDPG代理。

agent = rlDDPGAgent(演员,评论家);

指定代理选项,包括演员和评论家的培训选项。

agent.AgentOptions.SampleTime = env.Ts;agent.AgentOptions.TargetSmoothFactor = 1 e - 3;agent.AgentOptions.ExperienceBufferLength = 1 e6;agent.AgentOptions.DiscountFactor = 0.99;agent.AgentOptions.MiniBatchSize = 32;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 5 e - 3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1的军医;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;

用随机观测输入检查代理。

getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-0.1666]}

您现在可以在环境中训练代理。

对于本例,加载示例中使用的环境训练DDPG Agent控制双积分系统.来自环境的观测是一个包含质量的位置和速度的矢量。作用力是一个表示力的标量,范围从-2到2牛顿。

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);

获取观察和操作规范对象。

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

对于DDPG代理,评论家估计一个q值函数,因此它必须将观察信号和动作信号都作为输入,并返回一个标量值。

为了在评论家内近似q值函数,使用循环神经网络。将每个网络路径定义为一个层对象数组。从环境规范对象获取观察空间的尺寸,并为输入层指定一个名称,以便稍后可以显式地将它们与正确的环境通道关联起来。要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

定义观察和行动路径obsPath = sequenceInputLayer(prod(obsInfo.Dimension),Name=“netOin”);actPath = sequenceInputLayer(prod(actInfo.Dimension),Name=“netAin”);定义公共路径:沿着第一维连接commonPath = [concatenationLayer(1,2,Name= .“猫”) lstmLayer(50) reluLayer fullyConnectedLayer(1)];为layerGraph网络添加路径cNet = layerGraph(obsPath);cNet = addLayers(cNet, actPath);cNet = addLayers(cNet, commonPath);%连接路径cNet = connectLayers(cNet,“netOin”“猫/三机一体”);cNet = connectLayers(cNet,“netAin”“猫/ in2”);绘制网络情节(cNet)

图中包含一个轴对象。axis对象包含一个graphplot类型的对象。

%转换为dlnetwork对象cNet = dlnetwork(cNet);显示权重数总结(cNet)
初始化:true可学习数量:10.8k输入:1 'netOin' 2维序列输入2 'netAin' 1维序列输入

使用cNet,指定输入层的名称。DDPG代理使用rlQValueFunction对象来实现批评家。

rlQValueFunction(cNet,obsInfo,actInfo,...ObservationInputNames =“netOin”ActionInputNames =“netAin”);

用随机的观察和行动输入检查批评家。

getValue(评论家,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.0074

既然评论家有一个循环网络,那么演员也一定有一个循环网络。对于DDPG代理,参与者执行一个确定性策略,该策略由一个连续确定性参与者实现。在这种情况下,网络必须将观察信号作为输入并返回操作。因此,输出层必须拥有与可能的操作数量一样多的元素。

将网络定义为层对象的数组,并从环境规范对象中获得观察和操作空间的维度。

aNet = [sequenceInputLayer(prod(obsInfo.Dimension)) lstmLayer(10) reluLayer fullyConnectedLayer(prod(actInfo.Dimension))];

转换为dlnetwork并显示权重的数量。

aNet = dlnetwork(aNet);总结(aNet)
初始化:true可学习数量:531 input: 1 'sequenceinput' 2维序列输入

使用以下命令创建参与者aNet.DDPG代理使用rlContinuousDeterministicActor对象来实现参与者。

actor = rlContinuousDeterministicActor(aNet,obsInfo,actInfo);

用随机观测输入检查actor。

getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[0.0246]}

为评论家指定一些培训方案。

criticOpts = rlOptimizerOptions(...“LearnRate”, 5 e - 3,“GradientThreshold”1);

为演员指定一些训练选项。

actorOpts = rlOptimizerOptions(...“LearnRate”1的军医,“GradientThreshold”1);

指定代理选项。要使用带有循环神经网络的DDPG代理,必须指定一个SequenceLength大于1。

agentOpts = rlDDPGAgentOptions(...“SampleTime”env。Ts,...“TargetSmoothFactor”1 e - 3,...“ExperienceBufferLength”1 e6,...“DiscountFactor”, 0.99,...“SequenceLength”, 20岁,...“MiniBatchSize”32岁的...“CriticOptimizerOptions”criticOpts,...“ActorOptimizerOptions”, actorOpts);

使用参与者和评论家创建DDPG代理。

agent = rlDDPGAgent(actor,批评家,agentOpts);

检查你的代理从随机观察中返回的动作。

getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[0.0158]}

现在可以在环境中测试和训练代理。

版本历史

在R2019a中引入