rlACAgent

Агент обучения с подкреплением актёра-критика

Описание

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

Для получения дополнительной информации смотрите Агентов актёра-критика. Для получения дополнительной информации о различных типах агентов обучения с подкреплением смотрите Reinforcement Learning Agents.

Создание

Описание

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

пример

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 Nm приложен к качающемуся шесту).

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

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

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

% 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 and Balance Mendulum 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);

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

% 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, для балансировки системы тележки с шестом. Это окружение имеет четырехмерный вектор наблюдения (положение и скорость тележки, угол полюса и производная угла полюса) и скалярное действие с двумя возможными элементами (сила любого из них - 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"

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

% 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;

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

% 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. The выхода (здесь называется 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);

Задайте опции агента и создайте агента 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(2,1)})
ans = 1x1 cell array
    {[0.6668]}

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

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

env = rlPredefinedEnv("CartPole-Discrete");

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

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

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

% 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
Для просмотра документации необходимо авторизоваться на сайте