rlACAgent
演员-评论家强化学习代理
描述
Actor-critic (AC)代理实现了诸如A2C和A3C这样的Actor-critic算法,这是一种无模型的、在线的、基于策略的强化学习方法。参与者-评论家代理直接优化策略(参与者),并使用评论家来估计回报或未来的奖励。动作空间可以是离散的,也可以是连续的。
有关更多信息,请参见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
对象的功能
例子
根据观察和行动规范创建离散的行动者-评论家代理
创造一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理,并使用图像观察进行训练.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。该动作是一个有五个可能元素的标量(施加在摆动杆上的扭矩为- 2,1,0,1或2nm)。
环境= rlPredefinedEnv(“SimplePendulumWithImage-Discrete”);
获得观察和行动规范
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
代理创建函数随机初始化演员网络和评论家网络。通过固定随机生成器的种子来确保重现性。
rng (0)
根据环境观察和操作规范创建参与者-评论家代理。
agent = rlACAgent(obsInfo,actInfo);
要检查代理,请使用getAction
从随机观测中返回运动。
getAction(代理,{兰特(obsInfo (1) .Dimension),兰德(obsInfo (2) .Dimension)})
ans =1x1单元阵列{[2]}
现在可以在环境中测试和训练代理。你也可以使用getActor
而且getCritic
分别提取演员和评论家,和getModel
从行动者或评论家中提取近似器模型(默认为深度神经网络)。
使用初始化选项创建连续的actor -批评家代理
创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DDPG Agent用图像观察摆动和平衡摆.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。动作是表示扭矩的标量,范围从-2到2nm。
负载百分比预定义环境环境= rlPredefinedEnv(“SimplePendulumWithImage-Continuous”);获得观察和行动规范obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
创建一个代理初始化选项对象,指定网络中每个隐藏的全连接层必须具有128
神经元(不是默认数量,256
).行动者-评论家代理不支持循环网络,因此设置UseRNN
选项真正的
在创建代理时生成错误。
initOpts = rlAgentInitializationOptions(NumHiddenUnit=128);
代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。
rng (0)
根据环境观察和操作规范创建参与者-评论家代理。
agent = rlACAgent(obsInfo,actInfo,initOpts);
从行动者和评论家中提取深度神经网络。
actorNet = getModel(代理);criticNet = getModel(get批评家(代理));
显示批评网络的层,并验证每个隐藏的全连接层有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 =1x1单元阵列{[0.9228]}
现在可以在环境中测试和训练代理。
从参与者和评论家创建离散的参与者-评论家代理
创建一个具有离散动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练DQN人员平衡车杆系统.这个环境有一个四维观测向量(车的位置和速度、极角和极角导数),以及一个包含两个可能元素的标量动作(施加在车上的-10或+10 N的力)。
环境= rlPredefinedEnv(“CartPole-Discrete”);
获得观察和行动规范。
obsInfo = getObservationInfo(env)
obsInfo = rlNumericSpec与属性:LowerLimit: -Inf UpperLimit: Inf名称:"CartPole States"描述:"x, dx, theta, dtheta"维度:[4 1]数据类型:"double"
getActionInfo(env)
actInfo = rlFiniteSetSpec与属性:元素:[-10 10]名称:"CartPole Action"描述:[0x0 string]尺寸:[1 1]数据类型:"double"
代理创建函数随机初始化演员网络和评论家网络。你可以通过固定随机生成器的种子来确保重现性。
rng (0)
对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。
为了接近批评家的价值函数,使用深度神经网络。将网络定义为层对象的数组。从环境规范对象中获取观察空间的尺寸。
cnet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(1)];
将网络转换为adlnetwork
对象,并显示权重的数量。
Cnet = dlnetwork(Cnet);总结(cnet)
初始化:true可学习的数量:301输入:1 '输入' 4个特征
创造批评家。演员评论家代理使用rlValueFunction
对象来实现批评家。
rlValueFunction(cnet,obsInfo);
用随机的观察输入检查你的评论。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =单-0.1411
创建一个深度神经网络,用作actor内的近似模型。对于行为批评代理,行为者执行随机策略,对于离散行为空间,由离散类别行为者执行随机策略。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须拥有与可能的操作数量一样多的元素。
anet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(nummel (actInfo.Dimension))];
将网络转换为adlnetwork
对象,并显示权重的数量。
Anet = dlnetwork(Anet);总结(anet)
初始化:true可学习数量:352输入:1 '输入' 4个特征
创建参与者。演员评论家代理使用rlDiscreteCategoricalActor
对象来实现离散操作空间的参与者。
actor = rlDiscreteCategoricalActor(anet,obsInfo,actInfo);
用随机观察输入检查你的actor。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-10]}
使用演员和评论家创建AC代理。
演员,影评人
agent = rlACAgent with properties: AgentOptions: [1x1 rl.option.]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 =1x1单元阵列{[-10]}
现在可以在环境中测试和训练代理。
从演员和评论家创建连续的演员-评论家代理
创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载双积分器连续动作空间环境所使用的实例训练DDPG Agent控制双积分系统.
环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);
获得观察和行动规范。
obsInfo = getObservationInfo(env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"states"描述:"x, dx"维度:[2 1]数据类型:"double"
getActionInfo(env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"force"描述:[0x0 string]维度:[1 1]数据类型:"double"
在这个例子中,动作是一个标量值,表示从-2到2牛顿的力。为了确保代理的输出在这个范围内,您可以执行适当的缩放操作。存储这些限制,以便您以后可以轻松地访问它们。
确保动作空间上限和下限是有限的actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;
演员网络和评论家网络是随机初始化的。你可以通过固定随机生成器的种子来确保重现性。
rng (0)
对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。为了接近批评家的价值函数,使用深度神经网络。
将网络定义为一组层对象,并从环境规范对象中获取观察空间的维度。
cNet = [featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(50) reluLayer fullyConnectedLayer(1)];
将网络转换为adlnetwork
对象并显示权重的数量。
cNet = dlnetwork(cNet);总结(cNet)
初始化:true可学习的数量:201输入:1 '输入' 2个特征
使用cNet
.演员评论家代理使用rlValueFunction
对象来实现批评家。
rlValueFunction(cNet,obsInfo);
用随机输入的观察来检查你的评论。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =单-0.0969
为了在参与者中近似策略,使用深度神经网络。对于行为批评代理,行为者执行随机策略,对于连续动作空间则由连续高斯行为者实现。在这种情况下,网络必须将观察信号作为输入,并为每个动作返回平均值和标准偏差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。
注意,标准偏差必须是非负的,平均值必须落在动作的范围内。因此,返回标准差的输出层必须是softplus或ReLU层,以强制非负性,而返回平均值的输出层必须是缩放层,以将平均值缩放到输出范围。
将每个网络路径定义为一个层对象数组。从环境规范对象中获取观察和操作空间的维度,并为输入和输出层指定一个名称,以便稍后可以显式地将它们与适当的通道相关联。
%输入路径inPath = [featureInputLayer(prod(obsInfo.Dimension),Name=“netObsIn”) fullyConnectedLayer (prod (actInfo.Dimension),名称=“infc”));平均路径meanPath = [tanhLayer(Name=“tanhMean”);fulllyconnectedlayer (prod(actInfo.Dimension));scalingLayer (...Name =“netMout”,...规模= actInfo.UpperLimit)范围比例%];%标准差路径sdevPath = [tanhLayer(Name=“tanhStdv”);fulllyconnectedlayer (prod(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个特征
创建参与者。演员评论家代理使用rlContinuousGaussianActor
对象来实现连续操作空间的参与者。
actor = rlContinuousGaussianActor(aNet, obsInfo, actInfo,...ActionMeanOutputNames =“netMout”,...ActionStandardDeviationOutputNames =“netSDout”,...ObservationInputNames =“netObsIn”);
用随机输入观察检查您的actor。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[-1.2332]}
使用演员和评论家创建AC代理。
agent = 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 =1x1单元阵列{[-1.5401]}
现在可以在环境中测试和训练代理。
用循环神经网络创建一个离散的行动者-评论家代理
类所使用的预定义环境训练DQN人员平衡车杆系统的例子。这个环境有一个四维观测向量(车的位置和速度、极角和极角导数),以及一个包含两个可能元素的标量动作(施加在车上的-10或+10 N的力)。
环境= rlPredefinedEnv(“CartPole-Discrete”);
获取观察和行动信息。
obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);
代理创建函数随机初始化演员网络和评论家网络。通过固定随机生成器的种子来确保重现性。
rng (0)
对于行动者-评论家代理,评论家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。
为了在评论家内近似值函数,使用循环深度神经网络。将网络定义为一组层对象,并从环境规范对象中获取观察空间的维度。要创建循环网络,请使用sequenceInputLayer
作为输入层并包含一个lstmLayer
作为其他网络层之一。
cNet = [sequenceInputLayer(prod(obsInfo.Dimension)) lstmLayer(10) reluLayer fullyConnectedLayer(1)];
将网络转换为adlnetwork
对象,并显示可学习参数(权重)的数量。
cNet = dlnetwork(cNet);总结(cNet)
初始化:true可学习数量:611 input: 1 'sequenceinput' 4维序列输入
使用cNet
.演员评论家代理使用rlValueFunction
对象来实现批评家。
rlValueFunction(cNet,obsInfo);
用随机输入的观察来检查评论家。
getValue(评论家,{兰德(obsInfo.Dimension)})
ans =单-0.0344
既然评论家有循环网络,那么演员也必须使用循环网络。对于行为批评代理,行为者执行随机策略,对于离散行为空间,由离散类别行为者执行随机策略。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层必须拥有与可能的操作数量一样多的元素。
aNet = [sequenceInputLayer(prod(obsInfo.Dimension)) lstmLayer(20) reluLayer fullyConnectedLayer(numel(actInfo.Elements))];
将网络转换为adlnetwork
对象并显示权重的数量。
aNet = dlnetwork(aNet);总结(aNet)
初始化:true可学习数量:2k input: 1 'sequenceinput' 4维序列输入
使用以下命令创建参与者aNet
.演员评论家代理使用rlDiscreteCategoricalActor
对象来实现离散操作空间的参与者。
actor = rlDiscreteCategoricalActor(aNet,obsInfo,actInfo);
用随机输入的观察结果检查actor。
getAction(演员,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[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);agent = rlACAgent(actor,批评家,agentOpts);
要检查代理,返回随机观察的动作。
getAction(代理,{兰德(obsInfo.Dimension)})
ans =1x1单元阵列{[10]}
现在可以在环境中测试和训练代理。
配置A3C培训选项
要使用异步A3C (advantage actor-critic)方法训练代理,必须适当地设置代理和并行训练选项。
创建AC座席时,需要设置NumStepsToLookAhead
值大于1
.常见的价值观有64
而且128
.
agentOpts = rlACAgentOptions(NumStepsToLookAhead=64);
使用agentOpts
创建代理时。或者,首先创建代理,然后修改它的选项,包括稍后使用点表示法的actor和批评家选项。
配置训练算法以使用异步并行训练。
trainOpts = rlTrainingOptions(UseParallel=true);trainOpts.ParallelizationOptions.Mode =“异步”;
配置工作者将梯度数据返回给主机。此外,设置工作人员将数据发送回主机之前的步数,以匹配要提前查看的步数。
trainOpts.ParallelizationOptions.DataToSendFromWorkers =...“梯度”;trainOpts.ParallelizationOptions.StepsUntilDataIsSent =...agentOpts.NumStepsToLookAhead;
使用trainOpts
当训练你的特工时。
有关异步优势行动者-评论家代理训练的示例,请参见用并行计算训练交流代理平衡车杆系统.
提示
对于连续的动作空间,使用
rlACAgent
对象不强制操作规范设置的约束,因此必须在环境中强制操作空间约束。
版本历史
在R2019a中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。