主要内容

火车

在指定的环境中训练强化学习代理

描述

trainStats=火车(env代理使用默认训练选项在指定环境中训练一个或多个强化学习代理。虽然代理是一个输入参数,在每次训练之后,火车中指定的每个代理的参数代理最大化他们从环境中获得的长期回报。当培训结束时,代理反映每个代理在最后一个训练集结束时的状态。

trainStats=火车(代理env执行与前面语法相同的训练。

例子

env=火车(___trainOpts火车代理env,使用训练选项对象trainOpts.使用训练选项指定训练参数,例如终止训练的标准、何时保存代理、要训练的最大集数以及每集的最大步数。在前面语法中的任何输入参数之后使用此语法。

例子

全部折叠

中配置的座席进行培训训练PG代理人平衡车杆系统示例,在相应的环境中。从环境中观测到的是一个矢量,其中包含了小车的位置和速度,以及杆子的角度位置和速度。该动作是一个有两个可能元素的标量(施加在推车上的力为-10或10牛顿)。

加载包含环境和已为其配置的PG代理的文件。

负载RLTrainExample.mat

使用指定一些训练参数rlTrainingOptions.这些参数包括训练的最大次数、每集的最大步数以及终止训练的条件。对于本例,最多使用1000集,每集500步。指示训练在前五集的平均奖励达到500时停止。创建一个默认选项集,并使用点表示法更改一些参数值。

trainOpts = rlTrainingOptions;trainOpts。MaxEpisodes = 1000;trainOpts。MaxStepsPerEpisode = 500;trainOpts。StopTrainingCriteria =“AverageReward”;trainOpts。StopTrainingValue = 500;trainOpts。ScoreAveragingWindowLength = 5;

在培训期间,火车命令可以保存结果良好的候选代理。进一步配置训练选项,当情节奖励超过500时保存一个代理。将代理保存到名为savedAgents

trainOpts。SaveAgentCriteria =“EpisodeReward”;trainOpts。SaveAgentValue = 500;trainOpts。SaveAgentDirectory =“savedAgents”

最后,关闭命令行显示。打开强化学习插曲管理器,这样您就可以直观地观察训练进度。

trainOpts。Verbose = false; trainOpts.Plots =“训练进步”

现在可以训练PG代理了。对于本例中使用的预定义的卡杆环境,您可以使用情节生成车杆系统的可视化。

情节(env)

当您运行此示例时,此可视化和强化学习集管理器都会随着每个训练集更新。将它们并排放在屏幕上观察进度,并训练代理。(这个计算可能需要20分钟或更长时间。)

trainingInfo = train(agent,env,trainOpts);

Episode Manager显示训练成功达到前五集平均奖励500的终止条件。在每次训练中,火车更新代理用上一集学到的参数。当训练结束时,您可以使用训练后的代理模拟环境来评估其性能。环境图在模拟期间更新,就像在训练期间一样。

simOptions = rlSimulationOptions(“MaxSteps”, 500);experience = sim(env,agent,simOptions);

在培训期间,火车将满足指定条件的任何代理保存到磁盘trainOps。SaveAgentCritera而且trainOpts。SaveAgentValue.要测试任何这些代理的性能,可以从指定的文件夹中的数据文件中加载数据trainOpts。SaveAgentDirectory,并使用该代理模拟环境。

本示例展示如何在Simulink®环境中设置多代理训练会话。金宝app在本例中,您训练两个代理协作执行移动对象的任务。

本例中的环境是一个无摩擦的二维表面,其中包含用圆表示的元素。目标物体C用半径为2米的蓝色圆表示,机器人A(红色)和B(绿色)用半径各为1米的小圆表示。机器人试图通过碰撞施加力将物体C移动到半径为8米的环外。环境中的所有元素都有质量并遵循牛顿运动定律。此外,单元与环境边界之间的接触力被建模为弹簧和质量阻尼器系统。通过在X和Y方向上施加外力,元件可以在表面上运动。在第三维中没有运动,系统的总能量是守恒的。

创建本示例所需的参数集。

rlCollaborativeTaskParams

打开Simulin金宝appk模型。

mdl =“rlCollaborativeTask”;open_system (mdl)

对于这种环境:

  • 二维空间在X和Y方向上都以-12米到12米为界。

  • 接触弹簧刚度为100 N/m,阻尼为0.1 N/m/s。

  • 这些代理共享A、B和C的位置、速度和上一个时间步骤的动作值的相同观测值。

  • 当对象C移动到圆环外时,模拟结束。

  • 在每一个时间步骤中,智能体得到如下奖励:

r 一个 r 全球 + r 当地的 一个 r B r 全球 + r 当地的 B r 全球 0 001 d c r 当地的 一个 - 0 005 d 交流 - 0 008 u 一个 2 r 当地的 B - 0 005 d 公元前 - 0 008 u B 2

在这里:

  • r 一个 而且 r B 分别为代理A和代理B收到的奖励。

  • r 全球 是一个团队奖励,当对象C靠近环的边界时,两个代理都会收到这个奖励。

  • r 当地的 一个 而且 r 当地的 B 是代理A和B根据它们与对象C的距离和从上一个时间步开始的动作的大小而受到的局部惩罚。

  • d C 是物体C到圆环中心的距离。

  • d 交流 而且 d 公元前 为agent A到对象C的距离,agent B到对象C的距离。

  • u 一个 而且 u B 为代理A和代理B在上一个时间步中的动作值。

本例使用带有离散动作空间的近端策略优化(PPO)代理。要了解更多关于PPO代理的信息,请参见近端策略优化代理.代理对机器人施加外力导致机器人运动。在每一个时间步骤中,智能体选择动作 u 一个 B F X F Y ,在那里 F X F Y 是下列两对外力之一。

F X - 1 0 N F Y - 1 0 N

F X - 1 0 N F Y 0

F X - 1 0 N F Y 1 0 N

F X 0 F Y - 1 0 N

F X 0 F Y 0

F X 0 F Y 1 0 N

F X 1 0 N F Y - 1 0 N

F X 1 0 N F Y 0

F X 1 0 N F Y 1 0 N

创建环境

要创建多代理环境,请使用字符串数组指定代理的块路径。另外,使用单元格数组指定观察和操作规范对象。单元格数组中的规范对象的顺序必须与块路径数组中指定的顺序匹配。当创建环境时,MATLAB工作空间中存在代理时,观察和操作规范数组是可选的。有关创建多代理环境的详细信息,请参见rl金宝appSimulinkEnv

为环境创建I/O规范。在本例中,代理是同构的,并且具有相同的I/O规范。

观测次数%numObs = 16;%动作次数numAct = 2;%外力最大值(N)maxF = 1.0;%每个代理的I/O规格oinfo = rlNumericSpec([numObs,1]);ainfo = rlFiniteSetSpec({[-maxF -maxF] [-maxF 0] [-maxF maxF] [0 -maxF] [0 maxF] [maxF -maxF] [maxF 0] [maxF maxF]});oinfo。Name =“观察”;ainfo。Name =“力量”

创建Simulink环金宝app境接口。

BLKS = [“rlCollaborativeTask /代理”“B rlCollaborativeTask /代理”];obsinfo = {oinfo,oinfo};actinfo = {ainfo,ainfo};env = rl金宝appSimulinkEnv(mdl,blks,obsInfos,actInfos);

为环境指定一个重置函数。复位功能resetRobots确保机器人在每一集开始时从随机的初始位置开始。

env。ResetFcn = @(in) resetRobots(in,RA,RB,RC,boundaryR);

创建代理

PPO代理依赖于参与者和评论家表征来学习最优策略。在本例中,代理为演员和评论家维护基于神经网络的函数逼近器。

创建评论家神经网络和表示。评论家网络的输出是状态值函数 V 年代 国家 年代

重置随机种子以提高再现性rng (0)%评论家网络criticNetwork = [...featureInputLayer (oinfo.Dimension (1),“归一化”“没有”“名字”“观察”) fullyConnectedLayer (128,“名字”“CriticFC1”“WeightsInitializer”“他”) reluLayer (“名字”“CriticRelu1”) fullyConnectedLayer (64,“名字”“CriticFC2”“WeightsInitializer”“他”) reluLayer (“名字”“CriticRelu2”) fullyConnectedLayer (32,“名字”“CriticFC3”“WeightsInitializer”“他”) reluLayer (“名字”“CriticRelu3”) fullyConnectedLayer (1,“名字”“CriticOutput”));%评论家陈述criticOpts = rlRepresentationOptions(“LearnRate”1的军医);criticA = rlValueRepresentation(criticNetwork,oinfo,“观察”, {“观察”}, criticOpts);criticB = rlValueRepresentation(criticNetwork,oinfo,“观察”, {“观察”}, criticOpts);

行动者网络的输出是概率 π 一个 | 年代 在特定的状态下采取每个可能的动作对 年代 .创建角色神经网络和表示。

%演员网络actorNetwork = [...featureInputLayer (oinfo.Dimension (1),“归一化”“没有”“名字”“观察”) fullyConnectedLayer (128,“名字”“ActorFC1”“WeightsInitializer”“他”) reluLayer (“名字”“ActorRelu1”) fullyConnectedLayer (64,“名字”“ActorFC2”“WeightsInitializer”“他”) reluLayer (“名字”“ActorRelu2”) fullyConnectedLayer (32,“名字”“ActorFC3”“WeightsInitializer”“他”) reluLayer (“名字”“ActorRelu3”) fullyConnectedLayer(元素个数(ainfo.Elements),“名字”“行动”) softmaxLayer (“名字”“SM”));%参与者表示actorOpts = rlRepresentationOptions(“LearnRate”1的军医);actorA = rlstocchasticactorrepresentation (actorNetwork,oinfo,ainfo,...“观察”, {“观察”}, actorOpts);actorB = rlstocchasticactorrepresentation (actorNetwork,oinfo,ainfo,...“观察”, {“观察”}, actorOpts);

创建代理。两个代理使用相同的选项。

agentOptions = rlPPOAgentOptions(...“ExperienceHorizon”, 256,...“ClipFactor”, 0.125,...“EntropyLossWeight”, 0.001,...“MiniBatchSize”, 64,...“NumEpoch”3,...“AdvantageEstimateMethod”gae的...“GAEFactor”, 0.95,...“SampleTime”Ts,...“DiscountFactor”, 0.9995);agentA = rlPPOAgent(actor,criticA,agentOptions);agentB = rlPPOAgent(actorB,criticB,agentOptions);

在训练过程中,agent收集经验,直到达到256步的经验视界或达到插曲终止,然后从64个经验的小批量中进行训练。本例使用目标函数剪辑因子0.125来提高训练稳定性,使用折扣因子0.9995来鼓励长期奖励。

培训代理商

指定以下培训选项来培训座席。

  • 运行训练最多1000集,每集最多持续5000个时间步。

  • 当一个智能体连续100集的平均奖励为-10或更多时停止训练。

maxEpisodes = 1000;maxSteps = 5e3;trainOpts = rlTrainingOptions(...“MaxEpisodes”maxEpisodes,...“MaxStepsPerEpisode”maxSteps,...“ScoreAveragingWindowLength”, 100,...“阴谋”“训练进步”...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -10);

要训练多个代理,请将代理数组指定为火车函数。数组中代理的顺序必须与创建环境时指定的代理块路径的顺序相匹配。这样做可以确保代理对象链接到环境中相应的I/O接口。训练这些代理可能需要几个小时才能完成,这取决于可用的计算能力。

MAT文件rlCollaborativeTaskAgents包含一组预先训练过的代理。您可以加载该文件并查看代理的性能。亲自训练探员,设置doTraining真正的

doTraining = false;如果doTraining stats = train([agentA, agentB],env,trainOpts);其他的负载(“rlCollaborativeTaskAgents.mat”);结束

下图显示了训练进度的快照。由于训练过程的随机性,你可以期待不同的结果。

模拟代理

在环境中模拟训练过的代理。

simOptions = rlSimulationOptions(“MaxSteps”, maxSteps);exp = sim(env,[agentA agentB],simOptions);

图多Agent协同任务包含一个坐标轴对象。axis对象包含5个矩形、文本类型的对象。

有关代理模拟的详细信息,请参见rlSimulationOptions而且sim卡

输入参数

全部折叠

要训练的代理,指定为强化学习代理对象,如rlACAgentrlDDPGAgent,或作为这样的对象的数组。

如果env是否创建多代理环境rl金宝appSimulinkEnv,将代理指定为数组。数组中代理的顺序必须与用于创建的代理顺序相匹配env.MATLAB不支持多代理仿真金宝app®环境。

请注意

火车更新代理在每次训练中。当培训结束时,代理反映每个代理在最后一个训练集结束时的状态。因此,由于不断的探索,最终agent获得的奖励不一定是在训练过程中获得的最高。为了在培训期间保存座席,可以创建rlTrainingOptions对象,指定SaveAgentCriteria而且SaveAgentValue属性并将其传递给火车作为一个trainOpts论点。

有关如何创建和配置用于强化学习的代理的详细信息,请参见强化学习代理

智能体活动的环境,指定为以下类型的强化学习环境对象之一:

  • 预定义的MATLAB或Simulink金宝app®使用rlPredefinedEnv.这种环境不支持同时训练多个代理。金宝app

  • 使用函数创建的自定义MATLAB环境,如rlFunctionEnvrlCreateEnvTemplate.这种环境不支持同时训练多个代理。金宝app

  • 用于创建的自定义S金宝appimulink环境rl金宝appSimulinkEnv.这种环境支持同时训练多个代理。金宝app

有关创建和配置环境的更多信息,请参见:

env是一个Si金宝appmulink环境,调用火车编译并模拟与环境相关的模型。

训练参数和选项,指定为rlTrainingOptions对象。使用此实参指定如下参数和选项:

  • 结束培训的标准

  • 保存候选代理的标准

  • 如何显示培训进度

  • 并行计算的选项

详细信息请参见rlTrainingOptions

输出参数

全部折叠

训练集数据,训练单个智能体时作为结构返回,训练多个智能体时作为结构数组返回。每个结构元素包含以下字段。

集数,作为列向量返回[1, 2,…;N],在那里N是训练运行中的集数。如果你想要绘制从一集到另一集的其他数量的演变,这个向量是有用的。

每一集的奖励,以长度的列向量返回N.每个条目都包含相应章节的奖励。

每一集的步数,以长度的列向量形式返回N.每个条目都包含相应情节中的步数。

中指定的平均窗口内的平均奖励trainOpts,作为长度的列向量返回N.每个条目都包含相应章节结束时计算的平均奖励。

智能体在训练中的总步数,作为长度的列向量返回N.每一项包含中各项的累积和EpisodeSteps到那时为止。

评论家使用当前代理和环境初始条件估计长期奖励,作为长度的列向量返回N.每个条目都是评论家估计(0)作为相应剧集的代理人。此字段仅用于具有批评者的代理,例如rlDDPGAgent而且rlDQNAgent

在为训练而进行的模拟中收集的信息,返回为:

  • 对于MATLAB环境中的训练,一个包含字段的结构SimulationError.这个字段是一个列向量,每集有一个条目。当StopOnError选择rlTrainingOptions“关闭”,每个条目包含在相应情节中发生的任何错误。

  • 对于Simulink环境中的训练金宝app,向量金宝app仿真软件。SimulationOutput包含在相应事件期间记录的模拟数据的对象。一个事件的记录数据包括任何信号和模型被配置为日志的状态、模拟元数据以及在相应事件期间发生的任何错误。

提示

  • 火车随着训练的进行更新代理。为了保留原始的代理参数供以后使用,请将代理保存到一个mat文件中。

  • 默认情况下,调用火车打开强化学习插曲管理器,它可以让你可视化训练的进度。插曲管理器图显示了每一集的奖励,一个运行的平均奖励值,以及评论家的估计0(对于有批评者的代理人)。插曲管理器还显示各种插曲和训练统计数据。若要关闭强化学习插曲管理器,请设置情节选择trainOpts“没有”

  • 如果使用具有可视化的预定义环境,则可以使用情节(env)使环境形象化。如果你打电话情节(env)在训练之前,然后在训练期间更新可视化,让您可以可视化每一集的进度。(对于自定义环境,必须实现自己的环境情节方法。)

  • 中规定的条件,培训终止trainOpts感到满意。若要终止正在进行的训练,请在“强化学习事件管理器”中单击停止训练.因为火车每集更新代理,您可以通过电话恢复培训火车(代理,env, trainOpts)同样,在不丢失第一次调用期间学习到的训练参数的情况下火车

  • 在培训期间,您可以保存满足指定条件的候选代理trainOpts.例如,您可以保存任何集奖励超过一定值的agent,即使总体上还不满足终止训练的条件。火车将保存的代理存储在指定文件夹中的mat文件中trainOpts.保存的代理可能很有用,例如,允许您测试在长时间运行的培训过程中生成的候选代理。保存条件和保存位置请参见rlTrainingOptions

算法

一般来说,火车执行以下迭代步骤:

  1. 初始化代理

  2. 每集:

    1. 重置环境。

    2. 获得初步观察结果年代0来自环境。

    3. 计算初始动作一个0μ年代0).

    4. 将当前操作设置为初始操作(一个一个0),并将当前观测值设置为初始观测值(年代年代0).

    5. 当情节尚未结束或结束时:

      1. 用行动保护环境一个得到下一个观测值年代和报酬r

      2. 从经验集(年代一个r年代”)。

      3. 计算下一个动作一个' =μ年代”)。

      4. 使用下一个操作更新当前操作(一个一个’),并将当前观测值更新为下一个观测值(年代年代”)。

      5. 如果满足环境中定义的插曲终止条件,则中断。

  3. 若培训终止条件定义为trainOpts遇有,终止培训。否则,请开始下一集。

具体是如何火车执行这些计算取决于代理和环境的配置。例如,在每集开始时重置环境可以包括随机初始状态值,如果您将环境配置为这样做的话。

扩展功能

在R2019a中引入