主要内容

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是否在采取行动后发出“完成”信号一个

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

  • 真正的—选择动作时,使用基础代理探索策略。

  • —选择动作时使用base agent greedy策略。

试剂的取样时间,指定为正标量或-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控制双积分系统.来自环境的观测是一个包含质量的位置和速度的矢量。作用是表示施加在质量上的力的标量,范围从-连续22牛顿。

环境= 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]}

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

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

环境= 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类型的对象。

情节(layerGraph (criticNet2))

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

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

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

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

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

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

创建两个q值评论家。首先,创建一个批评家深度神经网络结构。单输出q值函数评论家的网络必须有两个输入层,一个用于观察,另一个用于操作,并返回一个标量值,表示给定的观察和操作之后预期的累积长期奖励。

%观测输入和路径statePath1 = [featureInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”“名字”“观察”) fullyConnectedLayer (400,“名字”“CriticStateFC1”) reluLayer (“名字”“CriticStateRelu1”) fullyConnectedLayer (300,“名字”“CriticStateFC2”));%动作输入和路径actionPath1 = [featureInputLayer(prod(actInfo.Dimension)),“归一化”...“没有”“名字”“行动”) fullyConnectedLayer (300,“名字”“CriticActionFC1”));%公共路径commonPath1 = [addtionlayer (2,“名字”“添加”) reluLayer (“名字”“CriticCommonRelu1”) fullyConnectedLayer (1,“名字”“CriticOutput”));%连接层criticNet = layerGraph(statePath1);criticNet = addLayers(criticNet,actionPath1);addLayers(criticNet,commonPath1);临界网络= connectLayers(临界网络,“CriticStateFC2”“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”“添加/ in2”);

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

critic1 = rlQValueFunction(criticNet,obsInfo,actInfo);critic2 = rlQValueFunction(criticNet,obsInfo,actInfo);

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

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

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

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

statePath = [featureInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”“名字”“观察”) fullyConnectedLayer (400,“名字”“commonFC1”) reluLayer (“名字”“CommonRelu”));meanPath = [fulllyconnectedlayer (300,“名字”“MeanFC1”) reluLayer (“名字”“MeanRelu”) fullyConnectedLayer (prod (actInfo.Dimension),“名字”“的意思是”));stdPath = [fulllyconnectedlayer (300,“名字”“StdFC1”) reluLayer (“名字”“StdRelu”) fullyConnectedLayer (prod (actInfo.Dimension),“名字”“StdFC2”) softplusLayer (“名字”“StandardDeviation”));actorNetwork = layerGraph(statePath);actorNetwork = addLayers(actorNetwork,meanPath);actorNetwork = addLayers(actorNetwork,stdPath);actorNetwork = connectLayers“CommonRelu”“MeanFC1 /”);actorNetwork = connectLayers“CommonRelu”“StdFC1 /”);

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

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

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

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.1259]}

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

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

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

创建两个q值评论家。首先,创建一个批评家深度神经网络结构。单输出q值函数评论家的网络必须有两个输入层,一个用于观察,另一个用于操作,并返回一个标量值,表示给定的观察和操作之后预期的累积长期奖励。要创建循环神经网络,请使用sequenceInputLayer作为输入层并包含一个lstmLayer作为其他网络层之一。

statePath1 = [sequenceInputLayer(prod(obsInfo.Dimension)),...“归一化”“没有”“名字”“观察”) fullyConnectedLayer (400,“名字”“CriticStateFC1”) reluLayer (“名字”“CriticStateRelu1”) fullyConnectedLayer (300,“名字”“CriticStateFC2”));actionPath1 = [sequenceInputLayer(prod(actInfo.Dimension)),...“归一化”“没有”“名字”“行动”) fullyConnectedLayer (300,“名字”“CriticActionFC1”));commonPath1 = [addtionlayer (2,“名字”“添加”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) reluLayer (“名字”“CriticCommonRelu1”) fullyConnectedLayer (1,“名字”“CriticOutput”));criticNet = layerGraph(statePath1);criticNet = addLayers(criticNet,actionPath1);addLayers(criticNet,commonPath1);临界网络= connectLayers(临界网络,“CriticStateFC2”“添加/三机一体”);临界网络= connectLayers(临界网络,“CriticActionFC1”“添加/ in2”);

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

critic1 = rlQValueFunction(criticNet,obsInfo,actInfo);critic2 = rlQValueFunction(criticNet,obsInfo,actInfo);

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

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

创建一个actor深度神经网络。既然评论家有一个循环网络,那么演员也一定有一个循环网络。网络必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个输出层具有与动作空间维度相同的元素。

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

statePath = [sequenceInputLayer(prod(obsInfo.Dimension),...“归一化”“没有”“名字”“观察”) fullyConnectedLayer (400,“名字”“commonFC1”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) reluLayer (“名字”“CommonRelu”));meanPath = [fulllyconnectedlayer (300,“名字”“MeanFC1”) reluLayer (“名字”“MeanRelu”) fullyConnectedLayer (prod (actInfo.Dimension),“名字”“的意思是”));stdPath = [fulllyconnectedlayer (300,“名字”“StdFC1”) reluLayer (“名字”“StdRelu”) fullyConnectedLayer (prod (actInfo.Dimension),“名字”“StdFC2”) softplusLayer (“名字”“StandardDeviation”));actorNetwork = layerGraph(statePath);actorNetwork = addLayers(actorNetwork,meanPath);actorNetwork = addLayers(actorNetwork,stdPath);actorNetwork = connectLayers“CommonRelu”“MeanFC1 /”);actorNetwork = connectLayers“CommonRelu”“StdFC1 /”);

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

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

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

actorOptions = rlOptimizerOptions(...“优化”“亚当”“LearnRate”1 e - 3,...“GradientThreshold”,1,“L2RegularizationFactor”1 e-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.6552]}

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

版本历史

R2020b中介绍