rlACAgent
行动者-批评家强化学习代理
描述
actor-批评家(AC)代理实现actor-批评家算法,如A2C和A3C,这是无模型的、在线的、策略上的强化学习方法。行动者-批评家代理直接优化政策(行动者),并使用批评家来估计回报或未来的回报。动作空间可以是离散的,也可以是连续的。
有关更多信息,请参见Actor-Critic代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理.
创建
语法
描述
根据观察和操作规格创建代理
使用默认初始化选项,为具有给定观察和操作规范的环境创建参与者-批评者代理。代理中的参与者和批评者使用默认的深度神经网络,该网络是根据观察规范构建的代理
= rlACAgent (observationInfo
,actionInfo
)observationInfo
和行动规范actionInfo
.的ObservationInfo
而且ActionInfo
的属性代理
设置为observationInfo
而且actionInfo
分别输入参数。
为具有给定的观察和操作规范的环境创建参与者-批评家代理。代理使用默认网络,其中每个隐藏的全连接层具有在代理
= rlACAgent (observationInfo
,actionInfo
,initOpts
)initOpts
对象。行动者-批评家代理不支持循环神经网络。有关初始化选项的更多信息,请参见rlAgentInitializationOptions
.
指定代理选项
创建参与者-批评家代理并设置AgentOptions财产代理
= rlACAgent (___,agentOptions
)agentOptions
输入参数。在前面语法中的任何输入参数之后使用此语法。
输入参数
initOpts
- - - - - -代理初始化选项
rlAgentInitializationOptions
对象
代理初始化选项,指定为rlAgentInitializationOptions
对象。行动者-批评家代理不支持循环神经网络。
演员
- - - - - -演员
rlDiscreteCategoricalActor
对象|rlContinuousGaussianActor
对象
实现策略的参与者,指定为rlDiscreteCategoricalActor
或rlContinuousGaussianActor
函数近似者对象。有关创建角色逼近器的更多信息,请参见创建政策和价值功能.
评论家
- - - - - -评论家
rlValueFunction
对象
评估贴现长期奖励的批评家,指定为rlValueFunction
对象。有关创建临界逼近器的更多信息,请参见创建政策和价值功能.
属性
ObservationInfo
- - - - - -观测规范
规范对象|规范对象数组
观测规范,指定为强化学习规范对象或定义属性(如尺寸、数据类型和观测信号名称)的规范对象数组。
如果通过指定参与者和评论家来创建代理,则ObservationInfo
匹配在参与者和批评家对象中指定的值。
您可以提取observationInfo
从现有环境或代理使用getObservationInfo
.还可以使用手动构造规范rlFiniteSetSpec
或rlNumericSpec
.
ActionInfo
- - - - - -操作规范
规范对象
动作规范,指定为强化学习规范对象,定义诸如尺寸、数据类型和动作信号的名称等属性。
对于离散的动作空间,必须指定actionInfo
作为一个rlFiniteSetSpec
对象。
对于连续的动作空间,必须指定actionInfo
作为一个rlNumericSpec
对象。
如果通过指定参与者和评论家来创建代理,则ActionInfo
匹配在参与者和批评家对象中指定的值。
您可以提取actionInfo
从现有环境或代理使用getActionInfo
.您还可以使用手动构造规范rlFiniteSetSpec
或rlNumericSpec
.
AgentOptions
- - - - - -剂的选择
rlACAgentOptions
对象
代理选项,指定为rlACAgentOptions
对象。
UseExplorationPolicy
- - - - - -选项使用探索策略
真正的
(默认)|假
选项,在选择操作时使用探索策略,指定为以下逻辑值之一。
真正的
—在选择动作时使用基本代理探索策略sim卡
而且generatePolicyFunction
.在这种情况下,代理通过抽样其概率分布来选择其行为,因此策略是随机的,代理探索其观察空间。假
-在选择动作时使用基本代理贪婪策略(可能性最大的动作)sim卡
而且generatePolicyFunction
.在这种情况下,模拟的代理和生成的策略行为是确定的。
请注意
此选项仅影响模拟和部署;这并不影响训练。
SampleTime
- - - - - -代理取样时间
积极的标量|-1
对象的功能
例子
根据观察和动作规格创建离散actor -批评家代理
创建一个具有离散行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理和使用图像观察训练.这个环境有两个观察结果:一个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
从行动者或批评家中提取近似器模型(默认为深度神经网络)。
使用初始化选项创建连续actor -批评家代理
创造一个具有连续动作空间的环境,并获得其观察和动作规格。对于本例,加载示例中使用的环境利用图像观察训练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))
情节(layerGraph (criticNet))
要检查代理,请使用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)
将网络转换为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]}
现在可以在环境中测试和培训代理。
用循环神经网络创建一个离散的actor -批评家代理
方法所使用的预定义环境训练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]}
现在可以在环境中测试和培训代理。
配置A3C培训选项
要使用异步优势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
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。