Чтобы реализовать свои собственные пользовательские алгоритмы обучения с подкреплением, можно создать пользовательского агента, создав подкласс пользовательского класса агента. Затем можно обучить и симулировать этого агента в 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.