主要内容gydF4y2Ba

用约束强制训练强化学习代理gydF4y2Ba

这个例子展示了如何使用Constraint Enforcement块训练一个动作受限的强化学习(RL)代理。该块计算修改后的控制操作,这些操作最接近代理根据约束和操作边界输出的操作。训练强化学习代理需要强化学习工具箱™软件。gydF4y2Ba

在这个例子中,代理的目标是将一个绿色的球尽可能地靠近一个红色球[1]的变化目标位置。gydF4y2Ba

绿球的动力学是从速度来的gydF4y2Ba vgydF4y2Ba 定位gydF4y2Ba xgydF4y2Ba 受牛顿定律控制,阻尼系数小gydF4y2Ba τgydF4y2Ba .gydF4y2Ba

1gydF4y2Ba 年代gydF4y2Ba (gydF4y2Ba τgydF4y2Ba 年代gydF4y2Ba +gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba .gydF4y2Ba

球位置的可行区域gydF4y2Ba 0gydF4y2Ba ≤gydF4y2Ba xgydF4y2Ba ≤gydF4y2Ba 1gydF4y2Ba 绿球的速度被限制在这个范围内gydF4y2Ba [gydF4y2Ba -gydF4y2Ba 1gydF4y2Ba ,gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba .gydF4y2Ba

目标红球的位置在整个范围内是均匀随机的gydF4y2Ba [gydF4y2Ba 0gydF4y2Ba ,gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba .智能体只能观察到这个目标位置的噪声估计。gydF4y2Ba

设置随机种子,配置模型参数gydF4y2Ba

%随机种子gydF4y2Barng (gydF4y2Ba“默认”gydF4y2Ba)gydF4y2Ba%的参数gydF4y2BaTv = 0.8;gydF4y2Ba可视化器的采样时间%gydF4y2BaTs = 0.1;gydF4y2Ba%采样时间为控制器gydF4y2BaTau = 0.01;gydF4y2Ba%绿球阻尼常数gydF4y2BavelLimit = 1;gydF4y2Ba%绿球的最大速度gydF4y2BaS0 = 200;gydF4y2Ba%随机种子gydF4y2BaS1 = 100;gydF4y2Ba%随机种子gydF4y2BaX0 = 0.2;gydF4y2Ba%球的初始位置gydF4y2Ba

创建数据采集环境和代理gydF4y2Ba

在这个例子中,约束函数是用训练好的深度神经网络表示的。要训练网络,首先必须从环境中收集训练数据。gydF4y2Ba

方法创建RL环境gydF4y2BarlBallOneDimgydF4y2Ba模型。该模型通过RL代理块对环境应用随机外部操作。gydF4y2Ba

mdl =gydF4y2Ba“rlBallOneDim”gydF4y2Ba;open_system (mdl)gydF4y2Ba

环境子系统执行以下步骤。gydF4y2Ba

  • 将输入速度应用于环境模型并生成结果输出观测值gydF4y2Ba

  • 计算训练奖励gydF4y2Ba rgydF4y2Ba =gydF4y2Ba [gydF4y2Ba 1gydF4y2Ba -gydF4y2Ba 10gydF4y2Ba (gydF4y2Ba xgydF4y2Ba -gydF4y2Ba xgydF4y2Ba rgydF4y2Ba )gydF4y2Ba 2gydF4y2Ba ]gydF4y2Ba +gydF4y2Ba ,在那里gydF4y2Ba xgydF4y2Ba rgydF4y2Ba 表示红球的位置gydF4y2Ba

  • 设置终止信号gydF4y2Ba结束gydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba如果球的位置违反了约束gydF4y2Ba 0gydF4y2Ba ≤gydF4y2Ba xgydF4y2Ba ≤gydF4y2Ba 1gydF4y2Ba

在该模型中,环境观测包括绿色球的位置和速度以及红色球位置的噪声测量。为这三个值定义一个连续的观察空间。gydF4y2Ba

obsInfo = rlNumericSpec([3 1]);gydF4y2Ba

agent作用于绿色球的动作是它的速度。创建一个连续的动作空间,并应用所需的速度限制。gydF4y2Ba

actInfo = rlNumericSpec([1 1],gydF4y2Ba“LowerLimit”gydF4y2Ba-velLimit,gydF4y2Ba“UpperLimit”gydF4y2Ba, velLimit);gydF4y2Ba

为这个模型创建一个RL环境。gydF4y2Ba

Agentblk = [mdl .gydF4y2Ba' / RL代理'gydF4y2Ba];env = rl万博1manbetxSimulinkEnv(mdl,agentblk,obsInfo,actInfo);gydF4y2Ba

指定一个重置函数,在每个训练集或模拟开始时随机初始化环境。gydF4y2Ba

env。ResetFcn = @ localResetFcn(in);gydF4y2Ba

接下来,创建一个DDPG强化学习代理,它支持连续的操作和观察,使用万博1manbetxgydF4y2BacreateDDPGAgentBallgydF4y2Bahelper函数。该函数基于操作和观察规范创建评论家和参与者表示,并使用这些表示创建DDPG代理。gydF4y2Ba

agent = createDDPGAgentBall(Ts,obsInfo,actInfo);gydF4y2Ba

在gydF4y2BarlBallOneDimgydF4y2Ba模型时,RL代理块不生成动作。相反,它被配置为向环境传递一个随机的外部操作。使用非活动RL Agent块的数据收集模型的目的是确保数据收集期间使用的环境模型、动作和观察信号配置以及模型重置功能与后续Agent训练期间使用的匹配。gydF4y2Ba

学习约束函数gydF4y2Ba

在这个例子中,是球的位置信号gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba 必须满足gydF4y2Ba 0gydF4y2Ba ≤gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba ≤gydF4y2Ba 1gydF4y2Ba .为了允许一些松弛,约束被设置为gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 1gydF4y2Ba ≤gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba ≤gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 9gydF4y2Ba .gydF4y2Ba 动态模型从速度到位置的阻尼常数很小,因此可以近似为gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba ≈gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ugydF4y2Ba kgydF4y2Ba .因此,绿球的约束条件由下式给出。gydF4y2Ba

[gydF4y2Ba xgydF4y2Ba kgydF4y2Ba -gydF4y2Ba xgydF4y2Ba kgydF4y2Ba ]gydF4y2Ba +gydF4y2Ba [gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba -gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba ugydF4y2Ba kgydF4y2Ba ≤gydF4y2Ba [gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 9gydF4y2Ba -gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba

约束强制块接受表单的约束gydF4y2Ba fgydF4y2Ba xgydF4y2Ba +gydF4y2Ba ggydF4y2Ba xgydF4y2Ba ugydF4y2Ba ≤gydF4y2Ba cgydF4y2Ba .对于上式,约束函数的系数为:gydF4y2Ba

fgydF4y2Ba xgydF4y2Ba =gydF4y2Ba [gydF4y2Ba xgydF4y2Ba kgydF4y2Ba -gydF4y2Ba xgydF4y2Ba kgydF4y2Ba ]gydF4y2Ba ,gydF4y2Ba ggydF4y2Ba xgydF4y2Ba =gydF4y2Ba [gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba -gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba ]gydF4y2Ba ,gydF4y2Ba cgydF4y2Ba =gydF4y2Ba [gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 9gydF4y2Ba -gydF4y2Ba 0gydF4y2Ba .gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba

这个函数gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba 通过在环境中模拟RL代理收集的数据来训练深度神经网络。学习未知函数gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba 时,RL代理将一个随机的外部动作传递给该范围内均匀分布的环境gydF4y2Ba [gydF4y2Ba -gydF4y2Ba 1gydF4y2Ba ,gydF4y2Ba 1gydF4y2Ba ]gydF4y2Ba .gydF4y2Ba

要收集数据,请使用gydF4y2BacollectDataBallgydF4y2Bahelper函数。该函数模拟环境和代理,并收集产生的输入和输出数据。得到的训练数据有三列:gydF4y2Ba xgydF4y2Ba kgydF4y2Ba ,gydF4y2Ba ugydF4y2Ba kgydF4y2Ba ,gydF4y2Ba xgydF4y2Ba kgydF4y2Ba +gydF4y2Ba 1gydF4y2Ba .gydF4y2Ba

对于本例,加载预先收集的训练数据。如果需要自行收集数据,请设置gydF4y2BacollectDatagydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

collectData = false;gydF4y2Ba如果gydF4y2BacollectData count = 1050;data = collectDataBall(env,agent,count);gydF4y2Ba其他的gydF4y2Ba负载gydF4y2BatrainingDataBallgydF4y2Ba数据gydF4y2Ba结束gydF4y2Ba

训练深度神经网络来逼近约束函数gydF4y2BatrainConstraintBallgydF4y2Bahelper函数。这个函数格式化训练数据,然后创建和训练一个深度神经网络。训练深度神经网络需要深度学习工具箱™软件。gydF4y2Ba

对于这个例子,为了确保重现性,加载一个预先训练好的网络。要自己训练网络,请设置gydF4y2BatrainConstraintgydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

trainConstraint = false;gydF4y2Ba如果gydF4y2BatrainConstraint network = trainConstraintBall(data);gydF4y2Ba其他的gydF4y2Ba负载gydF4y2BatrainedNetworkBallgydF4y2Ba网络gydF4y2Ba结束gydF4y2Ba

培训进度示例如下图所示。gydF4y2Ba

验证训练后的神经网络gydF4y2BavalidateNetworkBallgydF4y2Bahelper函数。该函数使用训练好的深度神经网络处理输入的训练数据。然后将网络输出与训练输出进行比较,并计算均方根误差(RMSE)。gydF4y2Ba

validateNetworkBall(数据、网络)gydF4y2Ba
测试数据RMSE = 9.996700e-02gydF4y2Ba

RMSE值较小,说明网络成功学习了约束函数。gydF4y2Ba

训练具有约束执行的代理gydF4y2Ba

要使用约束强制来训练代理,请使用gydF4y2BarlBallOneDimWithConstraintgydF4y2Ba模型。该模型在将代理的操作应用到环境之前约束它们。gydF4y2Ba

mdl =gydF4y2Ba“rlBallOneDimWithConstraint”gydF4y2Ba;open_system (mdl)gydF4y2Ba

要查看约束实现,请打开constraint子系统。这里,经过训练的深度神经网络近似于gydF4y2Ba hgydF4y2Ba (gydF4y2Ba xgydF4y2Ba kgydF4y2Ba )gydF4y2Ba , Constraint Enforcement块执行约束函数和速度边界。gydF4y2Ba

对于本例,使用以下约束强制块参数设置。gydF4y2Ba

  • 约束数量gydF4y2Ba- - - - - -gydF4y2Ba2gydF4y2Ba

  • 动作数量gydF4y2Ba- - - - - -gydF4y2Ba1gydF4y2Ba

  • 约束绑定gydF4y2Ba- - - - - -gydF4y2Ba[0.9, -0.1]gydF4y2Ba

使用此模型创建RL环境。观察和操作规范与以前的数据收集环境中使用的规范相匹配。gydF4y2Ba

Agentblk = [mdl .gydF4y2Ba' / RL代理'gydF4y2Ba];env = rl万博1manbetxSimulinkEnv(mdl,agentblk,obsInfo,actInfo);env。ResetFcn = @ localResetFcn(in);gydF4y2Ba

指定培训代理的选项。训练RL代理300集,每集300步。gydF4y2Ba

trainOpts = rlTrainingOptions(gydF4y2Ba...gydF4y2Ba“MaxEpisodes”gydF4y2Ba, 300,gydF4y2Ba...gydF4y2Ba“MaxStepsPerEpisode”gydF4y2Ba, 300,gydF4y2Ba...gydF4y2Ba“详细”gydF4y2Ba假的,gydF4y2Ba...gydF4y2Ba“阴谋”gydF4y2Ba,gydF4y2Ba“训练进步”gydF4y2Ba);gydF4y2Ba

培训代理人。培训是一个耗时的过程。方法加载预训练的代理gydF4y2BaloadAgentParamsgydF4y2Bahelper函数。要亲自训练特工,请设置gydF4y2BatrainAgentgydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats = train(agent,env,trainOpts);gydF4y2Ba其他的gydF4y2BaloadAgentParams(代理,gydF4y2Ba“rlAgentBallParams”gydF4y2Ba)gydF4y2Ba结束gydF4y2Ba

培训结果如下图所示。训练过程会在20集内汇聚成一个好的特工。gydF4y2Ba

自gydF4y2Ba总步数gydF4y2Ba等于gydF4y2Ba集数量gydF4y2Ba而且gydF4y2Ba集的步骤gydF4y2Ba,每一期训练一直进行到结束,不会提前终止。因此,约束强制块确保了球的位置gydF4y2Ba xgydF4y2Ba 从不违反约束条件gydF4y2Ba 0gydF4y2Ba ≤gydF4y2Ba xgydF4y2Ba ≤gydF4y2Ba 1gydF4y2Ba .gydF4y2Ba

方法模拟训练过的代理gydF4y2BasimWithTrainedAgentBallgydF4y2Bahelper函数。gydF4y2Ba

simWithTrainedAgentBall (env、代理)gydF4y2Ba

{

图中包含2个轴对象。坐标轴对象1包含2个line类型的对象。标题为Time Series Plot:IsDone的Axes对象2包含一个楼梯类型的对象。gydF4y2Ba

agent成功跟踪红球的位置。gydF4y2Ba

列车代理人无约束执行gydF4y2Ba

要查看训练带有约束执行的代理的好处,可以训练没有约束的代理,并将训练结果与约束执行情况进行比较。gydF4y2Ba

要不受约束地训练代理,请使用gydF4y2BarlBallOneDimWithoutConstraintgydF4y2Ba模型。该模型将代理的操作直接应用到环境中。gydF4y2Ba

mdl =gydF4y2Ba“rlBallOneDimWithoutConstraint”gydF4y2Ba;open_system (mdl)gydF4y2Ba

使用此模型创建RL环境。gydF4y2Ba

Agentblk = [mdl .gydF4y2Ba' / RL代理'gydF4y2Ba];env = rl万博1manbetxSimulinkEnv(mdl,agentblk,obsInfo,actInfo);env。ResetFcn = @ localResetFcn(in);gydF4y2Ba

创建一个新的DDPG代理进行培训。此代理具有与前面培训中使用的代理相同的配置。gydF4y2Ba

agent = createDDPGAgentBall(Ts,obsInfo,actInfo);gydF4y2Ba

使用与约束强制案例中相同的训练选项来训练代理。对于本例,与前面的训练一样,装入预训练的代理。要亲自训练特工,请设置gydF4y2BatrainAgentgydF4y2Ba为true。gydF4y2Ba

trainAgent = false;gydF4y2Ba如果gydF4y2BatrainAgent trainingStats2 = train(agent,env,trainOpts);gydF4y2Ba其他的gydF4y2BaloadAgentParams(代理,gydF4y2Ba“rlAgentBallCompParams”gydF4y2Ba)gydF4y2Ba结束gydF4y2Ba

培训结果如下图所示。训练过程会在50集之后汇聚成一个好的特工。在这之后,代理在某些情节中表现不佳,例如在第140和230集左右。gydF4y2Ba

自gydF4y2Ba总步数gydF4y2Ba是小于乘积的gydF4y2Ba集数量gydF4y2Ba而且gydF4y2Ba集的步骤gydF4y2Ba,训练包括由于约束违反而提前终止的事件。gydF4y2Ba

模拟训练过的代理。gydF4y2Ba

simWithTrainedAgentBall (env、代理)gydF4y2Ba

{

图中包含2个轴对象。坐标轴对象1包含2个line类型的对象。标题为Time Series Plot:IsDone的Axes对象2包含一个楼梯类型的对象。gydF4y2Ba

该智能体成功地跟踪了红球的位置,比用约束训练的智能体具有更多的稳态偏移。gydF4y2Ba

结论gydF4y2Ba

在本例中,使用Constraint Enforcement块训练RL代理可以确保应用到环境中的操作不会产生约束违反。因此,训练过程会迅速收敛到一个好的代理。不加约束地训练同一代理会导致收敛速度变慢,性能变差。gydF4y2Ba

bdclose (gydF4y2Ba“rlBallOneDim”gydF4y2Ba) bdclose (gydF4y2Ba“rlBallOneDimWithConstraint”gydF4y2Ba) bdclose (gydF4y2Ba“rlBallOneDimWithoutConstraint”gydF4y2Ba)关闭(gydF4y2Ba“昏暗的球”gydF4y2Ba)gydF4y2Ba

本地复位功能gydF4y2Ba

函数gydF4y2Bain = localResetFcn(in)gydF4y2Ba%复位功能gydF4y2Bain = setVariable(in,gydF4y2Ba“x0”gydF4y2Ba,兰德);in = setVariable(in,gydF4y2Ba“s0”gydF4y2Ba兰迪(5000));in = setVariable(in,gydF4y2Ba“s1 'gydF4y2Ba兰迪(5000));gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

Dalal, Gal, Krishnamurthy Dvijotham, Matej Vecerik, Todd Hester, Cosmin Paduraru和Yuval Tassa。“连续行动空间中的安全探索。”预印本,2018年1月26日提交。gydF4y2Bahttps://arxiv.org/abs/1801.08757gydF4y2Ba

另请参阅gydF4y2Ba

块gydF4y2Ba

相关的话题gydF4y2Ba