主要内容

创建自定义强化学习代理

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

创建模板类

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

目录(fullfile (matlabroot,“例子”,“rl”,“主要”));编辑LQRCustomAgent.m

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

rmpath (fullfile (matlabroot,“例子”,“rl”,“主要”));

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

classdefLQRCustomAgent < rl.agent.CustomAgent

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

  • 代理的属性

  • 构造函数

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

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

  • 需要代理的方法

  • 可选代理方法

代理的属性

属性在类文件的第节中,指定创建和培训代理所需的任何参数。这些参数可以包括:

  • 贴现未来奖励的贴现因子

  • 勘探模型的配置参数,如噪声模型或epsilon贪婪勘探

  • 使用重放内存的经验缓冲

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

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

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

这个rl.Agent.CustomAgent类已经包含代理示例时间的属性(SampleTime)以及行动和观察规范(ActionInfoObservationInfo分别)。

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

属性%问QR %R%反馈增益K%的折扣因素伽马=0.95%的批评家批评家%K缓冲区KBuffer% K的更新数KUpdate = 1%估计值更新的数字EstimateNum = 10结束YBuffer HBuffer . properties (Access = private) Counter = 1结束

构造函数

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

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

函数obj=LQRCustomAgent(Q、R、首字母K)%检查输入参数的数量narginchk(3,3);%调用抽象类构造函数obj = obj@rl.agent.CustomAgent ();设置Q和R矩阵对象Q=Q;对象R=R;%定义观察和行动空间obj.ObservationInfo=rlNumericSpec([size(Q,1),1]);obj.ActionInfo=rlNumericSpec([size(R,1),1]);%创建批评家表示obj。评论家= createCritic (obj);%初始化增益矩阵obj。K= InitialK;%初始化经验缓冲区obj.YBuffer=zeros(obj.EstimateNum,1);num=size(Q,1)+size(R,1);obj.HBuffer=zeros(obj.EstimateNum,0.5*num*(num+1));obj.KBuffer=cell(11000);obj.KBuffer{1}=obj.K;结束

演员和评论家代表

如果您的学习算法使用评论家表示来估计长期回报,或者使用参与者来选择动作,或者两者都使用,那么您必须将它们添加为代理属性。然后,您必须在创建代理时创建这些表示;也就是说,在构造函数中。有关创建演员和评论家的更多信息,请参见创建策略和价值功能表示

例如,自定义LQR代理使用批评家表示,存储在其批评家属性,并且没有参与者。批评家创建是在创作评论家helper函数,从LQRCustomAgent构造器。

函数critic=createCritic(obj)nQ=size(obj.Q,1);nR=size(obj.R,1);n=nQ+nR;w0=0.1*one(0.5*(n+1)*n,1);critic=rlQValueRepresentation({@(x,u)计算平方基(x,u,n),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使用以下语法。

    Q = getValue(评论家,(观察、行动));
  • 评估一个rlQValueRepresentation只需观察输入信号,即可得到状态动作值函数Q对于所有可能的离散操作,请使用以下语法。

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

    [MaxQ, MaxActionIndex] = getMaxQValue(评论家,观察);
  • 评价演员的表现(rlStochasticActorRepresentationrlDeterministicActorRepresentation),获取操作A.使用以下语法。

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

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

getActionImpl函数

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

函数action = getActionImpl (obj,观察)

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

函数action = getActionImpl (obj,观察)%给定系统的当前状态,返回操作action = -obj.K *观察{:};结束

getActionWithExplorationImpl函数

这个getActionWithExplorationImpl函数使用代理的探索模型选择操作。使用此函数,您可以实现算法,如epsilon贪婪探索。此函数必须具有以下签名,其中obj是代理对象,观察是当前的观察结果,以及行动是选定的操作。

函数action = getActionWithExplorationImpl (obj,观察)

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

函数action = getActionWithExplorationImpl (obj,观察)%根据当前观察结果,选择一个操作action = getAction (obj,观察);%在动作中添加随机噪音num=大小(对象R,1);action=action+0.1*randn(num,1);结束

learnImpl函数

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

函数action = learnImpl (obj,经验值)

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

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

  • 行动是当前的动作。

  • 奖励是当前的奖励。

  • nextState是下一个观察。

  • 伊斯通是一个逻辑标志,指示训练集已完成。

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

函数action = learnImpl (obj,经验值)%解析经验输入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。γ* 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 = 0 (N, 1);obj。HBuffer = 0 (N, 0.5 * num * (num + 1));obj。KUpdate = obj.KUpdate + 1; obj.KBuffer{obj.KUpdate} = obj.K;结束%通过探索找到并返回一个动作action = getActionWithExploration (obj, exp {4});结束

可选功能

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

函数resetImpl (ob)

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

创建自定义代理

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

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

另请参阅

相关的话题