rlDQNAgent

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

Описание

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

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

Создание

Описание

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

пример

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

пример

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

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

agent = rlDQNAgent(critic) создает агента DQN с указанной сетью критика с помощью набора опций по умолчанию для агента DQN.

Настройка опций агента

пример

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

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

расширить все

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

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

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

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

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

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

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

Ваше представление критика может использовать рекуррентную нейронную сеть в качестве ее функциональной аппроксимации. Однако только представление функции Q-значения с мультивыходами поддерживает рекуррентные нейронные сети. Для получения примера смотрите Создание агента DQN с рекуррентной нейронной сетью.

Свойства

расширить все

Опции агента, заданные как rlDQNAgentOptions объект.

Если вы создаете агента DQN с представлением критика по умолчанию, которое использует рекуррентную нейронную сеть, значение по умолчанию AgentOptions.SequenceLength является 32.

Буфер опыта, заданный как ExperienceBuffer объект. Во время обучения агент хранит каждое из своих событий (S, A, R, S') в буфере. Здесь:

  • S - текущее наблюдение за окружением.

  • A - это действие, предпринятое агентом.

  • R является вознаграждением за принятие мер A.

  • S' является следующим наблюдением после принятия действия A.

Для получения дополнительной информации о том, как просматриваются образцы агентов из буфера во время обучения, смотрите Deep Q-Network Agents.

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

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)

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

agent = rlDQNAgent(obsInfo,actInfo);

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

getAction(agent,{rand(obsInfo(1).Dimension),rand(obsInfo(2).Dimension)})
ans = 1

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

Создайте окружение с дискретным пространством действий и получите его наблюдение и спецификации действия. В данном примере загружает окружение, используемую в примере Создать агента с помощью 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);

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

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

Извлеките глубокую нейронную сеть от обоих критиков.

criticNet = getModel(getCritic(agent));

Агент DQN по умолчанию использует аппроксимацию Q-значения с мультивыходами. Аппроксимация мультивыхода имеет наблюдения в качестве входов и состояния активности значения в качестве выходов. Каждый выходной элемент представляет ожидаемое совокупное долгосрочное вознаграждение для принятия соответствующего дискретного действия от состояния, обозначенного входами наблюдения.

Отобразите слои сети критика и проверьте, что каждый скрытый полностью соединенный слой имеет 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(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
    {[2]}

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

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

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

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

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

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

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

% create a deep neural network approximator 
% the observation input layer must have 4 elements (obsInfo.Dimension(1))
% the action output layer must have 2 elements (length(actInfo.Elements))
dnn = [
    imageInputLayer([obsInfo.Dimension(1) 1 1], 'Normalization', 'none', 'Name', 'state')
    fullyConnectedLayer(24, 'Name', 'CriticStateFC1')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(24, 'Name', 'CriticStateFC2')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(length(actInfo.Elements), 'Name', 'output')];

% set some options for the critic
criticOpts = rlRepresentationOptions('LearnRate',0.01,'GradientThreshold',1);

% create the critic based on the network approximator
critic = rlQValueRepresentation(dnn,obsInfo,actInfo,'Observation',{'state'},criticOpts);

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

agentOpts = rlDQNAgentOptions(...
    'UseDoubleDQN',false, ...    
    'TargetUpdateMethod',"periodic", ...
    'TargetUpdateFrequency',4, ...   
    'ExperienceBufferLength',100000, ...
    'DiscountFactor',0.99, ...
    'MiniBatchSize',256);

agent = rlDQNAgent(critic,agentOpts)
agent = 
  rlDQNAgent with properties:

        AgentOptions: [1x1 rl.option.rlDQNAgentOptions]
    ExperienceBuffer: [1x1 rl.util.ExperienceBuffer]

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

getAction(agent,{rand(4,1)})
ans = 10

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

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

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

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

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

% create a deep neural network approximator 
% the observation input layer must have 4 elements (obsInfo.Dimension(1))
% the action input layer must have 1 element (actInfo.Dimension(1))
% the output must be a scalar
statePath = [
    featureInputLayer(obsInfo.Dimension(1), 'Normalization', 'none', 'Name', 'state')
    fullyConnectedLayer(24, 'Name', 'CriticStateFC1')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(24, 'Name', 'CriticStateFC2')];
actionPath = [
    featureInputLayer(actInfo.Dimension(1), 'Normalization', 'none', 'Name', 'action')
    fullyConnectedLayer(24, 'Name', 'CriticActionFC1')];
commonPath = [
    additionLayer(2,'Name', 'add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1, 'Name', 'output')];
criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, actionPath);
criticNetwork = addLayers(criticNetwork, commonPath);    
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

% set some options for the critic
criticOpts = rlRepresentationOptions('LearnRate',0.01,'GradientThreshold',1);

% create the critic based on the network approximator
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation',{'state'},'Action',{'action'},criticOpts);

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

agentOpts = rlDQNAgentOptions(...
    'UseDoubleDQN',false, ...    
    'TargetUpdateMethod',"periodic", ...
    'TargetUpdateFrequency',4, ...   
    'ExperienceBufferLength',100000, ...
    'DiscountFactor',0.99, ...
    'MiniBatchSize',256);

agent = rlDQNAgent(critic,agentOpts)
agent = 
  rlDQNAgent with properties:

        AgentOptions: [1x1 rl.option.rlDQNAgentOptions]
    ExperienceBuffer: [1x1 rl.util.ExperienceBuffer]

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

getAction(agent,{rand(4,1)})
ans = 10

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

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

env = rlPredefinedEnv('CartPole-Discrete');

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

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

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

Для агентов DQN только представление функции Q-значения с мультивыходами поддерживает рекуррентные нейронные сети. Для представлений функции Q-значения с мультивыходами, количество элементов выходного слоя должно быть равно количеству возможных действий: numel(actInfo.Elements).

criticNetwork = [
    sequenceInputLayer(obsInfo.Dimension(1),'Normalization','none','Name','state')
    fullyConnectedLayer(50, 'Name', 'CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    lstmLayer(20,'OutputMode','sequence','Name','CriticLSTM');
    fullyConnectedLayer(20,'Name','CriticStateFC2')
    reluLayer('Name','CriticRelu2')
    fullyConnectedLayer(numel(actInfo.Elements),'Name','output')];

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

criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1);
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation','state',criticOptions);

Укажите опции для создания агента DQN. Чтобы использовать рекуррентную нейронную сеть, необходимо задать SequenceLength больше 1.

agentOptions = rlDQNAgentOptions(...
    'UseDoubleDQN',false, ...
    'TargetSmoothFactor',5e-3, ...
    'ExperienceBufferLength',1e6, ...
    'SequenceLength',20);
agentOptions.EpsilonGreedyExploration.EpsilonDecay = 1e-4;

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

agent = rlDQNAgent(critic,agentOptions);

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

getAction(agent,rand(obsInfo.Dimension))
ans = -10
Введенный в R2019a