主要内容

训练PPO代理人降落火箭

这个例子展示了如何训练一个具有离散动作空间的近端策略优化(PPO)代理来让火箭着陆。有关PPO代理的更多信息,请参见近端策略优化代理

环境

本例中的环境是一个三自由度火箭,由一个有质量的圆盘表示。火箭有两个推进器用于向前和旋转运动。重力垂直向下作用,没有空气阻力。训练目标是使机器人在指定位置降落在地面上。

对于这种环境:

  • 火箭的运动范围为X(水平轴)-100 ~ 100米,Y(垂直轴)0 ~ 120米。

  • 目标位置为(0,0)米,目标方向为0弧度。

  • 每个推进器的最大推力为8.5牛。

  • 采样时间为0.1秒。

  • 来自环境的观测是火箭的位置 x y 、方向 θ 、速度 x ˙ y ˙ ,角速度 θ ˙ ,传感器读数检测粗着陆(-1),软着陆(1)或机载(0)条件。观测值在-1和1之间归一化。

  • 在每一集的开头,火箭从一个随机的首字母开始 x 位置和方向。高度总是重置为100米。

  • 奖励 r t 在时间步中提供 t 如下所示。

r t 年代 t - 年代 t - 1 - 0 1 θ t 2 - 0 01 l t 2 + R t 2 + 500 c 年代 t 1 - d ˆ t + v ˆ t 2 c y t 0 y ˙ t - 0 5 | x ˙ t | 0 5

在这里:

  • x t y t x ˙ t , y ˙ t 是火箭沿x轴和y轴的位置和速度。

  • d ˆ t x t 2 + y t 2 / d 马克斯 是火箭到目标位置的归一化距离。

  • v ˆ t x t ˙ 2 + y t ˙ 2 / v 马克斯 是火箭的标准化速度。

  • d 马克斯 而且 v 马克斯 是最大距离和速度。

  • θ t 是相对于纵轴的方向。

  • l t 而且 R t 是左右推进器的动作值。

  • c 在水平和垂直速度小于0.5米/秒的情况下,软着陆是一种稀疏奖励。

创建MATLAB环境

为火箭着陆器创建一个MATLAB环境RocketLander类。

env = RocketLander;

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

actionInfo = getActionInfo(env);observationInfo = getObservationInfo(env);numObs = observationInfo.Dimension(1);numAct = numel(actionInfo.Elements);

为环境设置采样时间

Ts = 0.1;

固定随机生成器种子的再现性。

rng (0)

创建PPO代理

本例中的PPO代理在离散操作空间上操作。在每个时间步中,代理选择以下离散动作对之一。

l l - 没有什么 l - 正确的 地中海 l H - 正确的 l - 地中海 - 地中海 + 正确的 地中海 H - 地中海 + 正确的 H l - H - + 正确的 地中海 H H - + 正确的

在这里, l 0 0 0 5 而且 H 1 0 是每个推进器的标准化推力值。

为了估计策略函数和价值函数,智能体为行动者和评论家维护函数逼近器,使用深度神经网络建模。训练可以对初始网络权重和偏差敏感,结果可以随着不同的值集而变化。在本例中,网络权重被随机初始化为较小的值。

创建具有六个输入和一个输出的评论家深度神经网络。评论家网络的输出是输入观察的贴现长期奖励。

criticclayersizes = [400 300];actorLayerSizes = [400 300];criticNetwork = [featureInputLayer(numObs,“归一化”“没有”“名字”“观察”) fullyConnectedLayer (criticLayerSizes (1),“名字”“CriticFC1”...“重量”,√2 / numObs) *(兰德(criticLayerSizes (1) numObs) -0.5),...“偏见”1 e - 3 * 1 (criticLayerSizes (1), 1)) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (criticLayerSizes (2),“名字”“CriticFC2”...“重量”,√2 / criticLayerSizes(1)) *(兰德(criticLayerSizes (2), criticLayerSizes (1)) -0.5),...“偏见”1 e - 3 * 1 (criticLayerSizes (2), 1)) reluLayer (“名字”“CriticRelu2”) fullyConnectedLayer (1,“名字”“CriticOutput”...“重量”,√2 / criticLayerSizes(2)) *(兰德(1,criticLayerSizes (2)) -0.5),...“偏见”1 e - 3)];临界网络= dlnetwork(临界网络);

创建评价值函数。

criticOpts = rlOptimizerOptions(“LearnRate”1的军医);rlValueFunction(criticNetwork,observationInfo);

使用具有六个输入和两个输出的深度神经网络创建参与者。行动者网络的输出是采取每个可能的动作对的概率。每个动作对包含每个推进器的规范化动作值。环境一步函数缩放这些值以确定实际的推力值。

actorNetwork = [featureInputLayer(numObs,“归一化”“没有”“名字”“观察”) fullyConnectedLayer (actorLayerSizes (1),“名字”“ActorFC1”...“重量”,√2 / numObs) *(兰德(actorLayerSizes (1) numObs) -0.5),...“偏见”1 e - 3 * 1 (actorLayerSizes (1), 1)) reluLayer (“名字”“ActorRelu1”) fullyConnectedLayer (actorLayerSizes (2),“名字”“ActorFC2”...“重量”,√2 / actorLayerSizes(1)) *(兰德(actorLayerSizes (2), actorLayerSizes (1)) -0.5),...“偏见”1 e - 3 * 1 (actorLayerSizes (2), 1)) reluLayer (“名字”“ActorRelu2”) fullyConnectedLayer (numAct“名字”“行动”...“重量”,√2 / actorLayerSizes(2)) *(兰德(numAct, actorLayerSizes (2)) -0.5),...“偏见”1 e - 3 * 1 (numAct 1)) softmaxLayer (“名字”“actionProb”));actorNetwork = dlnetwork(actorNetwork);

使用离散类别参与者创建参与者。

actorOpts = rlOptimizerOptions(“LearnRate”1的军医);actor = rlDiscreteCategoricalActor(actorNetwork,observationInfo,actionInfo);

属性指定代理超参数rlPPOAgentOptions对象。

agentOpts = rlPPOAgentOptions(...“ExperienceHorizon”, 600,...“ClipFactor”, 0.02,...“EntropyLossWeight”, 0.01,...“ActorOptimizerOptions”actorOpts,...“CriticOptimizerOptions”criticOpts,...“NumEpoch”3,...“AdvantageEstimateMethod”gae的...“GAEFactor”, 0.95,...“SampleTime”Ts,...“DiscountFactor”, 0.997);

对于这些超参数:

  • 智能体收集经验,直到达到600步的经验视界或插曲终止,然后从128个经验的小批量中训练3个epoch。

  • 为了提高训练稳定性,使用目标函数剪辑因子0.02。

  • 贴现因子值为0.997鼓励长期奖励。

  • 通过使用GAE因子为0.95的广义优势估计方法来减少临界输出中的方差。

  • EntropyLossWeight0.01项增强了训练过程中的探索能力。

创建PPO代理。

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

火车代理

要培训PPO代理,请指定以下培训选项。

  • 训练不超过20000集,每集时间不超过600步。

  • 当连续100集的平均奖励为430或更多时停止训练。

  • 每集奖励为700或更多时,保存一份代理副本。

trainOpts = rlTrainingOptions(...“MaxEpisodes”, 20000,...“MaxStepsPerEpisode”, 600,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, 430,...“ScoreAveragingWindowLength”, 100,...“SaveAgentCriteria”“EpisodeReward”...“SaveAgentValue”, 700);

培训代理使用火车函数。由于环境的复杂性,训练过程是计算密集型的,需要几个小时才能完成。为了在运行此示例时节省时间,请通过设置加载预训练的代理doTraining

doTraining = false;如果doTraining trainingStats = train(agent,env,trainOpts);其他的负载(“rocketLanderAgent.mat”);结束

下面是一个示例培训课程。由于训练过程的随机性,实际结果可能会有所不同。

模拟

绘制火箭着陆器环境以可视化模拟。

情节(env)

在环境中模拟训练过的代理。有关代理模拟的详细信息,请参见rlSimulationOptions而且sim卡

simOptions = rlSimulationOptions(“MaxSteps”, 600);simOptions。NumSimulations = 5;%模拟环境5次experience = sim(env,agent,simOptions);

{

另请参阅

|

相关的话题