主要内容

创建定制强化学习代理

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

创建模板类

要定义自定义代理,请先创建一个是子类的类rl.agent.customagent.类。作为示例,本主题描述了经过培训的自定义LQR代理列车定制LQR代理.作为您自己代理的起点,您可以打开和修改此自定义代理类。要将示例文件添加到MATLAB路径并在MATLAB命令行处打开文件,请键入以下代码。

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

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

rmpath(fullfile(matlabroot,'例子''rl''主要的'));

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

classdeflqrcustomagent 
              

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

  • 代理属性

  • 构造函数

  • 评估贴现后的长期回报(如果学习需要的话)的评论家表现

  • 演员表示,即根据当前观察选择动作(如果需要学习)

  • 需要代理的方法

  • 可选的代理方法

代理属性

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

  • 折扣未来奖励的折扣因素

  • 用于探索模型的配置参数,例如噪声模型或epsilon - 贪婪探索

  • 使用重放内存的缓冲区

  • 从经验缓冲取样的小批量大小

  • 在培训过程中向前看的步骤数

有关潜在代理属性的更多信息,请参见内置强化学习工具箱™代理的选项对象。

rl.agent.customagent.类已经包括代理示例时间的属性(SampleTime)和行动和观察规范(ActionInfo观察税收分别)。

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

特性%问问:R %R.%反馈收益K.%的折扣因素伽玛= 0.95%评论家评论家k%缓冲器KBufferk%的更新数kupdate = 1估计器更新的百分比估计= 10.结束Counter = 1 YBuffer HBuffer . properties (Access = private结束

构造函数

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

  • 定义动作和观察规范。有关创建这些规范的详细信息,请参阅rlNumericSpecrlFiniteSetSpec

  • 根据训练算法的要求创建actor和critic表示。有关更多信息,请参见创建策略和值函数表示

  • 配置代理属性。

  • 调用基抽象类的构造函数。

例如,lqrcustomagent.构造函数定义了连续动作和观察空间,并创造了批评者表示。这疯狂的函数是一个可选的助手函数,它定义了批评表示。

功能obj = lqrcustomagent(q,r,italyk)%检查输入参数的数量narginchk(3,3);%调用抽象类构造函数obj = obj@rl.agent.customagent();%设置Q和R矩阵obj.q = q;obj.r = r;%定义了观察和动作空间obj.observationinfo = rlnumericspec([size(q,1),1]);obj.actioninfo = rlnumericspec([size(r,1),1]);%创造批评批评者表示obj.critic = createcitic(obj);初始化增益矩阵obj.k = italyk;%初始化经验缓冲区obj.ybuffer = zeros(obj.estimateNum,1);num =尺寸(q,1)+大小(r,1);obj.hbuffer = zeros(obj.estimateNum,0.5 * num *(num + 1));obj.kbuffer = cell(1,1000);obj.kbuffer {1} = obj.k;结束

演员和批评者表示

如果您的学习算法使用批读表示来估计长期奖励,则要选择动作或两者的演员,您必须将其添加为代理属性。创建代理时,您必须创建这些表示;也就是说,在构造函数中。有关创建演员和批评者的更多信息,请参阅创建策略和值函数表示

例如,自定义LQR代理使用批评者表示,存储在其中评论家财产,没有演员。批评者的创作是实施的疯狂的辅助功能,从中调用lqrcustomagent.构造函数。

功能批评=疯狂(obj)nq = size(obj.q,1);nr = size(obj.r,1);n = nq + nr;W0 = 0.1 *α(0.5 *(n + 1)* n,1);批评= rlqvaluerepresentation({@(x,u)computequadraticbasis(x,u,n),w0},......getobservationInfo(obj),getActionInfo(OBJ));批评.Options.gradientThreshold = 1;结束

在这种情况下,评论家是一个rlqvalueerepresentation对象。要创建这样的表示,必须指定自定义基函数的句柄,在本例中为computequadraticbasis.功能。有关此评论家的更多信息,请参阅列车定制LQR代理

所需的功能

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

功能 描述
getActionimpl. 通过评估给定观察的代理策略来选择操作
getActionWithExplorationImpl 使用代理的探索模型选择一个操作
学习中 从当前的经历中了解并恢复探索的动作

在实现函数中,要评估参与者和评论家表示,可以使用getValue努力, 和getMaxQValue职能。

  • 评估一个rlvalueerepresentation通过仅观测输入信号的临界状态,获得状态值函数V.使用以下语法。

    v = getValue(评论家,观察);
  • 评估一个rlqvalueerepresentation批判与观察和动作输入信号,获得状态动作值函数问:使用以下语法。

    q = getValue(评论家,[观察,动作]);
  • 评估一个rlqvalueerepresentation批评只有观察输入信号,获取状态动作值函数问:对于所有可能的离散操作,使用以下语法。

    q = getValue(评论家,观察);
  • 离散的动作空间rlqvalueerepresentation临界时,得到最大Q状态-动作值函数问:对于所有可能的离散操作,使用以下语法。

    [maxq,maxactindex] = getmaxqvalue(批评者,观察);
  • 评估演员代表(rlstochastorrepresentation或者rlDeterministicActorRepresentation),获得行动一种使用以下语法。

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

对于这些情况中的每一个,如果您的演员或批评网络使用经常性神经网络,则在获得相应的网络输出之后,该功能也可以返回网络状态的当前值。

getActionimpl.功能

getActionimpl.函数评估代理的策略并选择一个操作。此功能必须具有以下签名,在哪里obj是代理对象,观察是目前的观察,还有行动是所选择的动作。

功能action = getActionimpl(obj,观察)

对于自定义LQR代理,通过应用= -K.X控制法。

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

getActionWithExplorationImpl功能

getActionWithExplorationImpl函数使用代理商的探索模型选择一个操作。使用此功能,您可以实现epsilon-greedy探索等算法。此功能必须具有以下签名,在哪里obj是代理对象,观察是目前的观察,还有行动是所选择的动作。

功能action = getActionWithExplorationImpl (obj,观察)

对于定制LQR代理,getActionWithExplorationImpl功能将随机白噪声添加到使用当前代理策略选择的操作。

功能action = getActionWithExplorationImpl (obj,观察)赋予当前观察的%,选择一个动作action = getAction (obj,观察);%为动作添加随机噪声num = size(obj.r,1);动作=动作+ 0.1 * RANDN(NUM,1);结束

学习中功能

学习中函数定义代理商如何从当前的经验中学到。此函数通过更新策略参数并使用探索选择操作来实现您的代理的自定义学习算法。此功能必须具有以下签名,在哪里obj是代理对象,exp.是目前的代理经验,还有行动是所选择的动作。

功能Action = Seathimpl(OBJ,EXP)

代理经验是单元格数组exp ={状态、动作、奖励、nextstate结束}

  • 状态是当前的观察。

  • 行动是目前的行动。

  • 报酬是目前的奖励。

  • nextState是下一个观察。

  • 已经完成了是一个逻辑标志,表明训练集是完整的。

对于自定义LQR代理,批评参数将更新N步骤。

功能Action = Seathimpl(OBJ,EXP)%解析体验输入x = exp {1} {1};u = exp {2} {1};dx = exp {4} {1};y =(x'* obj.q * x + u'* obj.r * u);num = size(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 = zeros(n,1);obj.hbuffer = zeros(n,0.5 * num *(num + 1));obj.kupdate = obj.kupdate + 1;obj.kbuffer {obj.kupdate} = obj.k;结束%查找并通过探索返回行动action = getActionWithExploration (obj, exp {4});结束

可选功能

(可选)您可以通过指定A指定培训开始如何重置代理程序resetimpl.使用以下功能签名,其中obj是代理对象。使用此函数,可以在训练前将代理设置为已知或随机的条件。

功能resetImpl (ob)

此外,您还可以根据需要在自定义代理类中定义任何其他助手函数。例如,自定义LQR代理定义了疯狂的功能为创建评论家的表现和一个getNewK函数,从训练的批评参数导出反馈增益矩阵。

创建自定义代理

定义了自定义代理类之后,在MATLAB工作区中创建一个它的实例。例如,要创建自定义LQR代理,请定义问:R., 和itsialk.值并调用构造函数。

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代理

另请参阅

相关话题