rlSACAgent

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

Описание

Алгоритм мягкого актёра-критика (SAC) является онлайновым методом обучения с подкреплением актёра без моделей и без политики. Алгоритм SAC вычисляет оптимальную политику, которая максимизирует как долгосрочное ожидаемое вознаграждение, так и энтропию политики. Энтропия политики является мерой неопределенности политики, учитывая состояние. Более высокое значение энтропии способствует большему исследованию. Максимизация как вознаграждения, так и энтропии балансирует разведку и эксплуатацию окружения. Пространство действий может быть только непрерывным.

Для получения дополнительной информации смотрите Агентов Мягкого Актёра-Критика.

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

Создание

Описание

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

пример

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

пример

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

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

пример

agent = rlSACAgent(actor,critics) создает агента SAC с заданными сетями актёра и критика и опциями агента по умолчанию.

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

agent = rlSACAgent(___,agentOptions) устанавливает свойство AgentOptions для любого из предыдущих синтаксисов.

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

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

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

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

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

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

Опции инициализации представления, заданные как rlAgentInitializationOptions объект.

Представление сети актёра, заданное как rlStochasticActorRepresentation объект.

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

Представления сети критика, заданные как одно из следующего:

  • rlQValueRepresentation объект - Создайте агента SAC с одной функцией Q-значения.

  • Двухэлементные векторы-строки rlQValueRepresentation - создайте агента SAC с двумя функциями ценности критика. Две сети критиков должны быть уникальными rlQValueRepresentation объекты с такими же наблюдениями и спецификациями действия. Представления могут иметь отличные структуры или одну и ту же структуру, но с различными начальными параметрами.

Для агента SAC каждый критик должен быть выходным rlQValueRepresentation объект, который принимает и действие, и наблюдения как входы.

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

Свойства

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

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

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

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

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

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

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

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

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

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

trainОбучите агентов обучения с подкреплением в заданном окружении
simСимулируйте обученных агентов обучения с подкреплением в заданном окружении
getActionПолучите действие от агента или представления актера заданных наблюдений окружения
getActorПолучите представление актера от агента обучения с подкреплением
setActorУстановите представление актера агента обучения с подкреплением
getCriticПолучите представление критика от агента обучения с подкреплением
setCriticУстановите представление критика агента обучения с подкреплением
generatePolicyFunctionСоздайте функцию, которая оценивает обученную политику агента обучения с подкреплением

Примеры

свернуть все

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

env = rlPredefinedEnv("DoubleIntegrator-Continuous");
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

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

% rng(0)

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

agent = rlSACAgent(obsInfo,actInfo);

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

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

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

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

env = rlPredefinedEnv("DoubleIntegrator-Continuous");
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

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

initOpts = rlAgentInitializationOptions('NumHiddenUnit',128);

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

% rng(0)

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

agent = rlSACAgent(obsInfo,actInfo,initOpts);

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

actorNet = getModel(getActor(agent));

Извлечь глубокие нейронные сети от двух критиков. Обратите внимание, что getModel(critics) возвращает только первую сеть критика.

critics = getCritic(agent);
criticNet1 = getModel(critics(1));
criticNet2 = getModel(critics(2));

Отобразите слои первой сети критика и проверьте, что каждый скрытый полностью соединенный слой имеет 128 нейронов.

criticNet1.Layers
ans = 
  10x1 Layer array with layers:

     1   'concat'               Concatenation       Concatenation of 2 inputs along dimension 1
     2   'relu_body'            ReLU                ReLU
     3   'fc_body'              Fully Connected     128 fully connected layer
     4   'body_output'          ReLU                ReLU
     5   'input_1'              Feature Input       2 features
     6   'fc_1'                 Fully Connected     128 fully connected layer
     7   'input_2'              Feature Input       1 features
     8   'fc_2'                 Fully Connected     128 fully connected layer
     9   'output'               Fully Connected     1 fully connected layer
    10   'RepresentationLoss'   Regression Output   mean-squared-error

Постройте графики сетей актёра и второго критика.

plot(actorNet)

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

plot(criticNet2)

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

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

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

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

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

env = rlPredefinedEnv("DoubleIntegrator-Continuous");
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Получите количество наблюдений и количество действий.

numObs = obsInfo.Dimension(1);
numAct = numel(actInfo);

Создайте две представления Q-ценности критика. Во-первых, создайте структуру глубокой нейронной сети критика.

statePath1 = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(400,'Name','CriticStateFC1')
    reluLayer('Name','CriticStateRelu1')
    fullyConnectedLayer(300,'Name','CriticStateFC2')
    ];
actionPath1 = [
    featureInputLayer(numAct,'Normalization','none','Name','action')
    fullyConnectedLayer(300,'Name','CriticActionFC1')
    ];
commonPath1 = [
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonRelu1')
    fullyConnectedLayer(1,'Name','CriticOutput')
    ];

criticNet = layerGraph(statePath1);
criticNet = addLayers(criticNet,actionPath1);
criticNet = addLayers(criticNet,commonPath1);
criticNet = connectLayers(criticNet,'CriticStateFC2','add/in1');
criticNet = connectLayers(criticNet,'CriticActionFC1','add/in2');

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

criticOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3,... 
                                        'GradientThreshold',1,'L2RegularizationFactor',2e-4);
critic1 = rlQValueRepresentation(criticNet,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);
critic2 = rlQValueRepresentation(criticNet,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

Создайте актёра глубокой нейронной сети. Не добавляйте tanhLayer или scalingLayer в среднем выходном пути. Агент SAC внутренне преобразует неограниченное Гауссово распределение в ограниченное распределение, чтобы вычислить функцию плотности вероятностей и энтропию правильно.

statePath = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(400, 'Name','commonFC1')
    reluLayer('Name','CommonRelu')];
meanPath = [
    fullyConnectedLayer(300,'Name','MeanFC1')
    reluLayer('Name','MeanRelu')
    fullyConnectedLayer(numAct,'Name','Mean')
    ];
stdPath = [
    fullyConnectedLayer(300,'Name','StdFC1')
    reluLayer('Name','StdRelu')
    fullyConnectedLayer(numAct,'Name','StdFC2')
    softplusLayer('Name','StandardDeviation')];

concatPath = concatenationLayer(1,2,'Name','GaussianParameters');

actorNetwork = layerGraph(statePath);
actorNetwork = addLayers(actorNetwork,meanPath);
actorNetwork = addLayers(actorNetwork,stdPath);
actorNetwork = addLayers(actorNetwork,concatPath);
actorNetwork = connectLayers(actorNetwork,'CommonRelu','MeanFC1/in');
actorNetwork = connectLayers(actorNetwork,'CommonRelu','StdFC1/in');
actorNetwork = connectLayers(actorNetwork,'Mean','GaussianParameters/in1');
actorNetwork = connectLayers(actorNetwork,'StandardDeviation','GaussianParameters/in2');

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

actorOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3,...
                                       'GradientThreshold',1,'L2RegularizationFactor',1e-5);

actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,actorOptions,...
    'Observation',{'observation'});

Укажите опции агента.

agentOptions = rlSACAgentOptions;
agentOptions.SampleTime = env.Ts;
agentOptions.DiscountFactor = 0.99;
agentOptions.TargetSmoothFactor = 1e-3;
agentOptions.ExperienceBufferLength = 1e6;
agentOptions.MiniBatchSize = 32;

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

agent = rlSACAgent(actor,[critic1 critic2],agentOptions);

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

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

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

В данном примере загружает окружение, используемую в примере Train DDPG Agent для управления системой Double Integrator System. Наблюдения от окружения являются вектором, содержащим положение и скорость массы. Действие является скаляром, представляющим силу, приложенную к массе, постоянно варьируясь от - 2 на 2 Ньютон.

env = rlPredefinedEnv("DoubleIntegrator-Continuous");
obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Получите количество наблюдений и количество действий.

numObs = obsInfo.Dimension(1);
numAct = numel(actInfo);

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

statePath1 = [
    sequenceInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(400,'Name','CriticStateFC1')
    reluLayer('Name','CriticStateRelu1')
    fullyConnectedLayer(300,'Name','CriticStateFC2')
    ];
actionPath1 = [
    sequenceInputLayer(numAct,'Normalization','none','Name','action')
    fullyConnectedLayer(300,'Name','CriticActionFC1')
    ];
commonPath1 = [
    additionLayer(2,'Name','add')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')
    reluLayer('Name','CriticCommonRelu1')
    fullyConnectedLayer(1,'Name','CriticOutput')
    ];

criticNet = layerGraph(statePath1);
criticNet = addLayers(criticNet,actionPath1);
criticNet = addLayers(criticNet,commonPath1);
criticNet = connectLayers(criticNet,'CriticStateFC2','add/in1');
criticNet = connectLayers(criticNet,'CriticActionFC1','add/in2');

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

criticOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3,... 
                                        'GradientThreshold',1,'L2RegularizationFactor',2e-4);
critic1 = rlQValueRepresentation(criticNet,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);
critic2 = rlQValueRepresentation(criticNet,obsInfo,actInfo,...
    'Observation',{'observation'},'Action',{'action'},criticOptions);

Создайте актёра глубокой нейронной сети. Поскольку у критика есть рецидивирующая сеть, у актёра должна быть и рецидивирующая сеть. Не добавляйте tanhLayer или scalingLayer в среднем выходном пути. Агент SAC внутренне преобразует неограниченное Гауссово распределение в ограниченное распределение, чтобы вычислить функцию плотности вероятностей и энтропию правильно.

statePath = [
    sequenceInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(400, 'Name','commonFC1')
    lstmLayer(8,'OutputMode','sequence','Name','lstm')    
    reluLayer('Name','CommonRelu')];
meanPath = [
    fullyConnectedLayer(300,'Name','MeanFC1')
    reluLayer('Name','MeanRelu')
    fullyConnectedLayer(numAct,'Name','Mean')
    ];
stdPath = [
    fullyConnectedLayer(300,'Name','StdFC1')
    reluLayer('Name','StdRelu')
    fullyConnectedLayer(numAct,'Name','StdFC2')
    softplusLayer('Name','StandardDeviation')];

concatPath = concatenationLayer(1,2,'Name','GaussianParameters');

actorNetwork = layerGraph(statePath);
actorNetwork = addLayers(actorNetwork,meanPath);
actorNetwork = addLayers(actorNetwork,stdPath);
actorNetwork = addLayers(actorNetwork,concatPath);
actorNetwork = connectLayers(actorNetwork,'CommonRelu','MeanFC1/in');
actorNetwork = connectLayers(actorNetwork,'CommonRelu','StdFC1/in');
actorNetwork = connectLayers(actorNetwork,'Mean','GaussianParameters/in1');
actorNetwork = connectLayers(actorNetwork,'StandardDeviation','GaussianParameters/in2');

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

actorOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3,...
                                       'GradientThreshold',1,'L2RegularizationFactor',1e-5);

actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,actorOptions,...
    'Observation',{'observation'});

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

agentOptions = rlSACAgentOptions;
agentOptions.SampleTime = env.Ts;
agentOptions.DiscountFactor = 0.99;
agentOptions.TargetSmoothFactor = 1e-3;
agentOptions.ExperienceBufferLength = 1e6;
agentOptions.SequenceLength = 32;
agentOptions.MiniBatchSize = 32;

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

agent = rlSACAgent(actor,[critic1 critic2],agentOptions);

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

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

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

Введенный в R2019a