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

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

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

Чтобы задать вашего пользовательского агента, сначала создайте класс, который является подклассом rl.agent.CustomAgent класс. Как пример, эта тема описывает пользовательского агента LQR, обученного в, Обучают Пользовательского Агента LQR. Как начальная точка для вашего собственного агента, можно открыть и изменить этот пользовательский класс агента. Чтобы добавить файлы в качестве примера в путь 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™.

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 вы выбираете действие путем применения закона о надзоре =-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 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, задайте QR, и 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.

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

Похожие темы