exponenta event banner

rlACAgent

Актерско-критический агент по обучению

Описание

Агенты актеров-критиков (AC) реализуют алгоритмы актеров-критиков, такие как A2C и A3C, которые являются безмодельными, онлайновыми методами обучения укреплению политики. Агент актера-критика оптимизирует политику (актера) напрямую и использует критика для оценки отдачи или будущих вознаграждений. Пространство действия может быть дискретным или непрерывным.

Дополнительные сведения см. в разделе Агенты актера-критика. Дополнительные сведения о различных типах агентов обучения усилению см. в разделе Агенты обучения усилению.

Создание

Описание

Создание агента из спецификаций наблюдения и действий

пример

agent = rlACAgent(observationInfo,actionInfo) создает агента-исполнителя для среды с заданными спецификациями наблюдения и действия, используя опции инициализации по умолчанию. Представления актера и критика в агенте используют глубокие нейронные сети по умолчанию, построенные из спецификации наблюдения observationInfo и спецификацию действия actionInfo.

пример

agent = rlACAgent(observationInfo,actionInfo,initOpts) создает актера-критика для среды с заданными характеристиками наблюдения и действия. Агент использует сети по умолчанию, в которых каждый скрытый полностью подключенный уровень имеет количество единиц, указанное в initOpts объект. Агенты актера-критика не поддерживают рецидивирующие нейронные сети. Дополнительные сведения о параметрах инициализации см. в разделе rlAgentInitializationOptions.

Создание агента из представлений актера и критика

пример

agent = rlACAgent(actor,critic) создает агента актера-критика с указанным актером и критиком, используя параметры по умолчанию для агента.

Укажите параметры агента

пример

agent = rlACAgent(___,agentOptions) создает агента актера-критика и задает свойству AgentOptions значение agentOptions входной аргумент. Используйте этот синтаксис после любого из входных аргументов в предыдущих синтаксисах.

Входные аргументы

развернуть все

Спецификации наблюдения, определяемые как объект спецификации обучения армированию или массив объектов спецификации, определяющих такие свойства, как размеры, тип данных и имена сигналов наблюдения.

Вы можете извлечь observationInfo из существующей среды или агента с использованием getObservationInfo. Можно также создать спецификации вручную с помощью rlFiniteSetSpec или rlNumericSpec.

Спецификации действий, определяемые как объект спецификации обучения армированию, определяющий такие свойства, как размеры, тип данных и имена сигналов действий.

Для дискретного пространства действий необходимо указать actionInfo как rlFiniteSetSpec объект.

Для непрерывного пространства действий необходимо указать actionInfo как rlNumericSpec объект.

Вы можете извлечь actionInfo из существующей среды или агента с использованием getActionInfo. Можно также создать спецификацию вручную с помощью rlFiniteSetSpec или rlNumericSpec.

Параметры инициализации агента, указанные как rlAgentInitializationOptions объект. Агенты актера-критика не поддерживают рецидивирующие нейронные сети.

Сетевое представление актера для политики, указанное как rlStochasticActorRepresentation объект. Дополнительные сведения о создании представлений актера см. в разделе Создание представлений политик и функций значений.

Критическое сетевое представление для оценки дисконтированного долгосрочного вознаграждения, указанного как rlValueRepresentation объект. Дополнительные сведения о создании представлений критиков см. в разделе Создание представлений политик и функций значений.

Свойства

развернуть все

Параметры агента, указанные как rlACAgentOptions объект.

Функции объекта

trainПодготовка обучающих агентов по усилению в определенной среде
simМоделирование обученных агентов по обучению подкреплению в определенной среде
getActionПолучить действие от агента или актора при наблюдении за окружающей средой
getActorПолучение представления актера от обучающего агента усиления
setActorЗадать представление актора обучающего агента усиления
getCriticПолучение критического представления от агента обучения усиления
setCriticЗадать критическое представление агента обучения усилению
generatePolicyFunctionСоздание функции, оценивающей обученную политику усиления агента обучения

Примеры

свернуть все

Создайте среду с дискретным пространством действий и получите ее характеристики наблюдения и действия. В этом примере загрузите среду, используемую в примере Создание агента с помощью Deep Network Designer и Обучение с помощью наблюдений за изображениями. Эта среда имеет два наблюдения: изображение в градациях серого 50 на 50 и скаляр (угловая скорость маятника). Действие представляет собой скаляр с пятью возможными элементами (крутящий момент либо -2, -1, 0, 1, или 2 Нм применяется к качающемуся полюсу).

% load predefined environment
env = rlPredefinedEnv("SimplePendulumWithImage-Discrete");

% obtain observation and action specifications
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Функция создания агента произвольно инициализирует сеть актера и критика. Можно обеспечить воспроизводимость, зафиксировав начальное число случайного генератора. Для этого раскомментируйте следующую строку.

% rng(0)

Создание агента-исполнителя-критика из спецификаций наблюдения за окружающей средой и действий.

agent = rlACAgent(obsInfo,actInfo);

Для проверки агента используйте getAction для возврата действия из случайного наблюдения.

getAction(agent,{rand(obsInfo(1).Dimension),rand(obsInfo(2).Dimension)})
ans = 1x1 cell array
    {[-2]}

Теперь можно тестировать и обучать агента в среде.

Создание среды с непрерывным пространством действий и получение ее характеристик наблюдения и действий. Для этого примера загрузите среду, используемую в примере Train DDPG Agent to Swing Up и Balance Pendulum with Image Observation. Эта среда имеет два наблюдения: изображение в градациях серого 50 на 50 и скаляр (угловая скорость маятника). Действие представляет собой скаляр, представляющий крутящий момент в диапазоне от -2 кому 2 Нм.

% load predefined environment
env = rlPredefinedEnv("SimplePendulumWithImage-Continuous");

% obtain observation and action specifications
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Создание объекта параметра инициализации агента, указывающего, что каждый скрытый полностью подключенный уровень в сети должен иметь 128 нейроны (вместо номера по умолчанию, 256). Агенты актера-критика не поддерживают повторяющиеся сети, поэтому установка UseRNN опция для true создает ошибку при создании агента.

initOpts = rlAgentInitializationOptions('NumHiddenUnit',128);

Функция создания агента произвольно инициализирует сеть актера и критика. Можно обеспечить воспроизводимость, зафиксировав начальное число случайного генератора. Для этого раскомментируйте следующую строку.

% rng(0)

Создание агента-исполнителя-критика из спецификаций наблюдения за окружающей средой и действий.

agent = rlACAgent(obsInfo,actInfo,initOpts);

Сократите уровень обучения критиков до 1e-3.

critic = getCritic(agent);
critic.Options.LearnRate = 1e-3;
agent  = setCritic(agent,critic);

Извлеките глубокие нейронные сети как из актера-агента, так и из критика.

actorNet = getModel(getActor(agent));
criticNet = getModel(getCritic(agent));

Отображение уровней критической сети и проверка того, что каждый скрытый полностью связанный уровень имеет 128 нейронов

criticNet.Layers
ans = 
  12x1 Layer array with layers:

     1   'concat'               Concatenation       Concatenation of 2 inputs along dimension 3
     2   'relu_body'            ReLU                ReLU
     3   'fc_body'              Fully Connected     128 fully connected layer
     4   'body_output'          ReLU                ReLU
     5   'input_1'              Image Input         50x50x1 images
     6   'conv_1'               Convolution         64 3x3x1 convolutions with stride [1  1] and padding [0  0  0  0]
     7   'relu_input_1'         ReLU                ReLU
     8   'fc_1'                 Fully Connected     128 fully connected layer
     9   'input_2'              Image Input         1x1x1 images
    10   'fc_2'                 Fully Connected     128 fully connected layer
    11   'output'               Fully Connected     1 fully connected layer
    12   'RepresentationLoss'   Regression Output   mean-squared-error

Сюжетный актер и сети критиков

plot(actorNet)

Figure contains an axes. The axes contains an object of type graphplot.

plot(criticNet)

Figure contains an axes. The axes contains an object of type graphplot.

Для проверки агента используйте getAction для возврата действия из случайного наблюдения.

getAction(agent,{rand(obsInfo(1).Dimension),rand(obsInfo(2).Dimension)})
ans = 1x1 cell array
    {[0.9228]}

Теперь можно тестировать и обучать агента в среде.

Создайте среду с дискретным пространством действий и получите ее характеристики наблюдения и действия. В этом примере загрузите среду, используемую в примере Train DQN Agent to Balance Cart-Pole System. Эта среда имеет четырёхмерный вектор наблюдения (положение и скорость тележки, угол полюса и производная угла полюса) и скалярное действие с двумя возможными элементами (сила одного из них -10 или +10 N нанесено на тележку).

% load predefined environment
env = rlPredefinedEnv("CartPole-Discrete");

% obtain observation specifications
obsInfo = getObservationInfo(env)
obsInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "CartPole States"
    Description: "x, dx, theta, dtheta"
      Dimension: [4 1]
       DataType: "double"

% obtain action specifications
actInfo = getActionInfo(env)
actInfo = 
  rlFiniteSetSpec with properties:

       Elements: [-10 10]
           Name: "CartPole Action"
    Description: [0x0 string]
      Dimension: [1 1]
       DataType: "double"

Функция создания агента произвольно инициализирует сеть актера и критика. Можно обеспечить воспроизводимость, зафиксировав начальное число случайного генератора. Для этого раскомментируйте следующую строку.

% rng(0)

Создайте критическое представление.

% create the network to use as the approximator in the critic
% must have a 4-dimensional input (4 observations) and a scalar output (value)
criticNetwork = [
    imageInputLayer([4 1 1],'Normalization','none','Name','state')
    fullyConnectedLayer(1,'Name','CriticFC')];

% set options for the critic
criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

% create the critic (actor-critic agents use a value function representation)
critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);

Создание представления актера.

% create the network to use as approximator in the actor
% must have a 4-dimensional input and a 2-dimensional output (action)
actorNetwork = [
    imageInputLayer([4 1 1],'Normalization','none','Name','state')
    fullyConnectedLayer(2,'Name','action')];

% set options for the actor
actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

% create the actor (actor-critic agents use a stochastic actor representation)
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'state'},actorOpts);

Укажите параметры агента и создайте агент AC, используя актера, критика и объект параметров агента.

agentOpts = rlACAgentOptions('NumStepsToLookAhead',32,'DiscountFactor',0.99);
agent = rlACAgent(actor,critic,agentOpts)
agent = 
  rlACAgent with properties:

    AgentOptions: [1x1 rl.option.rlACAgentOptions]

Для проверки агента используйте getAction для возврата действия из случайного наблюдения.

getAction(agent,{rand(4,1)})
ans = 1x1 cell array
    {[-10]}

Теперь можно тестировать и обучать агента в среде.

Создание среды с непрерывным пространством действий и получение ее характеристик наблюдения и действий. Для этого примера загрузите среду непрерывного действия двойного интегратора, используемую в примере Train DDPG Agent to Control Double Integrator System.

% load predefined environment
env = rlPredefinedEnv("DoubleIntegrator-Continuous");

% obtain observation specifications
obsInfo = getObservationInfo(env)
obsInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "states"
    Description: "x, dx"
      Dimension: [2 1]
       DataType: "double"

% obtain action specifications
actInfo = getActionInfo(env)
actInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "force"
    Description: [0x0 string]
      Dimension: [1 1]
       DataType: "double"

В этом примере действие является скалярным входом, представляющим силу в диапазоне от -2 кому 2 Ньютон, поэтому рекомендуется установить соответственно верхний и нижний предел сигнала действия. Это должно быть сделано, когда сетевое представление для субъекта имеет нелинейный выходной слой, который должен быть соответствующим образом масштабирован для получения выходного сигнала в требуемом диапазоне.

% make sure action space upper and lower limits are finite
actInfo.LowerLimit=-2;
actInfo.UpperLimit=2;

Сети актера и критика инициализируются случайным образом. Можно обеспечить воспроизводимость, зафиксировав начальное число случайного генератора. Для этого раскомментируйте следующую строку.

% rng(0)

Создайте критическое представление. Агенты актера-критика используют rlValueRepresentation для критика. Для пространств непрерывного наблюдения можно использовать либо глубокую нейронную сеть, либо пользовательское базисное представление. Для этого примера создайте глубокую нейронную сеть в качестве базового аппроксиматора.

% create the network to be used as approximator in the critic
% it must take the observation signal as input and produce a scalar value
criticNet = [
    imageInputLayer([obsInfo.Dimension 1],'Normalization','none','Name','state')
    fullyConnectedLayer(10,'Name', 'fc_in')
    reluLayer('Name', 'relu')
    fullyConnectedLayer(1,'Name','out')];

% set some training options for the critic
criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

% create the critic representation from the network
critic = rlValueRepresentation(criticNet,obsInfo,'Observation',{'state'},criticOpts);

Агенты актера-критика используют rlStochasticActorRepresentation. Для стохастических актёров, работающих в пространствах непрерывного действия, в качестве базового аппроксиматора можно использовать только глубокую нейронную сеть.

Входной сигнал наблюдения (здесь называемый myobs) должен принимать двумерный вектор, как указано в obsInfo. Выходные данные (здесь называемые myact) также должен быть двумерным вектором (в два раза больше числа размеров, указанных в actInfo). Элементы выходного вектора последовательно представляют все средства и все стандартные отклонения каждого действия (в этом примере имеется только одно среднее значение и одно стандартное отклонение).

Тот факт, что стандартные отклонения должны быть неотрицательными, в то время как средние значения должны находиться в пределах выходного диапазона, означает, что сеть должна иметь два отдельных пути. Первый путь предназначен для средних значений, и любая нелинейность выходного сигнала должна быть масштабирована так, чтобы он мог выдавать выходные сигналы в выходном диапазоне. Второй путь предназначен для стандартных отклонений, и для обеспечения неотрицательности необходимо использовать слой softplus или ReLU.

% input path layers (2 by 1 input and a 1 by 1 output)
inPath = [ 
    imageInputLayer([obsInfo.Dimension 1], 'Normalization','none','Name','state')
    fullyConnectedLayer(10,'Name', 'ip_fc')  % 10 by 1 output
    reluLayer('Name', 'ip_relu')             % nonlinearity
    fullyConnectedLayer(1,'Name','ip_out') ];% 1 by 1 output

% path layers for mean value (1 by 1 input and 1 by 1 output)
% use scalingLayer to scale the range
meanPath = [
    fullyConnectedLayer(15,'Name', 'mp_fc1') % 15 by 1 output
    reluLayer('Name', 'mp_relu')             % nonlinearity
    fullyConnectedLayer(1,'Name','mp_fc2');  % 1 by 1 output
    tanhLayer('Name','tanh');                % output range: (-1,1)
    scalingLayer('Name','mp_out','Scale',actInfo.UpperLimit) ]; % output range: (-2N,2N)

% path layers for standard deviation (1 by 1 input and output)
% use softplus layer to make output non negative
sdevPath = [
    fullyConnectedLayer(15,'Name', 'vp_fc1') % 15 by 1 output
    reluLayer('Name', 'vp_relu')             % nonlinearity
    fullyConnectedLayer(1,'Name','vp_fc2');  % 1 by 1 output
    softplusLayer('Name', 'vp_out') ];       % output range: (0,+Inf)

% concatenate two inputs (along dimension #3) to form a single (2 by 1) output layer
outLayer = concatenationLayer(3,2,'Name','mean&sdev');

% add layers to layerGraph network object
actorNet = layerGraph(inPath);
actorNet = addLayers(actorNet,meanPath);
actorNet = addLayers(actorNet,sdevPath);
actorNet = addLayers(actorNet,outLayer);

% connect layers: the mean value path output must be connected to the first input of the concatenation layer
actorNet = connectLayers(actorNet,'ip_out','mp_fc1/in');   % connect output of inPath to meanPath input
actorNet = connectLayers(actorNet,'ip_out','vp_fc1/in');   % connect output of inPath to sdevPath input
actorNet = connectLayers(actorNet,'mp_out','mean&sdev/in1');% connect output of meanPath to mean&sdev input #1
actorNet = connectLayers(actorNet,'vp_out','mean&sdev/in2');% connect output of sdevPath to mean&sdev input #2

% plot network 
plot(actorNet)

Figure contains an axes. The axes contains an object of type graphplot.

Укажите некоторые опции для актера и создайте стохастическое представление актера с помощью глубокой нейронной сети actorNet.

% set some training options for the actor
actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

% create the actor using the network
actor = rlStochasticActorRepresentation(actorNet,obsInfo,actInfo,...
    'Observation',{'state'},actorOpts);

Укажите параметры агента и создайте агент переменного тока с использованием параметров актера, критика и агента.

agentOpts = rlACAgentOptions('NumStepsToLookAhead',32,'DiscountFactor',0.99);
agent = rlACAgent(actor,critic,agentOpts)
agent = 
  rlACAgent with properties:

    AgentOptions: [1x1 rl.option.rlACAgentOptions]

Для проверки агента используйте getAction для возврата действия из случайного наблюдения.

getAction(agent,{rand(2,1)})
ans = 1x1 cell array
    {[0.6668]}

Теперь можно тестировать и обучать агента в среде.

В этом примере загрузите предварительно определенную среду, используемую в примере Train DQN Agent to Balance Cart-Pole System.

env = rlPredefinedEnv("CartPole-Discrete");

Получение информации о наблюдениях и действиях. Эта среда имеет четырёхмерный вектор наблюдения (положение и скорость тележки, угол полюса и производную угла полюса) и скалярное действие с двумя возможными элементами (сила либо -10, либо + 10 N, приложенная к тележке).

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Функция создания агента произвольно инициализирует сеть актера и критика. Можно обеспечить воспроизводимость, зафиксировав начальное число случайного генератора. Для этого раскомментируйте следующую строку.

% rng(0)

Чтобы создать повторяющуюся нейронную сеть для критика, используйте sequenceInputLayer в качестве входного уровня и включают lstmLayer как один из других сетевых уровней.

criticNetwork = [
    sequenceInputLayer(obsInfo.Dimension(1),'Normalization','none','Name','myobs')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')
    fullyConnectedLayer(1,'Name','CriticFC')];

Задайте опции для критика и создайте представление критика (агенты актера-критика используют представление функции значения).

criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'myobs'},criticOpts);

Создать нейронную сеть для актёра. Поскольку у критика есть повторяющаяся сеть, у актера должна быть и повторяющаяся сеть.

actorNetwork = [
    sequenceInputLayer(obsInfo.Dimension(1),'Normalization','none','Name','myobs')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')
    fullyConnectedLayer(numel(actInfo.Elements),'Name','action')];

Задание параметров для критика и создание представления актера

actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'myobs'},actorOpts);

Укажите параметры агента и создайте агент AC, используя актера, критика и объект параметров агента. Поскольку агент использует рецидивирующие нейронные сети, NumStepsToLookAhead рассматривается как длина учебной траектории.

agentOpts = rlACAgentOptions('NumStepsToLookAhead',32,'DiscountFactor',0.99);
agent = rlACAgent(actor,critic,agentOpts);

Для проверки агента используйте getAction для возврата действия из случайного наблюдения.

getAction(agent,{rand(obsInfo.Dimension)})
ans = 1×1 cell array
    {[-10]}

Теперь можно тестировать и обучать агента в среде.

Совет

  • Для непрерывных пространств действий: rlACAgent объект не применяет ограничения, заданные спецификацией действия, поэтому необходимо применять ограничения пространства действия в среде.

Представлен в R2019a