主要内容

创建自定义强化学习代理

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

创建模板类

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

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

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

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

该类具有以下类定义,该类定义指出代理类名和关联的抽象代理。

classdefLQRCustomAgent < rl.agent.CustomAgent

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

  • 代理的属性

  • 构造函数

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

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

  • 所需的代理方法

  • 可选代理方法

代理的属性

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

  • 贴现因子用于贴现未来奖励

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

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

  • 从经验缓冲区中抽样的小批量大小

  • 在训练过程中,要向前看的步数

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

rl.Agent.CustomAgent类已包含代理采样时间的属性(SampleTime)及动作及观察规格(ActionInfo而且ObservationInfo分别)。

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

属性%问R %R%反馈增益K折扣率%= 0.95%的批评家评论家% K缓冲KBuffer% K的更新次数KUpdate = 1%用于估计器更新的数字EstimateNum = 10结束property (Access = private) Counter = 1 YBuffer HBuffer结束

构造函数

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

  • 定义动作和观察规范。有关创建这些规范的详细信息,请参见rlNumericSpec而且rlFiniteSetSpec

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

  • 配置agent属性。

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

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

函数obj = LQRCustomAgent(Q,R,InitialK)检查输入参数的数量narginchk (3,3);调用抽象类构造函数obj = obj@rl.agent.CustomAgent();设置Q和R矩阵obj。问= Q; obj.R = R;定义观察和行动空间obj。ObservationInfo = rlNumericSpec([size(Q,1),1]);obj。一个ctionInfo = rlNumericSpec([size(R,1),1]);创建评论家表示obj。批评家= 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构造函数。

函数批评家= createCritic(obj) nQ = size(obj. q,1);nR = size(obj.R,1);n = nQ+nR;W0 = 0.1*ones(0.5*(n+1)*n,1);rlQValueRepresentation({@(x,u) computeQuadraticBasis(x,u,n),w0},...getObservationInfo (obj) getActionInfo (obj));critical . options . gradientthreshold = 1;结束

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

所需的功能

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

函数 描述
getActionImpl 通过计算给定观察的代理策略来选择操作
getActionWithExplorationImpl 使用代理的探索模型选择一个操作
learnImpl 从当前的经验中学习,并通过探索返回一个动作

在实现函数中,要评估参与者和评论家表示形式,可以使用getValuegetAction,getMaxQValue功能。

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

    V = getValue(评论家,观察);
  • 评估rlQValueRepresentation同时对观测和动作输入信号进行分析,得到状态-动作值函数使用以下语法。

    Q = getValue(批评,[观察,行动]);
  • 评估rlQValueRepresentation仅用观测输入信号进行判别,得到状态-动作值函数对于所有可能的离散操作,使用以下语法。

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

    [MaxQ,MaxActionIndex] = getMaxQValue(批评家,观察);
  • 评估参与者表示(rlStochasticActorRepresentationrlDeterministicActorRepresentation),获取动作一个使用以下语法。

    A = getAction(Actor,Observation);

对于每一种情况,如果你的演员或评论家网络使用循环神经网络,函数也可以在获得相应的网络输出后返回网络状态的当前值。

getActionImpl函数

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

函数action = getActionImpl(obj,观察)

属性选择操作,以用于自定义LQR代理u= -Kx控制律。

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

getActionWithExplorationImpl函数

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

函数action = getActionWithExplorationImpl(obj,Observation)

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

函数action = getActionWithExplorationImpl(obj,Observation)给定当前的观察结果,选择一个动作action = getAction(obj,观察);为动作添加随机噪音num = size(obj.R,1);动作=动作+ 0.1*randn(num,1);结束

learnImpl函数

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

函数action = learnImpl(obj,exp)

代理体验是单元格数组Exp ={状态,动作,奖励,下一个状态,已完成}

  • 状态是当前的观测值。

  • 行动是当前动作。

  • 奖励是当前的奖励。

  • nextState是下一个观察结果。

  • 结束指示训练集已完成的逻辑标志。

对于自定义LQR代理,每次都会更新关键参数N步骤。

函数action = learnImpl(obj,exp)解析经验输入X = exp{1}{1};U = exp{2}{1};Dx = exp{4}{1};Y = (x'*obj.)问*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;theta = (H_buf'*H_buf)\H_buf'*y_buf;obj。批评家= setLearnableParameters(obj.批评家,{theta});根据新的临界参数推导出新的增益矩阵obj。K= getNewK(obj);重置经验缓冲区obj。计数器= 1;obj。y = 0 (N,1);obj。HBuffer = 0 (N,0.5*num*(num+1));obj。KUpdate = obj.KUpdate + 1; obj.KBuffer{obj.KUpdate} = obj.K;结束使用探索查找并返回一个动作action = getactionwitheexploration (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]);agent = LQRCustomAgent(Q,R,K0);

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

另请参阅

相关的话题