主要内容

rlPGAgent

策略梯度强化学习代理

描述

策略梯度(PG)算法是一种无模型、在线、基于策略的强化学习方法。PG智能体是一种基于策略的强化学习智能体,它使用强化算法直接计算出使长期奖励最大化的最优策略。动作空间可以是离散的,也可以是连续的。

有关PG代理和强化算法的更多信息,请参见策略梯度代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

根据观察和操作规范创建代理

例子

代理= rlPGAgent (observationInfoactionInfo使用默认初始化选项,为具有给定观察和操作规范的环境创建策略梯度代理。代理中的演员和评论家使用从观察规范构建的默认深度神经网络observationInfo动作规范actionInfo.的ObservationInfoActionInfo的属性代理设置为observationInfoactionInfo分别为输入参数。

例子

代理= rlPGAgent (observationInfoactionInfoinitOpts为具有给定观察和操作规范的环境创建策略梯度代理。代理使用默认网络,其中每个隐藏的完全连接层具有指定的单元数量initOpts对象。策略梯度代理不支持递归神经网络。金宝app有关初始化选项的详细信息,请参见rlAgentInitializationOptions

从演员和评论家中创建代理

代理= rlPGAgent (演员使用指定的参与者网络创建PG代理。默认情况下,UseBaseline代理人的财产为在这种情况下。

代理= rlPGAgent (演员评论家创建具有指定演员和评论家网络的PG代理。默认情况下,UseBaseline选择是真正的在这种情况下。

指定座席选项

例子

代理= rlPGAgent (___agentOptions创建PG代理并设置AgentOptions属性赋给agentOptions输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

代理初始化选项,指定为rlAgentInitializationOptions对象。策略梯度代理不支持递归神经网络。金宝app

实现策略的参与者,指定为rlDiscreteCategoricalActorrlContinuousGaussianActor函数逼近器对象。有关创建参与者近似器的更多信息,请参见创建策略和价值功能

基线评论家,估计贴现的长期回报,指定为一个rlValueFunction对象。有关创建临界近似器的更多信息,请参见创建策略和价值功能

属性

全部展开

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

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

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

动作规范,作为强化学习规范对象指定,定义诸如维度、数据类型和动作信号名称等属性。

对于离散动作空间,必须指定actionInfo作为一个rlFiniteSetSpec对象。

对于连续操作空间,必须指定actionInfo作为一个rlNumericSpec对象。

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

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

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

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

  • 真正的-在选择动作时使用基本代理探索策略。

  • -在选择动作时使用基本代理贪婪策略。

药剂的取样时间,用正标量或-1.将此参数设置为-1允许基于事件的模拟。的价值SampleTime中指定的值AgentOptions

在Simulink金宝app中®环境中,RL代理块中指定代理执行每个SampleTime模拟时间的秒数。如果SampleTime-1,块从它的父子系统继承采样时间。

在MATLAB中®环境中,代理在每次环境前进时执行。在这种情况下,SampleTime输出经验中连续元素之间的时间间隔是否由sim卡火车.如果SampleTime-1,返回的输出体验中连续元素之间的时间间隔反映了触发代理执行的事件的时间。

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练有素的强化学习代理
getAction 从给定环境观察的agent或actor处获取动作
getActor 从强化学习代理中获取actor
setActor 强化学习智能体的集合行动者
getCritic 获得强化学习代理的批评
setCritic 强化学习智能体的集合批评
generatePolicyFunction 创建评估强化学习代理的训练策略的函数

例子

全部折叠

创建一个具有离散行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境使用深度网络设计器创建代理并使用图像观察进行训练.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。作用是一个有五个可能元素的标量(转矩为-或-)2,101,或2Nm施加到极点)。

%加载预定义环境env = rlPredefinedEnv()“SimplePendulumWithImage-Discrete”);%获得观察和行动规范obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

代理创建功能随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,取消下面一行的注释。

% rng (0)

根据环境观察和操作规范创建策略梯度代理。

agent = rlPGAgent(obsInfo,actInfo);

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

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

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

创造一个具有连续行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境用图像观察训练DDPG Agent摆动和平衡摆锤.这个环境有两个观测值:一个50 × 50的灰度图像和一个标量(钟摆的角速度)。作用是一个标量,表示从-的连续范围内的扭矩22Nm。

%加载预定义环境env = rlPredefinedEnv()“SimplePendulumWithImage-Continuous”);%获得观察和行动规范obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个代理初始化选项对象,指定网络中每个隐藏的完全连接层必须具有128神经元(而不是默认的数目,256).策略梯度代理不支持循环网络,所以设置金宝appUseRNN选项真正的在创建代理时生成错误。

initOpts = rlAgentInitializationOptions(“NumHiddenUnit”, 128);

代理创建功能随机初始化演员和评论家网络。您可以通过固定随机生成器的种子来确保再现性。为此,取消下面一行的注释。

% rng (0)

根据环境观察和操作规范创建策略梯度代理。

agent = rlPGAgent(obsInfo,actInfo,initOpts);

从代理、演员和评论家中提取深度神经网络。

actorNet = getModel(getActor(agent));criticNet = getModel(getCritic(agent));

显示批评家网络的层,并验证每个隐藏的完全连接层有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))

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

情节(layerGraph (criticNet))

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

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

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

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

创建一个具有离散行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的环境用基线训练PG Agent控制双积分器系统.来自环境的观测是包含质量的位置和速度的矢量。作用是一个标量,表示施加在质量上的力,有三个可能的值(-)20,或2牛顿)。

env = rlPredefinedEnv()“DoubleIntegrator-Discrete”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个神经网络,用作基线批评中的近似模型。对于策略梯度代理,基线批评家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。

baselinenetn = [featureInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“状态”) fullyConnectedLayer (8,“名字”“BaselineFC”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (1,“名字”“BaselineFC2”“BiasLearnRateFactor”, 0)];

创建一个评论作为基准。策略梯度代理使用anrlValueFunction反对实施批评。

baseline = rlValueFunction(baselinenet,obsInfo);

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

baselineoptions = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

创建一个深度神经网络,用作actor内部的近似模型。对于策略梯度代理,参与者执行随机策略,对于离散动作空间,由离散分类参与者实现。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层的元素数量必须与可能的操作数量一样多。

actorNetwork = [featureInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“状态”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“行动”“BiasLearnRateFactor”, 0)];

使用以下命令创建角色rlDiscreteCategoricalActor,以及观察和行动规范。

actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo,actInfo);

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

actorOpts = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

指定代理选项。

agentOpts = rlPGAgentOptions(“UseBaseline”,真的,“DiscountFactor”, 0.99,“CriticOptimizerOptions”baselineOpts,“ActorOptimizerOptions”, actorOpts);

使用角色、评论家和代理选项对象创建PG代理。

agent = rlpagent (actor,baseline,agentOpts)
agent = rlPGAgent with properties: AgentOptions: [1x1 rl.option.]rlPGAgentOptions] UseExplorationPolicy: 1 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlFiniteSetSpec] SampleTime: 1

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

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

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

创造一个具有连续行动空间的环境,并获得其观察和行动规范。对于本例,加载示例中使用的双积分器连续动作空间环境训练DDPG代理控制双积分器系统

env = rlPredefinedEnv()“DoubleIntegrator-Continuous”);obsInfo = getObservationInfo(env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [21 1] DataType: "double"
actInfo = getActionInfo(env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"

在这个例子中,作用是一个标量输入,表示从-的力22,因此,设置动作信号的上下限是一个好主意。当行动者的网络有一个非线性输出层,需要相应地缩放以产生期望范围内的输出时,必须这样做。

actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;

策略梯度代理使用一个值函数批评家作为基线。对于策略梯度代理,基线批评家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。

baselinenetn = [featureInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“状态”) fullyConnectedLayer (8,“名字”“bFC1”) reluLayer (“名字”“bRelu1”) fullyConnectedLayer (1,“名字”“bFC2”“BiasLearnRateFactor”, 0)];

创建一个评论作为基准。策略梯度代理使用anrlValueFunction反对实施批评。

baseline = rlValueFunction(baselinenet,obsInfo);

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

baselineoptions = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

创建一个深度神经网络,用作actor内部的近似模型。对于策略梯度代理,参与者执行随机策略,对于连续动作空间,参与者由连续高斯参与者实现。在这种情况下,网络必须将观测信号作为输入,并为每个动作返回平均值和标准差值。因此,它必须有两个输出层(一个用于平均值,另一个用于标准偏差值),每个层都有与动作空间维数相同的元素。

注意,标准偏差必须是非负的,平均值必须落在作用的范围内。因此,返回标准差的输出层必须是一个softplus或ReLU层,以强制非负性,而返回平均值的输出层必须是一个缩放层,以将平均值缩放到输出范围。

%输入路径层数(1 × 1输出)inPath = [featureInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“状态”) fullyConnectedLayer (10“名字”“ip_fc”) reluLayer (“名字”“ip_relu”) fullyConnectedLayer (1,“名字”“ip_out”));%平均路径层数(1 × 1输出)meanPath = [fulllyconnectedlayer (15;“名字”“mp_fc1”) reluLayer (“名字”“mp_relu”) fullyConnectedLayer (1,“名字”“mp_fc2”);tanhLayer (“名字”的双曲正切);%超出范围:-1,1scalingLayer (“名字”“mp_out”“规模”actInfo.UpperLimit)];%取值范围:-2,2% STD路径层数(1 × 1输出)sdevPath = [fulllyconnectedlayer (15,“名字”“vp_fc1”) reluLayer (“名字”“vp_relu”) fullyConnectedLayer (1,“名字”“vp_fc2”);softplusLayer (“名字”“vp_out”));%非负添加图层到layerGraph网络对象actorNet = layerGraph(inPath);actorNet = addLayers(actorNet,meanPath);actorNet = addLayers(actorNet,sdevPath);%连接inPath的输出到meanPath的输入actorNet = connectLayers(actorNet,“ip_out”“mp_fc1 /”);%连接inPath的输出到variancePath的输入actorNet = connectLayers(actorNet,“ip_out”“vp_fc1 /”);%地块网络情节(actorNet)

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

使用以下命令创建角色rlContinuousGaussianActor,连同…actorNet,观察和动作规范,以及网络输入和输出层的名称。

actor = rlContinuousGaussianActor(actorNet)obsInfo actInfo,“ObservationInputNames”, {“状态”},“ActionMeanOutputNames”, {“mp_out”},“ActionStandardDeviationOutputNames”, {“vp_out”});

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

actorOpts = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

指定代理选项,并使用参与者、基线和代理选项创建PG代理。

agentOpts = rlPGAgentOptions(“UseBaseline”,真的,“DiscountFactor”, 0.99,“ActorOptimizerOptions”, actorOpts);agent = rlpagent (actor,baseline,agentOpts)
agent = rlPGAgent with properties: AgentOptions: [1x1 rl.option.]rlPGAgentOptions] UseExplorationPolicy: 1 ObservationInfo: [1x1 rl.util.rlNumericSpec] ActionInfo: [1x1 rl.util.rlNumericSpec] SampleTime: 1

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

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

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

对于本例,加载示例中使用的环境用基线训练PG Agent控制双积分器系统.来自环境的观测是包含质量的位置和速度的矢量。作用是一个标量,表示施加在质量上的力,有三个可能的值(- 2,0或2牛顿)。

env = rlPredefinedEnv()“DoubleIntegrator-Discrete”);

获取观察和规格信息。

obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个评论作为基准。对于策略梯度代理,基线批评家估计一个值函数,因此它必须将观测信号作为输入并返回一个标量值。要为评论家创建一个循环神经网络,使用sequenceInputLayer作为输入层,并包含一个lstmLayer作为其他网络层之一。

baselinenetn = [sequenceInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“myobs”) fullyConnectedLayer (8,“名字”“BaselineFC”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (1,“名字”“BaselineFC2”“BiasLearnRateFactor”, 0)];

基于网络逼近器模型创建评论家。策略梯度代理使用anrlValueFunction反对实施批评。

baseline = rlValueFunction(baselinenet,obsInfo);

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

baselineoptions = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

既然评论家有一个循环网络,那么演员也一定有一个循环网络。为行动者定义一个循环神经网络。对于策略梯度代理,参与者执行随机策略,对于离散动作空间,由离散分类参与者实现。在这种情况下,网络必须将观察信号作为输入,并返回每个动作的概率。因此,输出层的元素数量必须与可能的操作数量一样多。

actorNetwork = [sequenceInputLayer(prod(obsInfo.Dimension),“归一化”“没有”“名字”“myobs”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“行动”“BiasLearnRateFactor”, 0)];

创建角色。策略梯度代理使用随机行为体,对于离散动作空间,随机行为体由rlDiscreteCategoricalActor对象。

actor = rlDiscreteCategoricalActor(actorNetwork,obsInfo actInfo,“观察”, {“myobs”});

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

actorOpts = rlooptimizeroptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

指定代理选项,并使用角色和评论家创建PG代理。

agentOpts = rlPGAgentOptions(“UseBaseline”,真的,“DiscountFactor”, 0.99,“CriticOptimizerOptions”baselineOpts,“ActorOptimizerOptions”, actorOpts);agent = rlpagent (actor,baseline);

对于具有递归神经网络的PG智能体,训练序列长度为整集。

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

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

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

提示

  • 对于连续动作空间,rlPGAgent代理不执行操作规范设置的约束,因此必须在环境中执行操作空间约束。

版本历史

在R2019a中引入