主要内容

创建自定义强化学习代理

要实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后你可以在MATLAB中训练和模拟这个代理®和仿真软金宝app件®环境。有关在MATLAB创建类的详细信息,请参阅用户定义的类

创建模板类

要定义自定义代理,首先创建一个类,它是的一个子类rl.agent.CustomAgent类。本节以培训的自定义LQR代理为例火车定制LQR代理.作为您自己代理的起点,您可以打开并修改这个自定义代理类。要将示例文件添加到MATLAB路径并打开该文件,请在MATLAB命令行中输入以下代码。

目录(fullfile (matlabroot,'例子''RL''主要的'));编辑LQRCustomAgent.m

在将类保存到您自己的工作文件夹之后,您可以从该路径中删除示例文件。

rmpath(完整文件(matlabroot,'例子''RL''主要的'));

这个类具有以下类定义,它指示代理类名和关联的抽象代理。

classdefLQRCustomAgent 
              

要定义你的代理,必须指定以下内容:

  • 代理属性

  • 构造函数

  • 评估打折扣的长期回报(如果学习需要的话)的评论家代表

  • 基于当前观察选择动作的参与者表示(如果学习需要)

  • 需要代理的方法

  • 可选剂的方法

代理属性

在里面特性部分,指定创建和培训代理所需的任何参数。这些参数包括:

  • 贴现因子用于贴现未来的回报

  • 配置探测模型的参数,如噪声模型或贪心探测

  • 使用回放存储器缓冲区经验

  • 从经验缓冲液中取样的小批量尺寸

  • 在训练中向前看的步骤数

有关潜在代理属性的更多信息,请参阅内置的Reinforcement Learning Toolbox™代理的选项对象。

rl.Agent.CustomAgent类已经包括用于将试剂样品时间属性(SampleTime)及动作及观察规范(ActionInfoObservationInfo分别)。

自定义LQR代理定义了以下代理属性。

特性%问R %R%反馈增益K%的折扣因素γ= 0.95评论家%评论家K缓冲液%KBuffer对于K更新的数量%kupdate根据= 1%估计值更新的数字EstimateNum = 10结束YBuffer HBuffer . properties (Access = private) Counter = 1结束

构造函数

要创建自定义代理,必须定义一个构造函数:

例如,LQRCustomAgent构造者定义了连续的动作和观察空间,并创建了一个批判的表示。的createCriticFunction是一个可选的helper函数,用于定义批评家表示形式。

功能obj = LQRCustomAgent (Q, R, InitialK)%检查输入参数的数量narginchk (3,3);%调用抽象类的构造函数OBJ = obj@rl.agent.CustomAgent();%设置Q和R矩阵obj。问= Q; obj.R = R;定义观察和活动空间obj。ObservationInfo = rlNumericSpec([大小(Q, 1), 1]);obj。一个ctionInfo = rlNumericSpec([size(R,1),1]);%创建批评家表示obj.Critic = createCritic(OBJ);%初始化增益矩阵obj.K = InitialK;%初始化经验缓冲区obj。YBuffer = 0 (obj.EstimateNum, 1);num = size(Q,1) + size(R,1);obj。HBuffer = 0 (obj.EstimateNum, 0.5 * num * (num + 1));obj。KBuffer = cell(1,1000); obj.KBuffer{1} = obj.K;结束

演员和评论家交涉

如果你的学习算法使用评论家表示估计的长期回报,选择一个动作演员,或两者兼而有之,你必须添加为代理属性。然后,您必须在您创建代理创建这些表述;也就是说,在构造函数。有关创建者和评论家的更多信息,请参阅创建策略和价值功能表示

例如,自定义LQR代理使用评论家表示,存储在其评论家财产,没有行为人。批评家的创作是在createCritic方法调用的Helper函数LQRCustomAgent构造函数。

功能nQ = size(obj. q,1);nR =大小(obj.R, 1);n = nQ + nR;的w0 = 0.1 * (0.5 * (n + 1) * n, 1);{@(x,u),w0},...getObservationInfo(OBJ),getActionInfo(OBJ));critic.Options.GradientThreshold = 1;结束

在这种情况下,评论家是rlQValueRepresentation对象。要创建这样的表示,必须指定自定义基函数的句柄,在本例中为computeQuadraticBasis函数。有关此评论家表示的更多信息,请参见火车定制LQR代理

所需的功能

要创建自定义强化学习代理,必须定义以下实现函数。要在您自己的代码中调用这些函数,请使用抽象基类中的包装器方法。例如,打电话getActionImpl, 用的getAction.包装器方法具有与实现方法相同的输入和输出参数。

功能 描述
getActionImpl 通过评估给定观察的代理策略来选择操作
getActionWithExplorationImpl 选择使用代理的勘探模型中的作用
learnImpl 从当前的经验中学习,并以探索的方式返回行动

在实现函数中,要评估参与者和批评者表示,可以使用getValue的getAction, 和getMaxQValue职能。

  • 评估一个rlValueRepresentation用仅观测的输入信号,求得状态值函数V使用以下语法。

    V =的getValue(评论家,观察);
  • 评估一个rlQValueRepresentation评论家与两个观察和动作的输入信号,获得所述状态 - 动作值函数使用以下语法。

    Q =的getValue(评论家,[观察,动作]);
  • 评估一个rlQValueRepresentation批评家只用观察输入信号,得到状态-动作值函数使用以下语法所有可能的离散动作。

    Q = getValue(评论家,观察);
  • 一个离散的作用空间rlQValueRepresentation批评家,得到最大Q状态-动作值函数使用以下语法所有可能的离散动作。

    [MAXQ,MaxActionIndex] = getMaxQValue(评论家,观察);
  • 要评估一个行动者表示(rlStochasticActorRepresentation或者rlDeterministicActorRepresentation),获得行动一个使用以下语法。

    一个= getAction(演员、观察);

对于每一种情况,如果参与者或批评者网络使用递归神经网络,函数也可以在获得相应的网络输出后返回网络状态的当前值。

getActionImpl功能

getActionImpl函数的作用是评估代理的策略并选择操作。该函数必须具有以下签名,其中obj是代理对象,观察目前的观察是,和行动是选定的操作。

功能行动= getActionImpl(OBJ,观察)

对于自定义LQR代理,您可以通过应用u= -Kx控制律。

功能行动= getActionImpl(OBJ,观察)给定系统的当前状态,返回一个操作action = -obj.K *观察{:};结束

getActionWithExplorationImpl功能

getActionWithExplorationImpl函数使用代理的探索模型选择操作。使用这个函数,可以实现贪心探索等算法。该函数必须具有以下签名,其中obj是代理对象,观察目前的观察是,和行动是选定的操作。

功能action = getActionWithExplorationImpl (obj,观察)

对于自定义LQR代理,getActionWithExplorationImpl函数向使用当前代理策略选择的操作添加随机白噪声。

功能action = getActionWithExplorationImpl (obj,观察)%给定当前的观察,选择一个动作action = getAction (obj,观察);%在动作中添加随机噪音num =大小(obj.R, 1);操作=操作+ 0.1*randn(num,1);结束

learnImpl功能

learnImpl函数定义代理如何从当前经验中学习。这个函数通过更新策略参数和选择带有探索的操作来实现代理的自定义学习算法。该函数必须具有以下签名,其中obj是代理对象,经验值是目前的代理经验,行动是选定的操作。

功能行动= learnImpl(OBJ,EXP)

代理体验是单元阵列exp ={状态、动作、奖励、nextstate结束}

  • 状态是目前的观察结果。

  • 行动是当前操作。

  • 报酬是当前的奖励。

  • nextState是下一个观测。

  • 结束是一个逻辑标志,指示训练阶段已完成。

对于自定义代理LQR,评论家参数更新一次N步骤。

功能行动= learnImpl(OBJ,EXP)%解析输入的经验X = EXP {1} {1};U = EXP {2} {1};DX = EXP {4} {1};Y =(X '* obj.Q * X + U' * obj.R * U);NUM =尺寸(obj.Q,1)+大小(obj.R,1);%需要等待N步才能更新批评家参数N = obj.EstimateNum;h1 = computeQuadraticBasis (x, u, num);h2 = computeQuadraticBasis (dx, -obj.K * dx, num);H = h1 - obj。γ* h2;如果obj。Counter<=N obj.YBuffer(obj.Counter) = y;obj.HBuffer (obj.Counter:) = H;obj。Counter = obj。计数器+ 1;其他的%根据批处理更新批评家参数%经验H_buf = obj.HBuffer;y_buf = obj.YBuffer;θ= (H_buf ' * H_buf) \ H_buf * y_buf;obj。评论家= setLearnableParameters (obj.Critic{θ});根据新的参数推导新的增益矩阵obj.K = getNewK(OBJ);重置经验缓冲区obj.Counter = 1;obj.YBuffer =零(N,1);obj.HBuffer =零(N,0.5 * * NUM(NUM + 1));obj.KUpdate = obj.KUpdate + 1;obj.KBuffer {obj.KUpdate} = obj.K;结束找到并返回一个带有探索的动作action = getActionWithExploration (obj, exp {4});结束

可选功能

您还可以通过指定resetImpl函数的签名如下obj是代理对象。使用此函数,可以在训练前将代理设置为已知或随机条件。

功能resetImpl (ob)

此外,您还可以根据需要在自定义代理类中定义任何其他助手函数。例如,自定义LQR代理定义createCritic函数创建批评家表示和getNewK函数,该函数从训练过的批评参数派生出反馈增益矩阵。

创建自定义代理

定义自定义代理类之后,在MATLAB工作空间中创建它的实例。例如,要创建自定义LQR代理,请定义R, 和InitialK值并调用构造函数。

Q = [10,3,1; 3,5,4; 1,4,9];R = 0.5 *眼(3);K0 =地方(A,B,[0.4,0.8,0.5]);剂= LQRCustomAgent(Q,R,K0);

验证环境对象之后,可以使用它来训练强化学习代理。有关训练自定义LQR代理的示例,请参见火车定制LQR代理

另请参阅

相关话题