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