主要内容

rlPGAgent

政策梯度强化学习agent

描述

策略梯度(PG)算法是一种无模型的在线策略强化学习方法。PG代理是一种基于策略的强化学习代理,它使用enhance算法直接计算一个使长期回报最大化的最优策略。动作空间可以是离散的,也可以是连续的。

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

创建

描述

根据观察和动作规范创建Agent

例子

代理= rlPGAgent (observationInfoactionInfo使用默认初始化选项,为具有给定观察和操作规范的环境创建策略梯度代理。代理中的行动者和评论家表示使用根据观察规范建立的默认深度神经网络observationInfo还有动作规范actionInfo

例子

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

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

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

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

指定代理选项

例子

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

输入参数

全部展开

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

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

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

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

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

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

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

参与者网络表示形式,指定为rlStochasticActorRepresentation.有关创建参与者表示的更多信息,请参见创建策略和值函数表示

评论家网络代表,指定为rlValueRepresentation对象。有关创建评论表示的更多信息,请参见创建策略和值函数表示

属性

全部展开

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

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练过的强化学习代理
getAction 在给定的环境观测中,从agent或actor表示中获得动作
getActor 从强化学习agent中得到行动者表示
setActor 设置强化学习agent的行动者表示
getCritic 从强化学习代理中获得批评代表
setCritic 设置强化学习agent的批评家表示
generatePolicyFunction 创建评估强化学习机训练策略的函数

例子

全部折叠

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

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

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

% rng (0)

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

代理= rlPGAgent (obsInfo actInfo);

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

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

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

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

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

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

initOpts = rlAgentInitializationOptions (“NumHiddenUnit”, 128);

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

% rng (0)

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

代理= rlPGAgent (obsInfo actInfo initOpts);

将批评家的学习速度降低到1e-3。

评论家= getCritic(代理);critic.Options.LearnRate = 1 e - 3;代理= setCritic(代理、批评);

分别从行为主体和批评主体提取深度神经网络。

actorNet = getModel (getActor(代理));criticNet = getModel (getCritic(代理));

显示批评网络的层,并验证每个隐藏的全连接层有128个神经元

criticNet。层
包含层的层数组:1的concat串联连接2输入沿着维度3 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 fully connected layer 9 'input_2' Image Input 1x1x1 images 10 'fc_2' fully connected layer 11 'output' fully connected 1 full connected layer 12 'RepresentationLoss' Regression output mean-square -error

情节演员和评论家网络

情节(actorNet)

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

情节(criticNet)

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

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

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

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

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

%负载预定义环境env = rlPredefinedEnv (“DoubleIntegrator-Discrete”);%获得观察和规格信息obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

创建一个批评家表示来作为基线。

%创建一个网络,用作潜在的评论家逼近器baselineNetwork = [imageInputLayer([obsInfo.Dimension(1) 1 1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer (8,“名字”“BaselineFC”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (1,“名字”“BaselineFC2”“BiasLearnRateFactor”, 0)];%为评论家设置一些选项baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%创建基于网络逼近器的评论家基线= rlValueRepresentation (baselineNetwork obsInfo,“观察”, {“状态”}, baselineOpts);

创建一个参与者表示。

%创建一个网络,用作底层的actor逼近器actorNetwork = [imageInputLayer([obsInfo.Dimension(1) 1 1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“行动”“BiasLearnRateFactor”, 0)];%为actor设置一些选项actorOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%创建基于网络逼近器的参与者演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“状态”}, actorOpts);

指定代理选项,并使用环境、参与者和评论家创建PG代理。

agentOpts = rlPGAgentOptions (...“UseBaseline”,真的,...“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts)
agent = rlPGAgent with properties: AgentOptions: [1x1 rl.option.rlPGAgentOptions]

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

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

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

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

%负载预定义环境env = rlPredefinedEnv (“DoubleIntegrator-Continuous”);%获取观察规范信息obsInfo = getObservationInfo (env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf Name: "states" Description: "x, dx" Dimension: [2 1] DataType: "double"
%获取动作规格信息actInfo = getActionInfo (env)
描述:[0x0 string]维度:[1 1]DataType: "double"

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

%确保动作空间的上下限是有限的actInfo.LowerLimit = 2;actInfo.UpperLimit = 2;

创建一个批评家表示来作为基线。策略梯度代理使用rlValueRepresentation基线。对于连续观测空间,您可以使用深度神经网络或自定义基表示。对于这个例子,创建一个深层神经网络作为潜在的逼近器。

%创建一个网络,用作潜在的评论家逼近器baselineNetwork = [imageInputLayer([obsInfo. net]);尺寸1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer (8,“名字”“BaselineFC1”) reluLayer (“名字”“Relu1”) fullyConnectedLayer (1,“名字”“BaselineFC2”“BiasLearnRateFactor”, 0)];%为批评家设置一些训练选项baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%创建基于网络逼近器的评论家基线= rlValueRepresentation (baselineNetwork obsInfo,“观察”, {“状态”}, baselineOpts);

策略梯度代理使用rlStochasticActorRepresentation.对于连续行动空间的随机行动者,只能使用神经网络作为潜在的近似器。

观察输入(这里调用myobs)必须接受二维向量,如obsInfo.输出(这里调用myact)也必须是一个二维向量(是中指定维数的两倍actInfo).输出向量的元素依次表示每个动作的所有平均值和所有标准差(在这种情况下只有一个平均值和一个标准差)。

标准差必须是非负的,而平均值必须在输出范围内,这意味着网络必须有两条独立的路径。第一个路径是均值,任何输出非线性都必须进行缩放,以便在输出范围内产生输出。第二种方法是用于方差,您必须使用一个softplus或relu层来强制执行非负性。

%输入路径层(2 × 1输入,1 × 1输出)inPath = [imageInputLayer([obsInfo. info])]尺寸1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer (10“名字”“ip_fc”% 10 × 1输出reluLayer (“名字”“ip_relu”%非线性fullyConnectedLayer (1,“名字”“ip_out”));% 1 × 1输出%路径层的平均值(1 × 1输入和1 × 1输出)%使用scalingLayer缩放范围meanPath = [fulllyconnectedlayer (15,“名字”“mp_fc1”% 15 × 1输出reluLayer (“名字”“mp_relu”%非线性fullyConnectedLayer (1,“名字”“mp_fc2”);% 1 × 1输出tanhLayer (“名字”的双曲正切);%输出范围:(-1,1)scalingLayer (“名字”“mp_out”“规模”actInfo.UpperLimit)];%输出范围:(-2N,2N)%路径层的标准偏差(1 × 1输入和输出)%使用softplus层使其非负sdevPath = [fulllyconnectedlayer (15,“名字”“vp_fc1”% 15 × 1输出reluLayer (“名字”“vp_relu”%非线性fullyConnectedLayer (1,“名字”“vp_fc2”);% 1 × 1输出softplusLayer (“名字”“vp_out”));%输出范围:(0,+Inf)%连接两个输入(沿维度#3)以形成单个(2 × 1)输出层支出= concatenationLayer (3 2“名字”“mean&sdev”);%添加图层到layerGraph网络对象actorNet = layerGraph (inPath);actorNet = addLayers (actorNet meanPath);actorNet = addLayers (actorNet sdevPath);actorNet = addLayers (actorNet,支出);%连接层:平均值路径输出必须连接到连接层的第一个输入actorNet = connectLayers (actorNet,“ip_out”“mp_fc1 /”);%连接inPath的输出到meanPath输入actorNet = connectLayers (actorNet,“ip_out”“vp_fc1 /”);%连接inPath输出到variancePath输入actorNet = connectLayers (actorNet,“mp_out”“mean&sdev /三机一体”);%连接输出的meanPath到mean&sdev输入#1actorNet = connectLayers (actorNet,“vp_out”“mean&sdev / in2”);%连接sdevPath的输出意味着&sdev输入#2%的阴谋网络情节(actorNet)

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

为行动者指定一些选项,并使用深度神经网络创建随机行动者表示actorNet

%为actor设置一些选项actorOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);%创建基于网络逼近器的参与者演员= rlStochasticActorRepresentation (actorNet obsInfo actInfo,...“观察”, {“状态”}, actorOpts);

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

agentOpts = rlPGAgentOptions (...“UseBaseline”,真的,...“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts)
agent = rlPGAgent with properties: AgentOptions: [1x1 rl.option.rlPGAgentOptions]

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

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

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

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

env = rlPredefinedEnv (“DoubleIntegrator-Discrete”);

获得观察和规格信息。

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

创建一个批评家表示来作为基线。为评论家创建一个循环神经网络,使用sequenceInputLayer作为输入层,并包含lstmLayer作为其他网络层之一。

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

为评论家设置一些选项。

baselineOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);

创建基于网络逼近器的评论家。

基线= rlValueRepresentation (baselineNetwork obsInfo,“观察”, {“myobs”}, baselineOpts);

创建一个参与者表示。既然评论家有一个循环网络,行动者也必须有一个循环网络。

为行动者定义一个递归神经网络。

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

设置参与者选项并创建参与者。

actorOpts = rlRepresentationOptions (“LearnRate”, 5 e - 3,“GradientThreshold”1);演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“myobs”}, actorOpts);

指定代理选项,并使用环境、参与者和评论家创建PG代理。

agentOpts = rlPGAgentOptions (...“UseBaseline”,真的,...“DiscountFactor”, 0.99);代理= rlPGAgent(演员、基线、agentOpts);

对于带有循环神经网络的PG agent,训练序列长度为整个事件。

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

getAction(代理,{obsInfo.Dimension})
ans =1×1单元阵列{[0]}

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

提示

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

介绍了R2019a