rlSACAgent
软演员-评论家强化学习代理
描述
软行为批评(SAC)算法是一种无模型、在线、非策略、行为批评的强化学习方法。SAC算法计算一个最优策略,使长期预期回报和策略的熵最大化。政策熵是对给定状态下的政策不确定性的度量。熵值越高,探索就越多。最大化奖励和熵平衡探索和开发环境。动作空间只能是连续的。
有关更多信息,请参见软演员-评论家代理.
有关不同类型的强化学习代理的更多信息,请参见强化学习代理.
创建
语法
描述
根据观察和行动规格创建代理
使用默认初始化选项,为具有给定观察和操作规范的环境创建SAC代理。代理中的行动者和评论家使用使用观察规范构建的默认深度神经网络代理
= rlSACAgent (observationInfo
,actionInfo
)observationInfo
以及行为规范actionInfo
.的ObservationInfo
而且ActionInfo
的属性代理
设置为observationInfo
而且actionInfo
分别输入参数。
使用指定的初始化选项创建带有深度神经网络的SAC代理(代理
= rlSACAgent (observationInfo
,actionInfo
,initOptions
)initOptions
).
指定代理选项
设置AgentOptions属性。代理
= rlSACAgent (___,agentOptions
)
输入参数
initOptions
- - - - - -代理初始化选项
rlAgentInitializationOptions
对象
代理初始化选项,指定为rlAgentInitializationOptions
对象。
演员
- - - - - -演员
rlContinuousGaussianActor
对象
实现策略的参与者,指定为rlContinuousGaussianActor
函数逼近对象。有关创建角色逼近器的详细信息,请参见创建策略和值函数.
批评人士
- - - - - -评论家
rlQValueFunction
对象|的两元行向量rlQValueFunction
对象
评论家,指定为以下之一:
rlQValueFunction
object -创建一个具有单一q值函数的SAC代理。的两元行向量
rlQValueFunction
objects—创建带有两个临界值函数的SAC代理。这两个评论家必须是独一无二的rlQValueFunction
具有相同的观察和操作规范的对象。批评家可以有不同的结构,也可以有相同的结构但初始参数不同。
对于SAC特工,每个评论家必须是单个输出rlQValueFunction
对象,该对象将操作和观察结果都作为输入。
有关创建批评的更多信息,请参见创建策略和值函数.
属性
ObservationInfo
- - - - - -观测规范
规范对象|规范对象数组
观察规范,指定为强化学习规范对象或定义维度、数据类型和观察信号名称等属性的规范对象数组。
如果通过指定演员和评论家来创建代理,则ObservationInfo
匹配参与者和评论家对象中指定的值。
你可以提取observationInfo
从现有环境或代理中使用getObservationInfo
.您还可以使用rlFiniteSetSpec
或rlNumericSpec
.
ActionInfo
- - - - - -操作规范
rlNumericSpec
对象
连续动作空间的动作规范,指定为rlNumericSpec
对象定义操作信号的维度、数据类型和名称等属性。
如果通过指定演员和评论家来创建代理,则ActionInfo
匹配参与者和评论家对象中指定的值。
你可以提取actionInfo
从现有环境或代理中使用getActionInfo
.您还可以使用rlFiniteSetSpec
或rlNumericSpec
.
AgentOptions
- - - - - -剂的选择
rlSACAgentOptions
对象
代理选项,指定为rlSACAgentOptions
对象。
如果您创建一个使用循环神经网络的默认参与者和评论家的SAC代理,则AgentOptions。年代equenceLength
是32
.
ExperienceBuffer
- - - - - -经验的缓冲
rlReplayMemory
对象
经验缓冲区,指定为rlReplayMemory
对象。在训练过程中,代理存储它的每个经验(年代,一个,R,年代,D)放在缓冲区中。在这里:
年代是当前对环境的观测。
一个是代理所采取的动作。
R采取行动的奖励是什么一个.
年代是采取行动后的下一次观察吗一个.
D是否在采取行动后发出“完成”信号一个.
UseExplorationPolicy
- - - - - -选择使用探索策略
真正的
(默认)|假
选项,在选择操作时使用探索策略,指定为以下逻辑值之一。
真正的
—在中选择动作时,使用基础代理探索策略sim卡
而且generatePolicyFunction
.在这种情况下,智能体通过采样其概率分布来选择其行为,因此策略是随机的,智能体探索其观察空间。假
-在选择动作时,使用基础代理贪婪策略(可能性最大的动作)sim卡
而且generatePolicyFunction
.在这种情况下,模拟的代理和生成的策略的行为是确定的。
请注意
此选项仅影响模拟和部署;这不会影响训练。
SampleTime
- - - - - -药剂取样时间
积极的标量|-1
对象的功能
例子
根据观察和行动规范创建SAC代理
创造环境,获得观察和行动规范。对于本例,加载示例中使用的环境训练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
从行动者或评论家中提取近似器模型(默认为深度神经网络)。
使用初始化选项创建SAC代理
创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载示例中使用的环境训练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))
总结(actorNet)
初始化:true可学习数量:17.1k输入:1' input_1' 2个特征
情节(layerGraph (criticNet2))
总结(criticNet2)
初始化:true可学习数量:33.6k输入:1' input_1' 2个特征2' input_2' 1个特征
要检查代理,请使用getAction
从随机观察中返回动作。
getAction(代理,{兰特(obsInfo (1) .Dimension)})
ans =1x1单元阵列{[-0.9867]}
现在可以在环境中测试和训练代理。
从演员和评论家创建SAC代理
创造一个环境,并获得观察和行动规范。对于本例,加载示例中使用的环境训练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,网络必须将观测信号作为输入,并为每个动作返回平均值和标准差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。
不要添加tanhLayer
或scalingLayer
在平均输出路径中。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]}
现在可以在环境中测试和训练代理。
使用循环神经网络创建SAC代理
对于本例,加载示例中使用的环境训练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
为了在参与者中近似策略,使用深度神经网络。既然评论家有一个循环网络,那么演员也一定有一个循环网络。网络必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。
不要添加tanhLayer
或scalingLayer
在平均输出路径中。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中介绍
Abrir比如
Tiene una versión modificada de este ejemplo。¿Desea abrir este ejemplo con sus modificaciones?
MATLAB突击队
Ha hecho clic en unenlace que对应一个este commando de MATLAB:
弹射突击队introduciéndolo en la ventana de commandos de MATLAB。Los navegadores web no permission comandos de MATLAB。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。