Пользовательские агенты

Чтобы реализовать ваши собственные алгоритмы изучения укрепления, можно создать пользовательский агент путем создания подкласса пользовательского класса агента. Для получения дополнительной информации о создании классов MATLAB®, смотрите Пользовательские Классы (MATLAB).

Создайте шаблонный класс

Чтобы задать ваш пользовательский агент, сначала создайте класс, который является подклассом класса rl.agent.CustomAgent. Как пример, эта тема описывает пользовательский агент LQR, обученный в Train Пользовательский Агент LQR. Как отправная точка для вашего собственного агента, можно открыть и изменить этот пользовательский класс агента. Для этого добавьте файлы в качестве примера в путь и откройте файл. В окне команды MATLAB введите:

edit LQRCustomAgent.m

Этот класс имеет следующее определение класса, которое указывает на имя класса агента и связанный абстрактный агент.

classdef LQRCustomAgent < rl.agent.CustomAgent

Чтобы задать ваш агент, необходимо задать следующее:

  • Свойства агента

  • Функция конструктора

  • Представление критика, которое оценивает обесцененное долгосрочное вознаграждение (при необходимости для изучения)

  • Представление агента, которое выбирает действие на основе текущего наблюдения (при необходимости для изучения)

  • Необходимые методы агента

  • Дополнительные методы агента

Свойства агента

В разделе properties файла класса задайте любые параметры, необходимые для создания и обучения агент. Эти параметры могут включать:

  • Коэффициент дисконтирования для дисконтирования будущих вознаграждений

  • Параметры конфигурации для моделей исследования, таких как шумовые модели или жадное эпсилоном исследование

  • Испытайте буферы для использования памяти воспроизведения

  • Мини-пакетные размеры для выборки от буфера опыта

  • Количество шагов, чтобы смотреть вперед во время обучения

Для получения дополнительной информации о потенциальных свойствах агента смотрите наборы опции для встроенных агентов Reinforcement Learning Toolbox™.

Класс rl.Agent.CustomAgent уже включает свойства для шага расчета агента (SampleTime) и спецификации действия и наблюдения (ActionInfo и ObservationInfo, соответственно).

Пользовательский агент LQR задает следующие свойства агента.

properties
    % Q
    Q

    % R
    R

    % Feedback gain
    K

    % Discount Factor
    Gamma = 0.95

    % Critic
    Critic

    % Buffer for K
    KBuffer  
    % Number of updates for K
    KUpdate = 1

    % Number for estimator update
    EstimateNum = 10
end

properties (Access = private)
    Counter = 1
    YBuffer
    HBuffer 
end

Функция конструктора

Чтобы создать ваш пользовательский агент, необходимо задать функцию конструктора что:

  • Задает спецификации действия и наблюдения. Для получения дополнительной информации о создании этих спецификаций, смотрите rlNumericSpec и rlFiniteSetSpec.

  • Создает агента и представления критика как требуется вашим учебным алгоритмом. Для получения дополнительной информации смотрите rlRepresentation.

  • Конфигурирует свойства агента.

  • Вызывает конструктора основного абстрактного класса.

Например, конструктор LQRCustomAgent задает непрерывное действие и пространства наблюдений и создает представление критика. Функция createCritic является дополнительной функцией помощника, используемой для определения представления критика.

function obj = LQRCustomAgent(Q,R,InitialK)
    % Check the number of input arguments
    narginchk(3,3);

    % Call the abstract class constructor
    obj = obj@rl.agent.CustomAgent();

    % Set the Q and R matrices
    obj.Q = Q;
    obj.R = R;

    % Define the observation and action spaces
    obj.ObservationInfo = rlNumericSpec([size(Q,1),1]);
    obj.ActionInfo = rlNumericSpec([size(R,1),1]);

    % Create the critic representation
    obj.Critic = createCritic(obj);

    % Initialize the gain matrix
    obj.K = InitialK;

    % Initialize the experience buffers
    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(1,1000);
    obj.KBuffer{1} = obj.K;
end
end

Агент и представления критика

Если ваше приобретение знаний алгоритма использует представление критика, чтобы оценить долгосрочное вознаграждение, агента для выбора действия или обоих, необходимо добавить их как свойства агента. Необходимо затем создать эти представления, когда вы создаете свой агент; то есть, в функции конструктора. Для получения дополнительной информации о создании агентов и критиков, смотрите, Создают политику и Представления Функции Значения.

Например, пользовательский агент LQR использует представление критика, сохраненное в его свойстве Critic и никаком агенте. Создание критика реализовано в функции помощника getCritic, которая вызвана от конструктора LQRCustomAgent.

function critic = 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);
    critic = rlRepresentation(@(x,u) computeQuadraticBasis(x,u,n),w0,...
        getObservationInfo(obj),getActionInfo(obj));
    critic.Options.GradientThreshold = 1;
    critic = critic.setLoss('mse');
end

В этом случае критик является созданным использованием объекта rlLinearBasisRepresentation функции rlRepresentation. Чтобы создать такое представление, необходимо задать указатель на пользовательскую основную функцию, которая в этом случае является функцией computeQuadraticBasis. Для получения дополнительной информации об этом представлении критика смотрите Train Пользовательский Агент LQR.

Необходимые функции

Чтобы создать пользовательский агент изучения укрепления, необходимо задать следующие функции реализации. Чтобы вызвать эти функции в вашем собственном коде, используйте методы обертки от абстрактного базового класса. Например, чтобы вызвать getActionImpl, используйте getAction. Методы обертки имеют те же аргументы ввода и вывода как методы внедрения.

ФункцияОписание
getActionImplВыбирает действие путем оценки политики агента для данного наблюдения.
getActionWithExplorationImplВыбирает действие с помощью модели исследования агента
learnImplУчится на текущем опыте и возвращает действие с исследованием

В ваших функциях реализации, чтобы оценить вашего агента и представления критика, можно использовать функцию evaluate. Оценивать:

  • Критик только с входными сигналами наблюдения, получите функцию значения использование V:

    V = evaluate(this.Critic,Observation);
  • Критик и с входными сигналами наблюдения и с действия, получите функцию Q использование Q:

    Q = evaluate(this.Critic,[Observation,Action]);
  • Агент с непрерывным пробелом действия, получите значение действия использование A:

    A = evaluate(this.Actor,Observation);

    Если агент имеет непрерывный пробел действия, A содержит значения сигналов действия. Если агент имеет дискретный пробел действия, A содержит вероятность принятия каждых мер.

Для предыдущих команд синтаксисов Observation и Action являются массивами ячеек.

Функция getActionImpl

Функция getActionImpl используется, чтобы оценить политику вашего агента и выбрать действие. Эта функция должна иметь следующую подпись, где obj является объектом агента, Observation является текущим наблюдением, и action является выбранным действием.

function action = getActionImpl(obj,Observation)

Для пользовательского агента LQR вы выбираете действие путем применения закона о надзоре =-Kx u.

function action = getActionImpl(obj,Observation)
    % Given the current state of the system, return an action.
    action = -obj.K*Observation{:};
end

Функция getActionWithExplorationImpl

Функция getActionWithExplorationImpl выбирает действие с помощью модели исследования агента. Используя эту функцию можно реализовать алгоритмы, такие как жадное эпсилоном исследование. Эта функция должна иметь следующую подпись, где obj является объектом агента, Observation является текущим наблюдением, и action является выбранным действием.

function action = getActionWithExplorationImpl(obj,Observation)

Для пользовательского агента LQR функция getActionWithExplorationImpl добавляет случайный белый шум в действие, выбранное с помощью текущей политики агента.

function action = getActionWithExplorationImpl(obj,Observation)
    % Given the current observation, select an action
    action = getAction(obj,Observation);
    
    % Add random noise to the action
    num = size(obj.R,1);
    action = action + 0.1*randn(num,1);
end

Функция learnImpl

Функция learnImpl задает, как агент учится на текущем опыте. Эта функция реализует пользовательский алгоритм изучения вашего агента путем обновления параметров политики и выбора действия с исследованием. Эта функция должна иметь следующую подпись, где obj является объектом агента, exp является текущим опытом агента, и action является выбранным действием.

function action = learnImpl(obj,exp)

Опыт агента, массив ячеек exp = {state,action,reward,nextstate,isdone}. Здесь:

  • state является текущим наблюдением.

  • action является текущим действием.

  • reward является текущим вознаграждением.

  • nextState является следующим наблюдением.

  • isDone является логическим флагом, указывающим, что учебный эпизод завершен.

Для пользовательского агента LQR параметры критика обновляются каждый N шаги.

function action = learnImpl(obj,exp)
    % Parse the experience input
    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);

    % Wait N steps before updating critic parameters
    N = obj.EstimateNum;
    h1 = computeQuadraticBasis(x,u,num);
    h2 = computeQuadraticBasis(dx,-obj.K*dx,num);
    H = h1 - obj.Gamma* h2;
    if obj.Counter<=N
        obj.YBuffer(obj.Counter) = y;
        obj.HBuffer(obj.Counter,:) = H;
        obj.Counter = obj.Counter + 1;
    else
        % Update the critic parameters based on the batch of
        % experiences
        H_buf = obj.HBuffer;
        y_buf = obj.YBuffer;
        theta = (H_buf'*H_buf)\H_buf'*y_buf;
        setLearnableParameterValues(obj.Critic,{theta});
        
        % Derive a new gain matrix based on the new critic parameters
        obj.K = getNewK(obj);
        
        % Reset the experience buffers
        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;
    end

    % Find and return an action with exploration
    action = getActionWithExploration(obj,exp{4});
end

Дополнительные функции

Опционально, можно задать, как агент сбрасывается в начале обучения путем определения функции resetImpl со следующей функциональной подписью, где obj является объектом агента. Используя эту функцию, можно установить агент в знание или случайное условие перед обучением.

function resetImpl(ob)

Кроме того, можно задать любые другие функции помощника в пользовательском классе агента как требуется. Например, пользовательский агент LQR задает функцию createCritic для создания представления критика и функции getNewK, которая выводит матрицу усиления обратной связи от обученных параметров критика.

Создайте пользовательский агент

Если вы задали свой пользовательский класс агента, создайте экземпляр его в рабочем пространстве MATLAB. Например, чтобы создать пользовательский агент LQR, задайте Q, R, значения InitialK, и вызовите функцию конструктора.

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

После проверки объекта среды можно использовать его, чтобы обучить агент изучения укрепления. Для примера, который обучает пользовательский агент LQR, смотрите Train Пользовательский Агент LQR.

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте