rlPPOAgent

Ближайший агент обучения с подкреплением оптимизации политики

Описание

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

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

Создание

Описание

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

пример

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

пример

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

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

пример

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

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

пример

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

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

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

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

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

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

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

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

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

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

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

Ваше представление актера может использовать рекуррентную нейронную сеть в качестве своей функциональной аппроксимации. В этом случае ваш критик должен также использовать рекуррентную нейронную сеть. Для примера смотрите, Создают Агента PPO с Рекуррентными нейронными сетями.

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

Ваше представление критика может использовать рекуррентную нейронную сеть в качестве своей функциональной аппроксимации. В этом случае ваш агент должен также использовать рекуррентную нейронную сеть. Для примера смотрите, Создают Агента PPO с Рекуррентными нейронными сетями.

Свойства

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

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

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

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");

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

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

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

% rng(0)

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

agent = rlPPOAgent(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).

initOpts = rlAgentInitializationOptions('NumHiddenUnit',128);

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

% rng(0)

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

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

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

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

env = rlPredefinedEnv("CartPole-Discrete");
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

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

% Create the network to be used as approximator in the critic.
criticNetwork = [
    featureInputLayer(4,'Normalization','none','Name','state')
    fullyConnectedLayer(1,'Name','CriticFC')];

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

% Create the critic.
critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);

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

% Create the network to be used as approximator in the actor.
actorNetwork = [
    featureInputLayer(4,'Normalization','none','Name','state')
    fullyConnectedLayer(2,'Name','action')];

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

% Create the actor.
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'state'},actorOpts);

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

agentOpts = rlPPOAgentOptions(...
    'ExperienceHorizon',1024, ...
    'DiscountFactor',0.95);
agent = rlPPOAgent(actor,critic,agentOpts)
agent = 
  rlPPOAgent with properties:

    AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

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

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

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

env = rlPredefinedEnv("DoubleIntegrator-Continuous");
obsInfo = getObservationInfo(env)
obsInfo = 
  rlNumericSpec with properties:

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

actInfo = getActionInfo(env)
actInfo = 
  rlNumericSpec with properties:

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

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

actInfo.LowerLimit=-2;
actInfo.UpperLimit=2;

Создайте представление критика. Агенты PPO используют 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);

Агенты PPO используют 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)
% 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(1,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: you must connect the mean value path 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);

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

agentOpts = rlPPOAgentOptions(...
    'ExperienceHorizon',1024, ...
    'DiscountFactor',0.95);
agent = rlPPOAgent(actor,critic,agentOpts)
agent = 
  rlPPOAgent with properties:

    AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

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

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

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

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

env = rlPredefinedEnv('CartPole-Discrete');

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

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

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

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

Создайте объект представления функции ценности для критика.

criticOptions = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1);
critic = rlValueRepresentation(criticNetwork,obsInfo,...
    'Observation','myobs', criticOptions);

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

actorNetwork = [
    sequenceInputLayer(obsInfo.Dimension(1),'Normalization','none','Name','myobs')
    fullyConnectedLayer(8,'Name','fc')
    reluLayer('Name','relu')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')
    fullyConnectedLayer(numel(actInfo.Elements),'Name','output')
    softmaxLayer('Name','actionProb')];

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

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

Создайте объект опций агента.

agentOptions = rlPPOAgentOptions(...
    'AdvantageEstimateMethod', 'finite-horizon', ...
    'ClipFactor', 0.1);

Когда рекуррентные нейронные сети используются, MiniBatchSize свойство является длиной траектории изучения.

agentOptions.MiniBatchSize
ans = 128

Создайте агента с помощью представлений актёра и критика, а также объекта опций агента.

agent = rlPPOAgent(actor,critic,agentOptions);

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

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

Советы

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

  • В то время как настройка скорости обучения сети агента необходима для агентов PPO, это не необходимо для агентов TRPO.

Введенный в R2019b