主要内容

火车

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

描述

trainStats=火车(env代理使用默认训练选项,在指定环境中训练一个或多个强化学习代理。虽然代理是一个输入参数,在每次训练之后,火车中指定的每个代理的参数代理最大化他们从环境中期望的长期回报。这是可能的,因为每个代理都是一个句柄对象。培训结束时,代理反映每个特工在最后训练集结束时的状态。

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

例子

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

trainStats=火车(代理envprevTrainStats中包含的代理参数的最后值和训练结果恢复训练prevTrainStats的上一个函数调用后获得火车

例子

全部折叠

对配置的座席进行培训训练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。情节=“训练进步”

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

情节(env)

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

trainingInfo =火车(代理,env, trainOpts);

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

simOptions = rlSimulationOptions (“MaxSteps”, 500);经验= sim (env,代理,simOptions);

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

这个例子展示了如何在Simulink®环境中设置一个多智能体培训会话。在本例中,您将训练两个代理协作执行移动对象的任务。

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

设置随机种子并创建本示例所需的参数集。

rng (10) rlCollaborativeTaskParams

打开Simulink模型。

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 公元前 分别为代理A与对象C、代理B与对象C之间的距离。

  • 代理对机器人施加外力,导致机器人运动。 u 一个 而且 u B 为两个代理A和B从上一个时间步开始的动作值。动作值的范围在-1到1之间。

环境

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

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

观察次数%numObs = 16;%操作次数numAct = 2;%最大外力值(N)maxF = 1.0;每个代理的I/O规范oinfo = rlNumericSpec ([numObs, 1]);ainfo = rlNumericSpec (numAct, 1,...“UpperLimit”maxF,...“LowerLimit”, maxf);oinfo。Name =“观察”;ainfo。Name =“力量”

创建Simulink环境接口。

黑色= [“rlCollaborativeTask /代理”“B rlCollaborativeTask /代理”];obsInfos = {oinfo, oinfo};actInfos = {ainfo, ainfo};env = rlSimulinkEnv (mdl,黑色,obsInfos actInfos);

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

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

代理

本例使用两个具有连续动作空间的近端策略优化(PPO)代理。代理对机器人施加外力,导致机器人运动。要了解更多关于PPO代理的信息,请参见近端策略优化代理

代理收集经验,直到达到经验范围(600步)。轨迹完成后,代理从300个小批量经验中学习。使用0.2的目标函数剪辑因子提高训练稳定性,使用0.99的折扣因子鼓励长期奖励。

为这个示例指定代理选项。

agentOptions = rlPPOAgentOptions (...“ExperienceHorizon”, 600,...“ClipFactor”, 0.2,...“EntropyLossWeight”, 0.01,...“MiniBatchSize”, 300,...“NumEpoch”4...“AdvantageEstimateMethod”“gae”...“GAEFactor”, 0.95,...“SampleTime”Ts,...“DiscountFactor”, 0.99);agentOptions.ActorOptimizerOptions.LearnRate = 1的军医;agentOptions.CriticOptimizerOptions.LearnRate = 1的军医;

使用默认的代理创建语法创建代理。有关更多信息,请参见rlPPOAgent

agentA = rlPPOAgent(oinfo, ainfo,...rlAgentInitializationOptions (“NumHiddenUnit”, 200), agentOptions);agentB = rlPPOAgent(oinfo, ainfo,...rlAgentInitializationOptions (“NumHiddenUnit”, 200), agentOptions);

培训

要训练多个代理,可以将一个代理数组传递给火车函数。数组中代理的顺序必须与环境创建期间指定的代理块路径的顺序匹配。这样做可以确保代理对象链接到环境中相应的I/O接口。

您可以以分散或集中的方式对多个代理进行培训。在去中心化训练中,代理在事件中收集自己的一组经验,并从这些经验中独立学习。在集中培训中,代理人员分享所收集到的经验,共同学习。轨迹完成后,各智能体之间的作用函数和评价函数同步。

当需要配置多座席培训时,您可以创建座席组,并为每个座席组指定学习策略rlMultiAgentTrainingOptions对象。每个座席组可能包含唯一的座席索引,学习策略可以是“集中”“去中心化”.例如,可以使用以下命令为三个具有不同学习策略的座席组配置培训。具有索引的代理[1,2]而且(3、4)代理时集中学习4以分散的方式学习。

opts = rlMultiAgentTrainingOptions("AgentGroups", {[1,2], 4, [3,5]}, "LearningStrategy", ["centralized","decentralized","centralized"])

有关多智能体培训的更多信息,请键入帮助rlMultiAgentTrainingOptions在MATLAB。

通过使用Run Section按钮运行以下部分之一,可以执行分散或集中的训练。

1.分散培训

为本例配置分散的多代理训练:

  • 属性自动分配座席组AgentGroups =汽车选择。这将在单独的组中分配每个代理。

  • 指定“去中心化”学习策略。

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

  • 当一个代理在连续30集的平均奖励是-10或更多时停止训练。

trainOpts = rlMultiAgentTrainingOptions (...“AgentGroups”“汽车”...“LearningStrategy”“去中心化”...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 600,...“ScoreAveragingWindowLength”30岁的...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -10);

训练特工使用火车函数。根据可用的计算能力,训练可能需要数小时才能完成。为了节省时间,请加载MAT文件decentralizedAgents.mat里面有一群训练有素的探员。自己训练探员,设doTraining真正的

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

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

2.集中的训练

为本例配置集中的多代理培训:

  • 分配两个代理(使用索引)1而且2)。控件中的代理索引可以实现这一点“AgentGroups”选择。

  • 指定“集中”学习策略。

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

  • 当一个代理在连续30集的平均奖励是-10或更多时停止训练。

trainOpts = rlMultiAgentTrainingOptions (...“AgentGroups”{[1, 2]},...“LearningStrategy”“集中”...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”, 600,...“ScoreAveragingWindowLength”30岁的...“StopTrainingCriteria”“AverageReward”...“StopTrainingValue”, -10);

训练特工使用火车函数。根据可用的计算能力,训练可能需要数小时才能完成。为了节省时间,请加载MAT文件centralizedAgents.mat里面有一群训练有素的探员。自己训练探员,设doTraining真正的

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

下图是集中训练进度的快照。由于训练过程的随机性,你可以预期不同的结果。

模拟

训练完成后,用环境模拟训练过的代理。

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

图Multi Agent Collaborative Task包含一个axes对象。坐标轴对象包含5个矩形、文本类型的对象。

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

这个例子展示了如何使用现有的训练数据恢复训练Q-learning。有关这些代理的更多信息,请参见q学习的代理而且撒尔沙代理

创建网格世界环境

对于本例,创建基本的网格世界环境。

env = rlPredefinedEnv (“BasicGridWorld”);

要指定代理的初始状态始终为[2,1],请创建一个reset函数,该函数返回初始代理状态的状态号。

X0 = [1:12 15:17 19:22 24];env。ResetFcn = @() x0(randi(numel(x0)));

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

rng (1)

创建q学习的代理

要创建Q学习代理,首先要使用来自网格世界环境的观察和操作规范创建Q表。设置表示的学习率为1。

qTable = rlTable (getObservationInfo (env) getActionInfo (env));qVf = rlQValueFunction (qTable getObservationInfo (env) getActionInfo (env));

接下来,使用这个表表示创建一个q学习代理,并配置epsilon-greedy探索。有关创建q学习代理的更多信息,请参见rlQAgent而且rlQAgentOptions.保持折扣因子的默认值为0.99

agentOpts = rlQAgentOptions;agentOpts.EpsilonGreedyExploration.Epsilon = 0.2;agentOpts.CriticOptimizerOptions.LearnRate = 0.2;agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1 e - 3;agentOpts.EpsilonGreedyExploration.EpsilonMin = 1 e - 3;agentOpts。DiscountFactor = 1;qAgent = rlQAgent (qVf agentOpts);

训练Q-Learning Agent 100集

要培训代理,首先要指定培训选项。有关更多信息,请参见rlTrainingOptions

trainOpts = rlTrainingOptions;trainOpts。MaxStepsPerEpisode = 200;trainOpts。MaxEpisodes = 1 e6;trainOpts。情节=“没有”;trainOpts。Verbose = false;trainOpts。StopTrainingCriteria =“EpisodeCount”;trainOpts。StopTrainingValue = 100;trainOpts。ScoreAveragingWindowLength = 30;

训练q学习代理使用火车函数。训练可能需要几分钟才能完成。要在运行此示例时节省时间,请通过设置加载预先训练过的代理doTraining.亲自训练探员,设doTraining真正的

env, trainingStats =火车(qAgent trainOpts);

显示上一集的索引。

trainingStats.EpisodeIndex(结束)
ans = 100

再训练Q-Learning Agent 200集

设置训练在第300集之后停止。

trainingStats.TrainingOptions.StopTrainingValue = 300;

中存在的训练数据恢复训练trainingStats

env, trainingStats =火车(qAgent trainingStats);

显示上一集的索引。

trainingStats.EpisodeIndex(结束)
ans = 300

情节插曲奖励。

图()图(trainingStats.EpisodeIndex trainingStats.EpisodeReward)标题(“集奖励”)包含(“EpisodeIndex”) ylabel (“EpisodeReward”

图中包含一个axes对象。标题为Episode Reward的axes对象包含一个类型为line的对象。

显示最终的q值表。

qAgentFinalQ = getLearnableParameters (getCritic (qAgent));qAgentFinalQ {1}
ans =25 x4单一矩阵4.8373 10.0000 -1.3036 0.8020 9.2058 4.3147 11.000 5.8501 10.0000 3.3987 4.5830 -6.4751 6.3569 6.0000 8.9971 5.4393 5.0433 5.8399 7.0067 4.1439 5.1031 8.5228 10.9936 0.1200 9.9616 8.8647 12.0000 10.0026 11.0000 8.4131 8.6974 6.0001 10.0000 6.9997 5.8122 8.5523 7.1164 7.0019 8.0000 5.8196

验证q学习的结果

为了验证训练结果,在训练环境中对智能体进行了模拟。

在运行模拟之前,可视化环境并配置可视化以维护代理状态的跟踪。

情节env (env)。ResetFcn = @()env.Model.Viewer.ShowTrace = true;env.Model.Viewer.clearTrace;

方法模拟环境中的代理sim卡函数。

sim (qAgent env)

输入参数

全部折叠

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

如果env是否创建了多代理环境rlSimulinkEnv,将代理指定为数组。数组中代理的顺序必须与用于创建的代理顺序匹配env.MATLAB不支持多智能体训练®环境。

请注意

火车随着训练的进行,更新代理。这是可能的,因为每个代理都是一个句柄对象。为了保留原始代理参数供以后使用,请将代理保存到一个mat文件中(如果将代理复制到一个新变量中,新变量也将始终指向具有更新参数的最新代理版本)。有关句柄对象的更多信息,请参见处理对象的行为

请注意

培训结束时,代理反映每个特工在最后训练集结束时的状态。最终代理商在培训过程中获得的回报不一定是最高的,因为不断的探索。若要在训练期间保存代理,请创建rlTrainingOptions对象指定SaveAgentCriteria而且SaveAgentValue属性并将其传递给火车作为一个trainOpts论点。

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

代理行为的环境,指定为下列强化学习环境对象之一:

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

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

  • 您创建的自定义Simulink环境rlSimulinkEnv.这种环境支持同时训练多个代理。

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

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

训练参数和选项,指定为或rlTrainingOptions或者一个rlMultiAgentTrainingOptions对象。使用此实参指定形参和选项如下:

  • 结束培训的标准

  • 保存候选代理的标准

  • 如何显示培训进度

  • 并行计算的选项

有关详细信息,请参见rlTrainingOptions而且rlMultiAgentTrainingOptions

训练集数据,指定为:

  • rlTrainingResult对象,当训练单个代理时。

  • 的数组rlTrainingResult对象在训练多个代理时。

用这个论点从停止训练的确切地点重新开始训练。这将从代理参数的最后一个值和在前一个值之后获得的训练结果对象开始训练火车函数调用。prevTrainStats控件作为其属性之一,包含rlTrainingOptions对象或rlMultiAgentTrainingOptions对象,指定训练选项集。因此,要用更新的训练选项重新启动训练,首先要更改中的训练选项trainResults使用点符号。如果在上一个培训会话中已经达到了最大集数,则必须增加最大集数。

有关rlTrainingResult对象属性,请参见trainStats输出参数。

输出参数

全部折叠

训练集数据,返回为:

  • rlTrainingResult对象,当训练单个代理时。

  • 的数组rlTrainingResult对象在训练多个代理时。

对象的以下属性rlTrainingResult对象:

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

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

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

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

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

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

在为训练执行的模拟过程中收集的信息,返回为:

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

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

培训选项设置,返回为:

  • 对于一个特工来说,一个rlTrainingOptions对象。有关更多信息,请参见rlTrainingOptions参考页面。

  • 对于多座席,anrlMultiAgentTrainingOptions对象。有关更多信息,请参见rlMultiAgentTrainingOptions参考页面。

提示

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

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

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

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

  • 在培训期间,可以保存满足指定条件的候选代理trainOpts.例如,即使终止训练的总体条件还不满足,您也可以保存任何一个剧集奖励超过一定值的代理。火车将保存的代理存储在指定文件夹中的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

全部展开

Baidu
map