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

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

Создание класса шаблона

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

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

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

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

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

classdef LQRCustomAgent < rl.agent.CustomAgent

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

The 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 конструктор задает непрерывные пространства действий и наблюдений и создает представление критика. The 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 функция. Для получения дополнительной информации об этом представлении критика смотрите Train Custom LQR Agent.

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

Чтобы создать пользовательского агента обучения с подкреплением, необходимо задать следующие функции реализации. Чтобы вызвать эти функции в собственном коде, используйте методы wrapper из абстрактного базового класса. Например, чтобы вызвать 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 Функция

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

function action = getActionImpl(obj,Observation)

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

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

getActionWithExplorationImpl Функция

The 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 Функция

The 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 см. в разделе Train пользовательского агента LQR.

См. также

Похожие темы