主要内容

rlPPOAgent

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

描述

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

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

创建

描述

根据观察和行动规格创建代理

例子

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

例子

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

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

例子

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

指定代理选项

例子

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

输入参数

全部展开

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

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

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

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

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

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

代理初始化选项,指定为rlAgentInitializationOptions对象。

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

你的角色表示可以使用循环神经网络作为它的函数逼近器。在这种情况下,你的评论家还必须使用循环神经网络。有关示例,请参见利用循环神经网络创建PPO Agent

评论家网络表示,用于估计贴现长期奖励,指定为rlValueRepresentation.有关创建评论家表示的更多信息,请参见创建策略和值函数表示

你的评论家表示可以使用循环神经网络作为它的函数逼近器。在这种情况下,您的参与者还必须使用循环神经网络。有关示例,请参见利用循环神经网络创建PPO Agent

属性

全部展开

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

对象的功能

火车 在指定的环境中训练强化学习代理
sim卡 在指定的环境中模拟训练好的强化学习代理
getAction 从给定环境观察的代理或参与者表示中获取动作
getActor 从强化学习代理中获得参与者表示
setActor 设置强化学习代理的参与者表示
getCritic 从强化学习代理中获得评论家表示
setCritic 设置强化学习代理的批评表示
generatePolicyFunction 创建评估强化学习代理训练策略的函数

例子

全部折叠

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

负载百分比预定义环境环境= rlPredefinedEnv(“SimplePendulumWithImage-Discrete”);

从环境中获取观察和操作规范。

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

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

% rng (0)

根据环境观察和操作规范创建PPO代理。

agent = rlPPOAgent(obsInfo,actInfo);

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

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

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

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

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

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

initOpts = rlAgentInitializationOptions“NumHiddenUnit”, 128);

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

% rng (0)

根据环境观察和操作规范创建PPO actor-批评家代理。

agent = rlPPOAgent(obsInfo,actInfo,initOpts);

降低评论家学习率为1e-3。

批评家= get批评家(代理);critical . options . learnrate = 1e-3;agent = set批评家(代理,评论家);

从行动者和评论家中提取深度神经网络。

actorNet = getModel(代理);criticNet = getModel(get批评家(代理));

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

criticNet。层
ans = 11x1带有图层的图层数组:1“input_1”图像输入50 x50x1图片2 conv_1卷积64 3 x3x1旋转步[1]和填充[0 0 0 0]3‘relu_input_1 ReLU ReLU 4 fc_1完全连接128完全连接层5“input_2”功能输入1功能6 fc_2完全连接128完全连接层7的concat串联连接2输入沿着维度1 8 ' relu_body ReLU ReLU 9“fc_body”完全连接128完全连接层10“body_output”ReLU ReLU 11“输出”完全连接1完全连接层

情节演员和评论家网络

情节(layerGraph (actorNet))

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

情节(layerGraph (criticNet))

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

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

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

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

创建环境接口,获取其观察和操作规范。

环境= rlPredefinedEnv(“CartPole-Discrete”);obsInfo = getObservationInfo(env);actInfo = getActionInfo(env);

创建一个评论家代表。

在评论中创建网络作为近似器。。criticNetwork = [featureInputLayer(4,“归一化”“没有”“名字”“状态”) fullyConnectedLayer (1,“名字”“CriticFC”));为评论家设置选项。criticOpts = rlRepresentationOptions(“LearnRate”, 8 e - 3,“GradientThreshold”1);创造一个批评家。评论= rlValueRepresentation(批评网络,obsInfo,“观察”,{“状态”}, criticOpts);

创建一个参与者表示。

在参与者中创建用于近似器的网络。actorNetwork = [featureInputLayer(4,“归一化”“没有”“名字”“状态”) fullyConnectedLayer (2“名字”“行动”));为参与者设置选项。actorOpts = rlRepresentationOptions(“LearnRate”, 8 e - 3,“GradientThreshold”1);创建参与者。actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...“观察”,{“状态”}, actorOpts);

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

agentOpts = rlPPOAgentOptions(...“ExperienceHorizon”, 1024,...“DiscountFactor”, 0.95);agent = rlPPOAgent(actor,批评家,agentOpts)
agent = rlPPOAgent with properties: AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

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

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

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

环境= rlPredefinedEnv(“DoubleIntegrator-Continuous”);obsInfo = getObservationInfo(env)
obsInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"states"描述:"x, dx"维度:[2 1]数据类型:"double"
getActionInfo(env)
actInfo = rlNumericSpec with properties: LowerLimit: -Inf UpperLimit: Inf名称:"force"描述:[0x0 string]维度:[1 1]数据类型:"double"

由于动作必须包含在一个有限的范围内,所以相应地设置动作信号的上限和下限。当参与者的网络表示具有非线性输出层时,必须这样做,该输出层必须缩放以产生所需范围内的输出。

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

创建一个评论家代表。PPO代理商使用rlValueRepresentation对于评论家来说。对于连续的观察空间,你可以使用深度神经网络或自定义基表示。对于这个例子,创建一个深度神经网络作为底层逼近器。

创建网络作为近似器在评论家。它必须将观测信号作为输入,并产生一个标量值criticNet = [imageInputLayer([obsInfo.]尺寸1],“归一化”“没有”“名字”“状态”) fullyConnectedLayer (10“名字”“fc_in”) reluLayer (“名字”“relu”) fullyConnectedLayer (1,“名字”“出”));为评论家设置一些培训选项。criticOpts = rlRepresentationOptions(“LearnRate”, 8 e - 3,“GradientThreshold”1);从网络中创建评论家表示评论= rlValueRepresentation(批评网,obsInfo,“观察”,{“状态”}, criticOpts);

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

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

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

%输入路径层(2 × 1输入和1 × 1输出)inPath = [imageInputLayer([obsInfo. layer]]尺寸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输入和输出)%使用软加图层使它非负sdevPath = [fullyConnectedLayer(15,“名字”“vp_fc1”% 15 * 1输出reluLayer (“名字”“vp_relu”%非线性fullyConnectedLayer (1,“名字”“vp_fc2”);% 1 * 1输出softplusLayer (“名字”“vp_out”));%输出范围:(0,+Inf)连接两个输入(沿维度#3)以形成单个(2 × 1)输出层outLayer = concatenationLayer(1,2,“名字”“mean&sdev”);将图层添加到layerGraph网络对象actorNet = layerGraph(inPath);actorNet = addLayers(actorNet,meanPath);actorNet = addLayers(actorNet,sdevPath);actorNet = addLayers(actorNet,outLayer);%连接层:必须将平均值路径连接到连接层的第一个输入actorNet = connectLayers(actorNet,“ip_out”“mp_fc1 /”);连接inPath输出到meanPath输入actorNet = connectLayers(actorNet,“ip_out”“vp_fc1 /”);连接inPath输出到sdevPath输入actorNet = connectLayers(actorNet,“mp_out”“mean&sdev /三机一体”);%连接meanPath输出到mean&sdev输入#1actorNet = connectLayers(actorNet,“vp_out”“mean&sdev / in2”);%连接sdevPath输出到mean&sdev输入#2百分比图网络情节(actorNet)

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

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

为演员设置一些训练选项。actorOpts = rlRepresentationOptions(“LearnRate”, 8 e - 3,“GradientThreshold”1);使用网络创建参与者actor = rlStochasticActorRepresentation(actorNet,obsInfo,actInfo,...“观察”,{“状态”}, actorOpts);

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

agentOpts = rlPPOAgentOptions(...“ExperienceHorizon”, 1024,...“DiscountFactor”, 0.95);agent = rlPPOAgent(actor,批评家,agentOpts)
agent = rlPPOAgent with properties: AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

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

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

类所使用的预定义环境训练DQN人员平衡车杆系统的例子。

环境= rlPredefinedEnv(“CartPole-Discrete”);

获取观察和行动信息。该环境具有连续的四维观测空间(车和杆的位置和速度)和离散的一维作用空间,由两种可能的力(-10N或10N)的应用组成。

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

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

criticNetwork = [sequenceInputLayer(obsInfo.Dimension(1),“归一化”“没有”“名字”“myobs”) fullyConnectedLayer (8,“名字”“俱乐部”) reluLayer (“名字”“relu”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) fullyConnectedLayer (1,“名字”“输出”));

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

criticOptions = rlRepresentationOptions(“LearnRate”1飞行,“GradientThreshold”1);评论= rlValueRepresentation(批评网络,obsInfo,...“观察”“myobs”, criticOptions);

为参与者定义一个循环神经网络。既然评论家有一个循环网络,那么演员也一定有一个循环网络。

actorNetwork = [sequenceInputLayer(obsInfo.Dimension(1),“归一化”“没有”“名字”“myobs”) fullyConnectedLayer (8,“名字”“俱乐部”) reluLayer (“名字”“relu”) lstmLayer (8,“OutputMode”“序列”“名字”“lstm”) fullyConnectedLayer(元素个数(actInfo.Elements),“名字”“输出”) softmaxLayer (“名字”“actionProb”));

为网络创建一个随机角色表示。

actorOptions = rlRepresentationOptions(“LearnRate”1 e - 3,“GradientThreshold”1);actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...“观察”“myobs”, actorOptions);

创建代理选项对象。

agentOptions = rlPPOAgentOptions(...“AdvantageEstimateMethod”“finite-horizon”...“ClipFactor”, 0.1);

当使用循环神经网络时MiniBatchSize属性是学习轨迹的长度。

agentOptions。MiniBatchSize
Ans = 128

使用参与者和评论家表示以及代理选项对象创建代理。

agent = rlPPOAgent(actor,批评家,agentOptions);

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

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

提示

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

  • 对于PPO智能体,调优行为体网络的学习率是必要的,而对于TRPO智能体,则不需要调优。

R2019b引入