主要内容

rlACAgent

行动者-批评家强化学习代理

描述

actor-批评家(AC)代理实现actor-批评家算法,如A2C和A3C,这是无模型的、在线的、策略上的强化学习方法。行动者-批评家代理直接优化政策(行动者),并使用批评家来估计回报或未来的回报。动作空间可以是离散的,也可以是连续的。

有关更多信息,请参见Actor-Critic代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

根据观察和操作规格创建代理

例子

代理= rlACAgent (observationInfoactionInfo使用默认初始化选项,为具有给定观察和操作规范的环境创建参与者-批评者代理。代理中的参与者和批评者使用默认的深度神经网络,该网络是根据观察规范构建的observationInfo和行动规范actionInfo.的ObservationInfo而且ActionInfo的属性代理设置为observationInfo而且actionInfo分别输入参数。

例子

代理= rlACAgent (observationInfoactionInfoinitOpts为具有给定的观察和操作规范的环境创建参与者-批评家代理。代理使用默认网络,其中每个隐藏的全连接层具有在initOpts对象。行动者-批评家代理不支持循环神经网络。有关初始化选项的更多信息,请参见rlAgentInitializationOptions

从演员和评论家创建代理

例子

代理= rlACAgent (演员评论家使用代理的默认选项,创建具有指定的参与者和批评者的参与者-批评者代理。

指定代理选项

例子

代理= rlACAgent (___agentOptions创建参与者-批评家代理并设置AgentOptions财产agentOptions输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

代理初始化选项,指定为rlAgentInitializationOptions对象。行动者-批评家代理不支持循环神经网络。

实现策略的参与者,指定为rlDiscreteCategoricalActorrlContinuousGaussianActor函数近似者对象。有关创建角色逼近器的更多信息,请参见创建政策和价值功能

评估贴现长期奖励的批评家,指定为rlValueFunction对象。有关创建临界逼近器的更多信息,请参见创建政策和价值功能

属性

全部展开

观测规范,指定为强化学习规范对象或定义属性(如尺寸、数据类型和观测信号名称)的规范对象数组。

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

您可以提取observationInfo从现有环境或代理使用getObservationInfo.还可以使用手动构造规范rlFiniteSetSpecrlNumericSpec

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

对于离散的动作空间,必须指定actionInfo作为一个rlFiniteSetSpec对象。

对于连续的动作空间,必须指定actionInfo作为一个rlNumericSpec对象。

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

您可以提取actionInfo从现有环境或代理使用getActionInfo.您还可以使用手动构造规范rlFiniteSetSpecrlNumericSpec

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

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

  • 真正的—在选择动作时使用基本代理探索策略sim卡而且generatePolicyFunction.在这种情况下,代理通过抽样其概率分布来选择其行为,因此策略是随机的,代理探索其观察空间。

  • -在选择动作时使用基本代理贪婪策略(可能性最大的动作)sim卡而且generatePolicyFunction.在这种情况下,模拟的代理和生成的策略行为是确定的。

请注意

此选项仅影响模拟和部署;这并不影响训练。

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

在一个模型®环境中,RL代理块,指定代理在其中执行SampleTime秒模拟时间。如果SampleTime-1,该块从其父子系统继承采样时间。

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

对象的功能

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

例子

全部折叠

创建一个具有离散行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理和使用图像观察训练.这个环境有两个观察结果:一个50乘50的灰度图像和一个标量(钟摆的角速度)。动作是一个包含五个可能元素的标量(施加在摆动杆上的扭矩为-2、-1、0、1或2nm)。

env = rlPredefinedEnv (“SimplePendulumWithImage-Discrete”);

获取观察和行动规范

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

代理创建函数随机初始化actor和批评家网络。通过固定随机发生器的种子来确保再现性。

rng (0)

根据环境观察和操作规范创建一个actor-批评家代理。

代理= rlACAgent (obsInfo actInfo);

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

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

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

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

%负载预定义环境env = rlPredefinedEnv (“SimplePendulumWithImage-Continuous”);获得观察和行动规范obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

创建一个代理初始化选项对象,指定网络中每个隐藏的完全连接层必须具有128神经元(不是默认数量,256).actor -批评家代理不支持循环网络,因此设置UseRNN选项真正的在创建代理时生成错误。

initOpts = rlAgentInitializationOptions (NumHiddenUnit = 128);

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

rng (0)

根据环境观察和操作规范创建一个actor-批评家代理。

代理= rlACAgent (obsInfo actInfo initOpts);

从主体、行动者和批评家中提取深度神经网络。

actorNet = getModel (getActor(代理));criticNet = getModel (getCritic(代理));

显示临界网络的层数,验证每个隐藏的全连接层有128个神经元

criticNet。层
ans = 11x1带有图层的图层数组:1的concat串联连接2输入沿着维度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“输出”完全连接1完全连接层

剧情演员和评论家网络

情节(layerGraph (actorNet))

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

情节(layerGraph (criticNet))

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

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

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

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

创建一个具有离散动作空间的环境,并获得其观察和动作规格。对于本例,加载示例中使用的环境训练DQN代理平衡车杆系统.这个环境有一个四维的观察向量(马车的位置和速度、极点角和极点角的导数)和一个包含两个可能元素的标量作用(施加在马车上的力是-10或+10牛)。

env = rlPredefinedEnv (“CartPole-Discrete”);

获取观察和行动规范。

obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec属性:LowerLimit: -Inf UpperLimit: Inf名称:"CartPole States"描述:"x, dx, theta, dtheta"尺寸:[4 1]数据类型:"double"
actInfo = getActionInfo (env)
元素:[-10 10]名称:"CartPole Action"描述:[0x0 string]尺寸:[1 1]数据类型:"double"

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

rng (0)

对于actor-批评家代理,批评家估计一个值函数,因此它必须以观测信号为输入,并返回一个标量值。

为了近似评价内的值函数,使用深度神经网络。将网络定义为层对象的数组。从环境规范对象中获取观察空间的尺寸。

cnet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(1)];

将网络转换为adlnetwork对象,并显示权重的数量。

cnet = dlnetwork (cnet);总结(cnet)
可学习的数量:301输入:1 '输入' 4个特性

创建一个评论家。actor -批评家代理使用rlValueFunction对象来实现批评家。

评论家= rlValueFunction (cnet, obsInfo);

用随机的观察输入检查你的评论。

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

创建一个深度神经网络,用作演员内部的近似模型。对于actor-批评家代理,actor执行随机策略,而对于离散动作空间则由一个离散类别actor实现。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须具有与可能操作数量相同的元素。

anet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(numel(actInfo.Dimension))];

将网络转换为adlnetwork对象,并显示权重的数量。

anet = dlnetwork (anet);总结(anet)
可学习的数量:352 input: 1 'input' 4个特性

创建一个演员。actor -批评家代理使用rlDiscreteCategoricalActor对象来实现离散操作空间的参与者。

演员= rlDiscreteCategoricalActor (anet obsInfo actInfo);

用随机的观察输入检查您的actor。

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

使用演员和评论家创建AC代理。

代理= rlACAgent(演员,评论家)
AgentOptions: [1x1 rl.option. properties]rlACAgentOptions] UseExplorationPolicy: 1 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlFiniteSetSpec] SampleTime: 1

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

agent.AgentOptions.NumStepsToLookAhead = 32;agent.AgentOptions.DiscountFactor = 0.99;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 8 e - 3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 8 e - 3;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;

随机观察你的代理人。

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

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

创造一个具有连续动作空间的环境,并获得其观察和动作规格。对于本例,加载本例中使用的双积分器连续动作空间环境训练DDPG代理控制双积分器系统

env = rlPredefinedEnv (“DoubleIntegrator-Continuous”);

获取观察和行动规范。

obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [2 1] DataType: "double"
actInfo = getActionInfo (env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"

在这个例子中,动作是一个表示力范围从-2到2牛顿的标量值。为了确保来自代理的输出在这个范围内,您可以执行适当的伸缩操作。将这些限制存储起来,以便以后可以方便地访问它们。

确保行动空间的上限和下限是有限的actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;

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

rng (0)

对于actor-批评家代理,批评家估计一个值函数,因此它必须以观测信号为输入,并返回一个标量值。为了近似评价内的值函数,使用深度神经网络。

将网络定义为层对象的数组,并从环境规范对象中获取观测空间的尺寸。

cNet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(1)];

将网络转换为adlnetwork对象,并显示权重的数量。

cNet = dlnetwork (cNet);总结(cNet)
可学习数量:201输入:1 '输入' 2个特性

使用以下命令创建批评家cNet.actor -批评家代理使用rlValueFunction对象来实现批评家。

评论家= rlValueFunction (cNet, obsInfo);

用随机输入观察检查你的评论。

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

为了在参与者内部近似策略,可以使用深度神经网络。对于行动者-批评家代理,行动者执行随机策略,而对于连续动作空间,则由连续高斯行动者实现。在这种情况下,网络必须将观测信号作为输入,并为每个动作返回平均值和标准差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。

注意,标准差必须是非负的,平均值必须在动作范围内。因此,返回标准差的输出层必须是一个softplus或ReLU层,以强制非负性,而返回平均值的输出层必须是一个缩放层,以将平均值缩放到输出范围。

将每个网络路径定义为层对象的数组。从环境规范对象中获取观察和操作空间的维度,并为输入和输出层指定一个名称,以便稍后显式地将它们与适当的通道关联起来。

%的输入路径inPath = [featureInputLayer(prod(obsInfo.Dimension)),Name= [featureInputLayer]“netObsIn”) fullyConnectedLayer (prod (actInfo.Dimension),名称=“infc”));%平均值路径meanPath = [tanhLayer(Name= .)“tanhMean”);fullyConnectedLayer (50) reluLayer fullyConnectedLayer(刺激(actInfo.Dimension));scalingLayer (...Name =“netMout”...规模= actInfo.UpperLimit)%比例范围];%标准差路径sdevPath = [tanhLayer(Name= .)“tanhStdv”);fullyConnectedLayer (50) reluLayer fullyConnectedLayer(刺激(actInfo.Dimension));softplusLayer (Name =“netSDout”%非负];为网络对象添加图层aNet = layerGraph;aNet = addLayers (aNet inPath);aNet = addLayers (aNet meanPath);aNet = addLayers (aNet sdevPath);%连接层aNet = connectLayers (aNet,“infc”“tanhMean /”);aNet = connectLayers (aNet,“infc”“tanhStdv /”);%的阴谋网络情节(aNet)

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

将网络转换为adlnetwork对象,并显示可学习参数(权重)的数量。

aNet = dlnetwork (aNet);总结(aNet)
初始化:true可学习数量:305输入:1 'netObsIn' 2个特性

创建一个演员。actor -批评家代理使用rlContinuousGaussianActor对象来实现用于连续操作空间的参与者。

actor = rlContinuousGaussianActor(aNet, obsInfo, actInfo,...ActionMeanOutputNames =“netMout”...ActionStandardDeviationOutputNames =“netSDout”...ObservationInputNames =“netObsIn”);

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

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

使用演员和评论家创建AC代理。

代理= rlACAgent(演员、批评);

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

agent.AgentOptions.NumStepsToLookAhead = 32;agent.AgentOptions.DiscountFactor = 0.99;agent.AgentOptions.CriticOptimizerOptions.LearnRate = 8 e - 3;agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;agent.AgentOptions.ActorOptimizerOptions.LearnRate = 8 e - 3;agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;

使用随机输入观察检查您的代理。

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

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

方法所使用的预定义环境训练DQN代理平衡车杆系统的例子。这个环境有一个四维的观察向量(马车的位置和速度、极点角和极点角的导数)和一个包含两个可能元素的标量作用(施加在马车上的力是-10或+10牛)。

env = rlPredefinedEnv (“CartPole-Discrete”);

获取观察和行动信息。

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

代理创建函数随机初始化actor和批评家网络。通过固定随机发生器的种子来确保再现性。

rng (0)

对于actor-批评家代理,批评家估计一个值函数,因此它必须以观测信号为输入,并返回一个标量值。

为了逼近临界内的值函数,使用循环深度神经网络。将网络定义为层对象的数组,并从环境规范对象中获取观测空间的尺寸。要创建循环网络,请使用sequenceInputLayer作为输入层,并包含一个lstmLayer作为其他网络层之一。

cNet = [sequenceInputLayer(prod(obsInfo.Dimension)) lstmLayer(10) reluLayer fullyConnectedLayer(1)];

将网络转换为adlnetwork对象,并显示可学习参数(权重)的数量。

cNet = dlnetwork (cNet);总结(cNet)
可学习的数量:611输入:1 'sequenceinput' 4维序列输入

使用以下命令创建批评家cNet.actor -批评家代理使用rlValueFunction对象来实现批评家。

评论家= rlValueFunction (cNet, obsInfo);

用随机输入的观察结果检查批评家。

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

因为评论家有一个循环的网络,演员也必须使用循环的网络。对于actor-批评家代理,actor执行随机策略,而对于离散动作空间则由一个离散类别actor实现。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须具有与可能操作数量相同的元素。

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

将网络转换为adlnetwork对象,并显示权重的数量。

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

使用以下命令创建actoraNet.actor -批评家代理使用rlDiscreteCategoricalActor对象来实现离散操作空间的参与者。

演员= rlDiscreteCategoricalActor (aNet obsInfo actInfo);

用随机输入观察检查行动者。

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

为评论家设置一些训练选项。

criticOpts = rlOptimizerOptions (...LearnRate = 8 e - 3, GradientThreshold = 1);

为演员设置一些训练选项。

actorOpts = rlOptimizerOptions (...LearnRate = 8 e - 3, GradientThreshold = 1);

指定代理选项,并使用参与者、批评家和代理选项对象创建AC代理。由于代理使用循环神经网络,NumStepsToLookAhead作为训练轨迹长度。

agentOpts = rlACAgentOptions (...NumStepsToLookAhead = 32,...DiscountFactor = 0.99,...CriticOptimizerOptions = criticOpts,...ActorOptimizerOptions = actorOpts);代理= rlACAgent(演员、评论家、agentOpts);

要检查代理,返回随机观察的动作。

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

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

要使用异步优势actor- critical (A3C)方法训练代理,必须适当地设置代理和并行训练选项。

创建AC代理时,需要设置NumStepsToLookAhead值大于1.共同的价值观是64而且128

agentOpts = rlACAgentOptions (NumStepsToLookAhead = 64);

使用agentOpts在创建代理时。或者,先创建代理,然后修改它的选项,包括使用点符号的参与者和评论家选项。

配置训练算法使用异步并行训练。

trainOpts = rlTrainingOptions (UseParallel = true);trainOpts.ParallelizationOptions.Mode =“异步”

配置worker将梯度数据返回给主机。另外,在工人将数据发送回主机之前,要设置步数,以匹配需要提前查看的步数。

trainOpts.ParallelizationOptions.DataToSendFromWorkers =...“梯度”;trainOpts.ParallelizationOptions.StepsUntilDataIsSent =...agentOpts.NumStepsToLookAhead;

使用trainOpts在训练你的特工时。

有关异步优势参与者-批评者代理训练的示例,请参见用并行计算训练交流代理平衡车-杆系统

提示

  • 对于连续的动作空间,rlACAgent对象不会强制操作规范设置的约束,因此必须在环境中强制操作空间约束。

版本历史

介绍了R2019a

Baidu
map