主要内容

创建自定义强化学习代理

要实现您自己的自定义强化学习算法,您可以通过创建自定义代理类的子类来创建自定义代理。然后你可以在MATLAB中训练和模拟这个代理®和模拟万博1manbetx®有关在MATLAB中创建类的更多信息,请参见用户定义类

创建模板类

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

让addpath(完整文件(matlabroot,“例子”“rl”“主要的”));编辑LQRCustomAgent.m

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

rmpath(完整文件(matlabroot、,“例子”“rl”“主要的”));

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

Classdef.LQRCustomAgent
              

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

  • 代理属性

  • 构造函数

  • 评论家表示,其估计贴现长期奖励(如果需要学习)

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

  • 所需剂的方法

  • 可选代理方法

代理属性

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

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

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

  • 使用回放内存的经验缓冲区

  • 小批量从经验缓冲采样

  • 步数来训练期间向前看

有关潜在的代理属性的详细信息,请参阅内置的强化学习工具箱™试剂的选择对象。

rl.Agent.CustomAgent类已包含代理采样时间的属性(采样时间)及动作及观察规范(ActionInfo观测信息, 分别)。

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

性质%Q%RR%反馈增益K%的折现率γ= 0.95%评论家评论家K缓冲液%KBuffer%K的更新次数KUpdate=1为估计更新数量%估计数=10结尾属性(ACCESS =私人)计数器= 1 YBuffer HBuffer结尾

构造函数

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

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

  • 创建按要求通过训练算法演员和评论家表示。欲了解更多信息,请参阅创建策略和值函数表示

  • 提供配置代理属性。

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

例如LQR客户代理构造者定义了连续的动作和观察空间,并创建了一个批判的表示。的createCritic函数是一个可选的辅助函数定义评论家表示。

作用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=初始值K;%初始化经验缓冲器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函数LQR客户代理构造函数。

作用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目的。要创建这样的表现,你必须指定手柄到自定义功能的基础上,在这种情况下,计算平方基函数。有关此评论家表示的更多信息,请参见列车自定义LQR代理

所需的功能

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

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

在您的实现的功能,来评估你的演员和评论家表示,你可以使用的getValuegetActiongetMaxQValue功能。

  • 为评价rlValueRepresentation评论家仅观测的输入信号,获得的状态值函数V使用以下语法。

    V=getValue(批评家、观察);
  • 为评价rlQValueRepresentation通过观察和动作输入信号,得到状态动作值函数使用以下语法。

    Q=getValue(批评家、[观察、行动]);
  • 为评价rlQValueRepresentation批评家只用观察输入信号,得到状态-动作值函数对于所有可能的离散操作,请使用以下语法。

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

    [MaxQ,MaxActionIndex]=getMaxQValue(批评家,观察);
  • 要评估一个行动者表示(随机表示RLDETerminyActorRepresentation),获得行动一个使用以下语法。

    A =的getAction(演员,观察);

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

getActionImpl作用

getActionImpl功能是评估您的代理政策,并选择一个动作。该函数必须具有以下签名,其中obj.是代理对象,观察目前的观察是,和行动是所选择的动作。

作用action=getActionImpl(对象,观察)

对于自定义LQR代理,通过应用选择的动作u=-Kx控制律。

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

getActionWithExplorationImpl作用

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

作用行动= getActionWithExplorationImpl(OBJ,观察)

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

作用行动= getActionWithExplorationImpl(OBJ,观察)%给定当前的观察,选择一个动作行动=的getAction(OBJ,观察);%随机噪声添加到行动num =大小(obj.R, 1);操作=操作+ 0.1*randn(num,1);结尾

learnImpl作用

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

作用action=learnImpl(obj,exp)

所述试剂的经验是在单元阵列EXP = {状态,行动,报酬,nextstate,isdone}

  • 状态是当前观察。

  • 行动这是当前的行动。

  • 奖励是当前的奖励。

  • nextState这是下一个观察结果。

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

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

作用action=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=size(obj.Q,1)+size(obj.R,1);%等待N更新评论家参数之前步骤N = obj.EstimateNum;H1 = computeQuadraticBasis(X,U,NUM);H2 = computeQuadraticBasis(DX,-obj.K * DX,NUM);H = H1  -  obj.Gamma * H2;如果obj.Counter <= N obj.YBuffer(obj.Counter)= Y;obj.HBuffer(obj.Counter,:) = H;obj.Counter = obj.Counter + 1;别的%更新基于该批次的评论家参数%经历H_buf = obj.HBuffer;y_buf = obj.YBuffer;THETA =(H_buf '* H_buf)\ H_buf' * y_buf;obj.Critic = setLearnableParameters(obj.Critic,{THETA});基于新的评论家参数%导出新增益矩阵obj.K=getNewK(obj);重置经验缓冲区obj.Counter=1;obj.YBuffer=0(N,1);obj.HBuffer=0(N,0.5*num*(num+1));obj.KUpdate=obj.KUpdate+1;obj.KBuffer{obj.KUpdate}=obj.K;结尾找到并返回一个带有探索的动作行动= getActionWithExploration(OBJ,EXP {4});结尾

可选功能

或者,您可以通过指定定义代理如何重置在训练开始resetImpl函数的签名如下obj.是代理对象。使用此功能,您可以设置代理到训练之前已知的或随机的条件。

作用resetImpl (ob)

此外,您还可以根据需要在您的自定义代理类中定义的任何其他辅助功能。例如,自定义LQR剂限定一createCritic功能用于创建评论家表示和getNewK功能派生从训练有素的影评参数反馈增益矩阵。

创建自定义代理

在定义自定义代理类,在MATLAB工作区创建它的一个实例。例如,创建自定义LQR剂,定义RInitialK值并调用构造函数。

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

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

也可以看看

相关话题