主要内容

rlppoagent.

近端政策优化强化学习代理

描述

近端策略优化(PPO)是一种无模型、在线、基于策略的策略梯度强化学习方法。该算法通过环境交互作用采样数据和使用随机梯度下降优化裁剪的代理目标函数之间进行交替。动作空间可以是离散的,也可以是连续的。

有关PPO代理的更多信息,请参见近端政策优化代理.有关不同类型的强化学习代理的更多信息,请参见强化学习代理

创建

描述

从观察和操作规范中创建代理

例子

代理= rlPPOAgent (observationInfoactionInfo的)使用默认初始化选项,为具有给定观察和操作规范的环境创建近端策略优化(PPO)代理。代理中的行动者和批评者表示使用从观察规范构建的默认深度神经网络observationInfo以及动作规范actionInfo

例子

代理= rlPPOAgent (observationInfoactionInfoinitOpts的)为具有给定观察和动作规范的环境创建PPO代理。属性中指定的选项配置的默认网络initOpts对象。行动者-评论家代理不支持递归神经网络。金宝app有关初始化选项的更多信息,请参见rlAgentInitializationOptions

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

代理= rlPPOAgent (演员评论家的)使用代理的默认选项,创建具有指定参与者和评论家的PPO代理。

指定代理选项

例子

代理= rlPPOAgent (___代理选项的)创建PPO代理并设置AgentOptions财产到代理选项输入参数。在前面语法中的任何输入参数之后使用此语法。

输入参数

全部展开

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

你可以提取observationInfo来自现有环境或代理商使用getObservationInfo.您还可以使用以下方法手工构造规范rlFiniteSetSpecrlnumericspec.

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

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

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

你可以提取actionInfo来自现有环境或代理商使用getActionInfo.您还可以使用手动构造规范rlFiniteSetSpecrlnumericspec.

的代理初始化选项rlAgentInitializationOptions对象。

策略的演员网络表示,指定为rlStochasticActorRepresentation对象。有关创建角色表示的更多信息,请参见创建策略和价值功能表示

您的演员表示可以使用经常性神经网络作为其功能近似器。在这种情况下,您的评论家还必须使用经常性的神经网络。例如,看到利用递归神经网络创建PPO Agent

评论家网络表示估计折扣的长期奖励,指定为rlValueRepresentation.有关创建批评批评意见的更多信息,请参阅创建策略和价值功能表示

你的评论表示可以使用递归神经网络作为函数近似器。在这种情况下,参与者还必须使用递归神经网络。例如,看到利用递归神经网络创建PPO Agent

属性

全部展开

代理选项,指定为一个rlppoagentoptions.对象。

对象功能

火车 在指定环境中列车加固学习代理
SIM 在指定的环境中模拟训练过的强化学习代理
getAction 从代理商或演员代表获取行动给定环境观察
工作者 从强化学习代理中获得角色表示
setActor. 设置强化学习主体的主体表示
getCritic 从强化学习代理获得批判表示
setcritic. 集合强化学习代理的批判表示
generatePolicyFunction 创建评估强化学习代理的训练策略的函数

例子

全部折叠

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

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

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

% rng (0)

根据环境观察和行动规范创建一个演员-评论家代理。

代理= rlppoagent(Obsinfo,Actinfo);

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

GetAction(代理,{rand(Obsinfo(1).dimile),兰特(Obsinfo(2).dimension)})
ANS =.1 x1单元阵列{[2]}

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

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

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

创建一个代理初始化选项对象,指定网络中每个隐藏的完全连接层必须具有128神经元(而不是默认的数字,256).

initOpts = rlAgentInitializationOptions (“NumHiddenUnit”,128);

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

% rng (0)

从环境观察和行动规范中创建一个PPO演员代理代理。

代理= rlPPOAgent (obsInfo actInfo initOpts);

将批判学习率降低到1e-3。

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

从主体、行动者和批评者中提取深度神经网络。

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

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

批评
ans = 12x1 Layer array with layers: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完全连接10 'fc_2' fully connected 128 fully connected layer 11 'output' fully connected 1 fully connected layer 12 'RepresentationLoss' Regression output mean-平方误差

情节演员和评论家网络

情节(actorNet)

情节(批评)

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

GetAction(代理,{rand(Obsinfo(1).dimile),兰特(Obsinfo(2).dimension)})
ANS =.1 x1单元阵列{[0.9228]}

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

创建一个环境界面,并获取其观察和操作规范。

ent = rlpredefinedenv(“CartPole-Discrete”);obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);

创造批评者代表。

%在批评家中创建网络作为近似器使用。批判性= [featureInputLayer(4,“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (1,'姓名''批评'));%设置批评家的选项。criticOpts = rlRepresentationOptions ('学习', 8 e - 3,'gradientthreshold'1);创造批评家。评论家= rlValueRepresentation (criticNetwork obsInfo,“观察”, {“状态”}, criticOpts);

创建一个参与者表示。

%在参与者中创建网络作为近似器使用。[featureInputLayer(4,“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (2'姓名''行动'));%设置角色的选项。ACTOROPTS = RLREPRESENTATIONOPTIONS('学习', 8 e - 3,'gradientthreshold'1);%创建演员。演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”, {“状态”},actoropts);

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

agentOpts = rlPPOAgentOptions (...“ExperienceHorizon”, 1024,...“DiscountFactor”, 0.95);代理= rlPPOAgent(演员、评论家、agentOpts)
agent = rlPPOAgent with properties: AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

getAction(代理,{兰德(4,1)})
ANS =.1 x1单元阵列{[-10]}

现在可以根据环境测试和培训代理。

创造一个具有连续动作空间的环境,并获得其观察和动作规范。对于本例,加载本例中使用的双积分器连续动作空间环境火车DDPG代理控制双积分系统.从环境中观察到的是一个包含质量的位置和速度的矢量。作用是一个标量,表示作用于物体上的力,从-开始连续变化22牛顿。

ent = 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)
属性:LowerLimit: -Inf UpperLimit: Inf Name: "force" Description: [0x0 string] Dimension: [1 1] DataType: "double"

由于该动作必须包含在有限范围内,因此相应地设置动作信号的上限和下限是一个好主意。当Actor的网络表示具有非线性输出层时必须完成,而不是相应地缩放以在所需范围内产生输出。

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

创造批评者代表。PPO代理使用rlValueRepresentation评论家。对于连续观测空间,可以使用深度神经网络或自定义基表示。对于本例,创建一个深度神经网络作为底层近似器。

%创建网络以在评论家中用作近似器%它必须将观察信号作为输入作为输入并产生标量值[errorcode] [errorcode]错误码尺寸1],“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (10'姓名'“fc_in”)剥离('姓名'“relu”) fullyConnectedLayer (1,'姓名''出去'));为评论家设置一些训练选项criticOpts = rlRepresentationOptions ('学习', 8 e - 3,'gradientthreshold'1);%从网络中创建批评家表示评论家= rlValueRepresentation (criticNet obsInfo,“观察”, {“状态”}, criticOpts);

PPO代理使用rlStochasticActorRepresentation.对于连续动作空间,随机参与者只能使用神经网络近似器。

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

标准偏差必须是非负的事实,而平均值必须落在输出范围内,这意味着网络必须具有两个单独的路径。第一路径用于平均值,并且必须缩放任何输出非线性,以便它可以在输出范围内产生输出。第二条路径用于标准偏差,您必须使用SoftPlus或Relu层来强制非负性。

%输入路径层(2乘1输入和1乘1输出)inPath = [imageInputLayer([obsInfo. inPath])]尺寸1],“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (10'姓名'“ip_fc”的)% 10 × 1输出Rululayer('姓名'“ip_relu”的)%非线性fullyConnectedLayer (1,'姓名'“ip_out”));%1乘1输出平均值的%路径层(1乘1输入,1乘1输出)%使用scalingLayer来扩展范围meanPath = [fulllyconnectedlayer (15,'姓名'“mp_fc1”的)%15乘1输出Rululayer('姓名'“mp_relu”的)%非线性fullyConnectedLayer (1,'姓名'“mp_fc2”);%1乘1输出tanhLayer ('姓名'的双曲正切);%输出范围:(-1,1)scalingLayer ('姓名''mp_out'“规模”,Actinfo.upperlimit)];%输出范围:(-2N,2N)%路径层的标准偏差(1 × 1输入和输出)%使用软加层使其非负sdevPath = [fulllyconnectedlayer (15,'姓名'“vp_fc1”的)%15乘1输出Rululayer('姓名'“vp_relu”的)%非线性fullyConnectedLayer (1,'姓名'“vp_fc2”);%1乘1输出softplusLayer ('姓名'“vp_out”));%输出范围:(0,+Inf)将两个输入(沿维度#3)连接起来,形成单个(2 × 1)输出层Outlayer = ConcatenationLayer(3,2,'姓名'“mean&sdev”);添加层到layerGraph网络对象actorNet = layerGraph (inPath);actorNet = addLayers (actorNet meanPath);actorNet = addLayers (actorNet sdevPath);actorNet = addLayers (actorNet,支出);连接层:平均值路径输出必须连接到连接层的第一个输入ActorNet = ConnectLayers(ActorRornet,“ip_out”“mp_fc1 /”);%连接inPath的输出到meanPath的输入ActorNet = ConnectLayers(ActorRornet,“ip_out”“vp_fc1 /”);%连接inPath输出到sdevPath输入ActorNet = ConnectLayers(ActorRornet,'mp_out'“mean&sdev /三机一体”);意味着意思和Sdev输入#1%Connect输出ActorNet = ConnectLayers(ActorRornet,“vp_out”“mean&sdev / in2”);%连接sdevPath的输出到mean&sdev input #2%的阴谋网络情节(actorNet)

指定演员的一些选项,并使用深神经网络创建随机演员表示actorNet

%为演员设置一些培训选项ACTOROPTS = RLREPRESENTATIONOPTIONS('学习', 8 e - 3,'gradientthreshold'1);使用网络创建参与者演员= rlStochasticActorRepresentation (actorNet obsInfo actInfo,...“观察”, {“状态”},actoropts);

指定代理选项,并使用actor、评论家和代理选项创建PPO代理。

agentOpts = rlPPOAgentOptions (...“ExperienceHorizon”, 1024,...“DiscountFactor”, 0.95);代理= rlPPOAgent(演员、评论家、agentOpts)
agent = rlPPOAgent with properties: AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

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

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

创造一个环境,并获得观察和行动信息。

ent = rlpredefinedenv('cartpole-collite');obsInfo = getObservationInfo (env);actInfo = getActionInfo (env);numObs = obsInfo.Dimension (1);numDiscreteAct =元素个数(actInfo.Elements);

为评论家创建一个循环深度神经网络。要创建递归神经网络,请使用sequenceInputLayer作为输入层,并包含lstmLayer作为其他网络层之一。

criticNetwork = [sequenceInputLayer(nummobs,“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (8,'姓名'“俱乐部”)剥离('姓名'“relu”)LSTMLAYER(8,“OutputMode”'序列''姓名'“lstm”) fullyConnectedLayer (1,'姓名''输出'));

为批评家创建一个值函数表示对象。

criticOptions = rlRepresentationOptions ('学习'1飞行,'gradientthreshold'1);评论家= rlValueRepresentation (criticNetwork obsInfo,...“观察”“状态”, criticOptions);

类似地,为演员定义反复性神经网络。

actorNetwork = [sequenceInputLayer(nummob,“归一化”'没有任何''姓名'“状态”) fullyConnectedLayer (8,'姓名'“俱乐部”)剥离('姓名'“relu”)LSTMLAYER(8,“OutputMode”'序列''姓名'“lstm”)全连接列(NumDiscreteAct,'姓名''输出')softmaxlayer('姓名'“actionProb”));

为网络创建一个随机参与者表示。

actorOptions = rlRepresentationOptions ('学习'1 e - 3,'gradientthreshold'1);演员= rlStochasticActorRepresentation (actorNetwork obsInfo actInfo,...“观察”“状态”,ActorOptions);

使用演员和批评者表示创建PPO代理。

代理选项= rlppoagentoptions(...“AdvantageEstimateMethod”“finite-horizon”...“ClipFactor”,0.1);代理= rlppoagent(演员,批评者,代理选项);

提示

  • 对于连续操作空间,该代理不会强制操作规范设置的约束。在这种情况下,您必须在环境中强制操作空间约束。

介绍在R2019B.