主要内容

rlSACAgent

软演员-评论家强化学习代理

描述

软行为批评(SAC)算法是一种无模型、在线、非策略、行为批评的强化学习方法。SAC算法计算一个最优策略,使长期预期回报和策略的熵最大化。政策熵是对给定状态下的政策不确定性的度量。熵值越高,探索就越多。最大化奖励和熵平衡探索和开发环境。动作空间只能是连续的。

有关更多信息,请参见软演员-评论家代理

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

创建

描述

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

例子

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

例子

代理= rlSACAgent (observationInfoactionInfoinitOptions使用指定的初始化选项创建带有深度神经网络的SAC代理(initOptions).

从演员和评论家创建代理

例子

代理= rlSACAgent (演员批评人士使用指定的参与者和评论家网络和默认代理选项创建SAC代理。

指定代理选项

代理= rlSACAgent (___agentOptions设置AgentOptions属性。

输入参数

全部展开

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

实现策略的参与者,指定为rlContinuousGaussianActor函数逼近对象。有关创建角色逼近器的详细信息,请参见创建策略和值函数

评论家,指定为以下之一:

  • rlQValueFunctionobject -创建一个具有单一q值函数的SAC代理。

  • 的两元行向量rlQValueFunctionobjects—创建带有两个临界值函数的SAC代理。这两个评论家必须是独一无二的rlQValueFunction具有相同的观察和操作规范的对象。批评家可以有不同的结构,也可以有相同的结构但初始参数不同。

对于SAC特工,每个评论家必须是单个输出rlQValueFunction对象,该对象将操作和观察结果都作为输入。

有关创建批评的更多信息,请参见创建策略和值函数

属性

全部展开

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

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

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

连续动作空间的动作规范,指定为rlNumericSpec对象定义操作信号的维度、数据类型和名称等属性。

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

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

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

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

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

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

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

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

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

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

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

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

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

请注意

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

试剂的取样时间,指定为正标量或-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)

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

agent = rlSACAgent(obsInfo,actInfo);

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

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

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

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

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个代理初始化选项对象,指定网络中每个隐藏的全连接层必须有128个神经元。

initOpts = rlAgentInitializationOptions(NumHiddenUnit=128);

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

rng (0)

使用初始化选项从环境观察和操作规范创建SAC代理。

agent = rlSACAgent(obsInfo,actInfo,initOpts);

从参与者中提取深度神经网络。

actorNet = getModel(代理);

从这两个批评中提取出深度神经网络。请注意,getModel(批评)只返回第一个评论家网络。

批评家= get批评家(代理);criticNet1 = getModel(批评家(1));getModel(批评家(2));

显示第一个评论家网络的层,并验证每个隐藏的全连接层有128个神经元。

criticNet1。层
ans = 9x1层阵列:1' concat' Concatenation 2个输入沿维度1的连接2' relu_body' ReLU ReLU 3 'fc_body'全连接128全连接层4 'body_output' ReLU ReLU 5 'input_1'特征输入2特征6 'fc_1'全连接128全连接层7 'input_2'特征输入1特征8 'fc_2'全连接128全连接层9 'output'全连接1全连接层

画出演员和第二个评论家的网络,并显示权重的数量。

情节(layerGraph (actorNet))

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

总结(actorNet)
初始化:true可学习数量:17.1k输入:1' input_1' 2个特征
情节(layerGraph (criticNet2))

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

总结(criticNet2)
初始化:true可学习数量:33.6k输入:1' input_1' 2个特征2' input_2' 1个特征

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

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

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

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

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

一个SAC代理使用两个q值函数评论家。为了近似每个q值函数,使用神经网络。单输出q值函数评论家的网络必须有两个输入层,一个用于观察,另一个用于操作,并返回一个标量值,表示给定的观察和操作之后预期的累积长期奖励。

将每个网络路径定义为层对象的数组,以及来自环境规范对象的观察和操作空间的维度。

%观测路径obsPath = [featureInputLayer(prod(obsInfo.Dimension),Name=“obsPathIn”fulllyconnectedlayer (16,Name=“obsPathOut”));%动作路径actPath = [featureInputLayer(prod(actInfo.Dimension),Name=“actPathIn”fulllyconnectedlayer (16,Name=“actPathOut”));%公共路径commonPath = [concatenationLayer(1,2,Name= .“concat”reluLayer fullyConnectedLayer(1)];为layergraph对象添加图层criticNet = layerGraph;criticNet = addLayers(criticNet,obsPath);addLayers(criticNet,actPath);criticNet = addLayers(criticNet,commonPath);%连接层临界网络= connectLayers(临界网络,“obsPathOut”“concat /三机一体”);临界网络= connectLayers(临界网络,“actPathOut”“concat / in2”);

要为两个评论家初始化不同的网络权重,请创建两个不同的dlnetwork对象。您必须这样做,因为如果代理构造函数不接受两个相同的批评。

criticNet1 = dlnetwork(criticNet);criticNet2 = dlnetwork(criticNet);

显示权重的数量。

总结(criticNet1)
初始化:true学习数量:1.2k输入:1 'obsPathIn' 2个特征2 'actPathIn' 1个特征

创建两个批评使用rlQValueFunction,使用两个不同权重的网络。或者,如果您使用具有相同权重的完全相同的网络,则在将网络传递给之前,必须每次显式地初始化网络(以确保权重初始化不同)rlQValueFunction.要做到这一点,使用初始化

critic1 = rlQValueFunction(criticNet1,obsInfo,actInfo,...ActionInputNames =“actPathIn”ObservationInputNames =“obsPathIn”);rlQValueFunction(criticNet2,obsInfo,actInfo,...ActionInputNames =“actPathIn”ObservationInputNames =“obsPathIn”);

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

getValue(摘要,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.1330
getValue (critic2{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.1526

为了在参与者中近似策略,使用深度神经网络。由于SAC代理使用连续高斯actor,网络必须将观测信号作为输入,并为每个动作返回平均值和标准差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。

不要添加tanhLayerscalingLayer在平均输出路径中。SAC代理在内部将无界高斯分布转换为有界分布,以正确计算概率密度函数和熵。

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

定义公共输入路径commonPath = [featureInputLayer(prod(obsInfo.Dimension),Name=“netObsIn”) fulllyconnectedlayer (400) relullayer (Name=“CommonRelu”));为平均值定义路径meanPath = [fulllyconnectedlayer (300,Name=。“meanIn”) reluLayer fullyConnectedLayer(prod(actInfo.Dimension),Name=“MeanOut”));定义标准差路径stdPath = [fullyConnectedLayer(300,Name=“stdIn”) reluLayer fullyConnectedLayer(prod(actInfo.Dimension)) softplusLayer(Name=“StandardDeviationOut”));将图层添加到layerGraph对象actorNet = layerGraph(commonPath);actorNet = addLayers(actorNet,meanPath);actorNet = addLayers(actorNet,stdPath);%连接层actorNet = connectLayers(actorNet,“CommonRelu”“meanIn /”);actorNet = connectLayers(actorNet,“CommonRelu”“stdIn /”);%转换为dlnetwork并显示权重数。actorNet = dlnetwork(actorNet);总结(actorNet)
初始化:true可学习数量:242.4k输入:1 'netObsIn' 2个特征

使用以下命令创建参与者actorNet、观察和操作规范对象,以及输入和输出层的名称。

actor = rlContinuousGaussianActor(actorNet, obsInfo, actInfo,...ActionMeanOutputNames =“MeanOut”...ActionStandardDeviationOutputNames =“StandardDeviationOut”...ObservationInputNames =“netObsIn”);

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

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

为评论家指定培训方案。

criticOptions = rlOptimizerOptions(...优化器=“亚当”...LearnRate = 1 e - 3,...GradientThreshold = 1,...L2RegularizationFactor = 2的军医);

为演员指定训练选项。

actorOptions = rlOptimizerOptions(...优化器=“亚当”...LearnRate = 1 e - 3,...GradientThreshold = 1,...L2RegularizationFactor = 1 e-5);

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

agentOptions = rlSACAgentOptions;agentOptions。SampleTime= env.Ts; agentOptions.DiscountFactor = 0.99; agentOptions.TargetSmoothFactor = 1e-3; agentOptions.ExperienceBufferLength = 1e6; agentOptions.MiniBatchSize = 32; agentOptions.CriticOptimizerOptions = criticOptions; agentOptions.ActorOptimizerOptions = actorOptions;

使用参与者、评论家和选项创建SAC代理。

agent = rlSACAgent(actor,[critic1 critic2],agentOptions);

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

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

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

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

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

一个SAC代理使用两个q值函数评论家。为了近似每个q值函数,使用神经网络。单输出q值函数评论家的网络必须有两个输入层,一个用于观察,另一个用于操作,并返回一个标量值,表示给定的观察和操作之后预期的累积长期奖励。

将每个网络路径定义为层对象的数组,以及来自环境规范对象的观察和操作空间的维度。要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

定义观察路径obsPath = [sequenceInputLayer(prod(obsInfo.Dimension),Name=“obsIn”fulllyconnectedlayer (300,Name =“obsOut”));定义动作路径actPath = [sequenceInputLayer(prod(actInfo.Dimension),Name=“肌动蛋白”) fullyConnectedLayer(300年,Name =“actOut”));定义公共路径commonPath = [concatenationLayer(1,2,Name= .“猫”) lstmLayer(16) reluLayer fullyConnectedLayer(1)];为layergraph对象添加图层criticNet = layerGraph(obsPath);addLayers(criticNet,actPath);criticNet = addLayers(criticNet,commonPath);%连接路径临界网络= connectLayers(临界网络,“obsOut”“猫/三机一体”);临界网络= connectLayers(临界网络,“actOut”“猫/ in2”);

要为两个评论家初始化不同的网络权重,请创建两个不同的dlnetwork对象。您必须这样做,因为如果代理构造函数不接受两个相同的批评。

criticNet1 = dlnetwork(criticNet);criticNet2 = dlnetwork(criticNet);

显示权重的数量。

总结(criticNet1)
初始化:true可学习数:161.6k输入:1 'obsIn' 2维序列输入2 'actIn' 1维序列输入

使用rlQValueFunction.对两个评论家使用相同的网络结构。SAC代理使用不同的缺省参数初始化两个网络。

critic1 = rlQValueFunction(criticNet1,obsInfo,actInfo);critic2 = rlQValueFunction(criticNet2,obsInfo,actInfo);

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

getValue(摘要,{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =-0.0020
getValue (critic2{兰德(obsInfo.Dimension)},{兰德(actInfo.Dimension)})
ans =0.0510

为了在参与者中近似策略,使用深度神经网络。既然评论家有一个循环网络,那么演员也一定有一个循环网络。网络必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。

不要添加tanhLayerscalingLayer在平均输出路径中。SAC代理在内部将无界高斯分布转换为有界分布,以正确计算概率密度函数和熵。

将每个网络路径定义为一个层对象数组,并为输入和输出层指定一个名称,以便稍后可以显式地将它们与适当的通道关联起来。

定义公共路径commonPath = [sequenceInputLayer(prod(obsInfo.Dimension),Name=“obsIn”) fullyConnectedLayer(400) lstmLayer(8) relullayer (Name=“CommonOut”));meanPath = [fulllyconnectedlayer (300,Name=。“MeanIn”) reluLayer fullyConnectedLayer(prod(actInfo.Dimension),Name=“的意思是”));stdPath = [fullyConnectedLayer(300,Name=“StdIn”) reluLayer fullyConnectedLayer(prod(actInfo.Dimension)) softplusLayer(Name=“StandardDeviation”));actorNet = layerGraph(commonPath);actorNet = addLayers(actorNet,meanPath);actorNet = addLayers(actorNet,stdPath);actorNet = connectLayers(actorNet,“CommonOut”“MeanIn /”);actorNet = connectLayers(actorNet,“CommonOut”“StdIn /”);%转换为dlnetwork并显示权重数。actorNet = dlnetwork(actorNet);总结(actorNet)
初始化:true可学习数量:20.2k input: 1 'obsIn' 2维序列输入

使用以下命令创建参与者actorNetwork

actor = rlContinuousGaussianActor(actorNet, obsInfo, actInfo,...ActionMeanOutputNames =“的意思是”...ActionStandardDeviationOutputNames =“StandardDeviation”...ObservationInputNames =“obsIn”);

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

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

为评论家指定培训方案。

criticOptions = rlOptimizerOptions(...优化器=“亚当”, LearnRate = 1e-3,...GradientThreshold = 1, L2RegularizationFactor = 2e-4);

为演员指定训练选项。

actorOptions = rlOptimizerOptions(...优化器=“亚当”, LearnRate = 1e-3,...GradientThreshold = 1, L2RegularizationFactor = 1e-5);

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

agentOptions = rlSACAgentOptions;agentOptions。SampleTime= env.Ts; agentOptions.DiscountFactor = 0.99; agentOptions.TargetSmoothFactor = 1e-3; agentOptions.ExperienceBufferLength = 1e6; agentOptions.SequenceLength = 32; agentOptions.MiniBatchSize = 32;

使用参与者、评论家和选项创建SAC代理。

agent = rlSACAgent(actor,[critic1 critic2],agentOptions);

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

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

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

版本历史

R2020b中介绍