exponenta event banner

Создание пользовательских агентов обучения по усилению

Для реализации собственных алгоритмов обучения усилению можно создать пользовательский агент, создав подкласс класса пользовательского агента. Затем этот агент можно обучить и смоделировать в средах MATLAB ® и Simulink ®. Дополнительные сведения о создании классов в MATLAB см. в разделе Определяемые пользователем классы.

Создать класс шаблона

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

addpath(fullfile(matlabroot,'examples','rl','main'));
edit LQRCustomAgent.m

После сохранения класса в собственной рабочей папке можно удалить файлы примеров из пути.

rmpath(fullfile(matlabroot,'examples','rl','main'));

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

classdef LQRCustomAgent < rl.agent.CustomAgent

Для определения агента необходимо указать следующее:

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

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

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

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

  • Требуемые методы агента

  • Необязательные методы агента

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

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

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

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

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

  • Размеры мини-партий для отбора проб из буфера опыта

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

Дополнительные сведения о потенциальных свойствах агента см. в разделе Объекты опций для встроенных агентов 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.

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

  • Настраивает свойства агента.

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

Например, 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

Представление актера и критика

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

Например, пользовательский агент LQR использует критическое представление, хранящееся в его Critic собственность, и ни одного актера. Создание критика реализовано в createCritic вспомогательная функция, которая вызывается из 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 = rlQValueRepresentation({@(x,u) computeQuadraticBasis(x,u,n),w0},...
        getObservationInfo(obj),getActionInfo(obj));
    critic.Options.GradientThreshold = 1;
end

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

Обязательные функции

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

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

В рамках функций реализации для оценки представлений актера и критика можно использовать getValue, getAction, и getMaxQValue функции.

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

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

    Q = getValue(Critic,[Observation,Action]);
  • Оценка rlQValueRepresentation критик только с входными сигналами наблюдения, получить функцию значения состояния-действия Q для всех возможных дискретных действий с использованием следующего синтаксиса.

    Q = getValue(Critic,Observation);
  • Пространство дискретного действия rlQValueRepresentation критик, получить функцию максимального значения состояния Q-действия Q для всех возможных дискретных действий с использованием следующего синтаксиса.

    [MaxQ,MaxActionIndex] = getMaxQValue(Critic,Observation);
  • Оценка представления актера (rlStochasticActorRepresentation или rlDeterministicActorRepresentation), получить действие A используя следующий синтаксис.

    A = getAction(Actor,Observation);

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

getActionImpl Функция

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

function action = getActionImpl(obj,Observation)

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

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 the 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;
        obj.Critic = setLearnableParameters(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 см. в разделе Подготовка настраиваемого агента LQR.

См. также

Связанные темы