rlPGAgent

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

Описание

Алгоритм градиента политики (PG) является онлайновым, методом обучения с подкреплением на политике без моделей. Агент PG является основанным на политике агентом обучения с подкреплением, который использует алгоритм REINFORCE, чтобы непосредственно вычислить оптимальную политику, которая максимизирует долгосрочное вознаграждение. Пространство действий может быть или дискретным или непрерывным.

Для получения дополнительной информации об агентах PG и алгоритме REINFORCE, смотрите Агентов Градиента политики. Для получения дополнительной информации о различных типах агентов обучения с подкреплением смотрите Агентов Обучения с подкреплением.

Создание

Описание

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

пример

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

пример

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

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

agent = rlPGAgent(actor) создает агента PG с заданной сетью агента. По умолчанию, UseBaseline свойством агента является false в этом случае.

agent = rlPGAgent(actor,critic) создает агента PG с заданным агентом и сетями критика. По умолчанию, UseBaseline опцией является true в этом случае.

Задайте опции агента

пример

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

Входные параметры

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

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

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

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

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

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

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

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

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

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

Свойства

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

Опции агента в виде rlPGAgentOptions объект.

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

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 = rlPGAgent(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 = rlPGAgent(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]}

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

Создайте среду с дискретным пространством действий и получите его спецификации наблюдений и спецификации действия. В данном примере загрузите среду, используемую в примере, Обучают Агента PG с Базовой линией Управлять Двойной Системой Интегратора. Наблюдение средой является вектором, содержащим положение и скорость массы. Действие является скаляром, представляющим силу, применился к массе, имея три возможных значения (-2, 0, или 2 Ньютон).

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

% get observation and specification info
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

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

% create a network to be used as underlying critic approximator
baselineNetwork = [
    imageInputLayer([obsInfo.Dimension(1) 1 1], 'Normalization', 'none', 'Name', 'state')
    fullyConnectedLayer(8, 'Name', 'BaselineFC')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(1, 'Name', 'BaselineFC2', 'BiasLearnRateFactor', 0)];

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

% create the critic based on the network approximator
baseline = rlValueRepresentation(baselineNetwork,obsInfo,'Observation',{'state'},baselineOpts);

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

% create a network to be used as underlying actor approximator
actorNetwork = [
    imageInputLayer([obsInfo.Dimension(1) 1 1], 'Normalization', 'none', 'Name', 'state')
    fullyConnectedLayer(numel(actInfo.Elements), 'Name', 'action', 'BiasLearnRateFactor', 0)];

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

% create the actor based on the network approximator
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'state'},actorOpts);

Задайте опции агента и создайте агента PG с помощью среды, агента и критика.

agentOpts = rlPGAgentOptions(...
    'UseBaseline',true, ...
    'DiscountFactor', 0.99);
agent = rlPGAgent(actor,baseline,agentOpts)
agent = 
  rlPGAgent with properties:

    AgentOptions: [1x1 rl.option.rlPGAgentOptions]

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

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

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

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

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

% get observation specification info
obsInfo = getObservationInfo(env)
obsInfo = 
  rlNumericSpec with properties:

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

% get action specification info
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;

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

% create a network to be used as underlying critic approximator
baselineNetwork = [
    imageInputLayer([obsInfo.Dimension 1], 'Normalization', 'none', 'Name', 'state')
    fullyConnectedLayer(8, 'Name', 'BaselineFC1')
    reluLayer('Name', 'Relu1')
    fullyConnectedLayer(1, 'Name', 'BaselineFC2', 'BiasLearnRateFactor', 0)];

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

% create the critic based on the network approximator
baseline = rlValueRepresentation(baselineNetwork,obsInfo,'Observation',{'state'},baselineOpts);

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

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

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

% input path layers (2 by 1 input, 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)
% using 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)
% using softplus layer to make it 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)

% conctatenate 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 variancePath 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 options for the actor
actorOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);

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

Задайте опции агента и создайте агента PG с помощью агента, базовой линии и опций агента.

agentOpts = rlPGAgentOptions(...
    'UseBaseline',true, ...
    'DiscountFactor', 0.99);
agent = rlPGAgent(actor,baseline,agentOpts)
agent = 
  rlPGAgent with properties:

    AgentOptions: [1x1 rl.option.rlPGAgentOptions]

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

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

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

В данном примере загрузите среду, используемую в примере, Обучают Агента PG с Базовой линией Управлять Двойной Системой Интегратора. Наблюдение средой является вектором, содержащим положение и скорость массы. Действие является скаляром, представляющим силу, применился к массе, имея три возможных значения (-2, 0, или 2 ньютона).

env = rlPredefinedEnv("DoubleIntegrator-Discrete");

Получите информация о спецификации и наблюдение.

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

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

baselineNetwork = [
    sequenceInputLayer(obsInfo.Dimension(1), 'Normalization', 'none', 'Name','myobs')
    fullyConnectedLayer(8, 'Name', 'BaselineFC')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(1, 'Name', 'BaselineFC2', 'BiasLearnRateFactor', 0)];

Установите некоторые опции для критика.

baselineOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);

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

baseline = rlValueRepresentation(baselineNetwork,obsInfo,'Observation',{'myobs'},baselineOpts);

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

Задайте рекуррентную нейронную сеть для агента.

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

Установите опции агента и создайте агента.

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

Задайте опции агента и создайте агента PG с помощью среды, агента и критика.

agentOpts = rlPGAgentOptions(...
    'UseBaseline',true, ...
    'DiscountFactor', 0.99);
agent = rlPGAgent(actor,baseline,agentOpts);

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

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

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

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

Советы

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

Введенный в R2019a