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 объект. Агенты критика агента не поддерживают рекуррентные нейронные сети.

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

Представление сети Critic для оценки обесцененного долгосрочного вознаграждения в виде 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]}

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

Создайте среду с непрерывным пространством действий и получите его спецификации наблюдений и спецификации действия. В данном примере загрузите среду, используемую в примере, Обучают Агента DDPG к Swing и Маятнику Баланса с Наблюдением Изображений. Эта среда имеет два наблюдения: 50 50 полутоновое изображение и скаляр (скорость вращения маятника). Действие является скаляром, представляющим крутящий момент, располагающийся постоянно от-2 к 2 Nm.

% 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 = 
  11x1 Layer array with layers:

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

Постройте сети критика и агент

plot(layerGraph(actorNet))

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

plot(layerGraph(criticNet))

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

Чтобы проверять вашего агента, используйте getAction возвратить действие в случайное наблюдение.

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

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

Создайте среду с дискретным пространством действий и получите его спецификации наблюдений и спецификации действия. В данном примере загрузите среду, используемую в примере, Обучают Агента DQN Балансировать Систему Тележки с шестом. Эта среда имеет четырехмерный вектор наблюдения (положение тележки и скорость, угол полюса и угловая производная полюса), и скалярное действие с двумя возможными элементами (сила любого-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]}

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

Создайте среду с непрерывным пространством действий и получите его спецификации наблюдений и спецификации действия. В данном примере загрузите двойную среду непрерывного пространства действий интегратора, используемую в примере, Обучают Агента DDPG Управлять Двойной Системой Интегратора.

% 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. Выход (здесь названный 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 object. The axes object 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]}

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

Поскольку этот пример загружает предопределенную среду, используемую для Обучения Агента DQN Сбалансировать Системный пример Тележки с шестом.

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