Для реализации собственных алгоритмов обучения усилению можно создать пользовательский агент, создав подкласс класса пользовательского агента. Затем этот агент можно обучить и смоделировать в средах MATLAB ® и Simulink ®. Дополнительные сведения о создании классов в MATLAB см. в разделе Определяемые пользователем классы.
Для определения пользовательского агента сначала создайте класс, который является подклассом rl.agent.CustomAgent класс. В качестве примера в этом разделе описывается пользовательский агент LQR, обученный работе с агентом Train Custom LQR. В качестве отправной точки для собственного агента можно открыть и изменить этот класс настраиваемого агента. Чтобы добавить файлы примеров к пути MATLAB и открыть файл, в командной строке MATLAB введите следующий код.
addpath(fullfile(matlabroot,'examples','rl','main')); edit LQRCustomAgent.m
После сохранения класса в собственной рабочей папке можно удалить файлы примеров из пути.
rmpath(fullfile(matlabroot,'examples','rl','main'));
Этот класс имеет следующее определение класса, которое указывает имя класса агента и связанного абстрактного агента.
classdef LQRCustomAgent < rl.agent.CustomAgentДля определения агента необходимо указать следующее:
Свойства агента
Функция конструктора
Критическое представление, которое оценивает дисконтированное долгосрочное вознаграждение (если требуется для обучения)
Представление актера, которое выбирает действие на основе текущего наблюдения (если требуется для обучения)
Требуемые методы агента
Необязательные методы агента
В properties в разделе файла класса укажите любые параметры, необходимые для создания и обучения агента. Эти параметры могут включать в себя:
Коэффициент дисконтирования для дисконтирования будущих вознаграждений
Параметры конфигурации для моделей исследования, таких как модели шума или эпсилон-жадные исследования
Использование буферов для использования памяти воспроизведения
Размеры мини-партий для отбора проб из буфера опыта
Количество шагов, которые необходимо выполнить во время обучения
Дополнительные сведения о потенциальных свойствах агента см. в разделе Объекты опций для встроенных агентов 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 выберите действие, применив закон управления u = -Kx.
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 определите 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.