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