Обучите агента PPO сажать ракету

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

Среда

Среда в этом примере является ракетой 3-DOF, представленной круговым диском с массой. Ракета имеет два ускорителя для прямого и вращательного движения. Действия силы тяжести вертикально вниз, и нет никакой аэродинамической силы сопротивления. Цель обучения должна заставить робота приземлиться на землю в заданном местоположении.

Для этой среды:

  • Движение ракеты ограничено в X (горизонтальная ось) от-100 до 100 метров и Y (вертикальная ось) от 0 до 120 метров.

  • Целевое положение в (0,0), метры и целевая ориентация являются 0 радианами.

  • Шаг расчета составляет 0,1 секунды.

  • Наблюдения средой являются положением ракеты (x,y), ориентация (θ), скорость (x˙,y˙), скорость вращения (θ˙), и датчик, читая, который обнаруживает грубо приземление (-1), мягкое приземление (1) или в воздухе (0) условие. Наблюдения нормированы между-1 и 1.

  • В начале каждого эпизода ракета начинает со случайной начальной буквы x положение и ориентация. Высота всегда сбрасывается к 100 метрам.

  • Вознаграждение rt если в то время шаг t следующие.

dˆt=xt2+yt2/dmaxvˆt=xt˙2+yt˙2/vmaxr1=1-(dˆt+vˆt2)r2=12e-20θt2r3=1-(Lt+Rt20)r4=10000[(yt0)&&(y˙t-0.5&&|x˙t|0.5)]rt=r1+r2+r3+r4

Здесь:

  • xt,yt,x˙t, и y˙t положения и скорости ракеты вдоль осей X и Y.

  • dˆt нормированное расстояние ракеты от целевого положения.

  • vˆt нормированная скорость ракеты.

  • dmax и vmax максимальные расстояния и скорости в пространстве состояний.

  • θt ориентация относительно вертикальной оси.

  • Lt и Rt значения действия для левых и правых ускорителей.

  • r1 вознаграждение за минимизацию расстояния и скорости одновременно.

  • r2 вознаграждение за минимизацию ориентации ракеты.

  • r3 вознаграждение за минимизацию усилия по управлению.

  • r4 разреженное вознаграждение за мягкую посадку с горизонтальными и вертикальными скоростями меньше чем 0,5 м/с.

Создайте среду MATLAB

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

env = RocketLander;

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

actionInfo = getActionInfo(env);
observationInfo = getObservationInfo(env);
numObs = observationInfo.Dimension(1);
numAct = numel(actionInfo.Elements);

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

rng(0)

Создайте агента PPO

Агент PPO в этом примере работает с дискретным пространством действий. На каждом временном шаге агент выбирает одну из следующих дискретных пар действия.

L,L-donothingL,M-fireright(med)L,H-fireright(high)M,L-fireleft(med)M,M-fireleft(med)+right(med)M,H-fireleft(med)+right(high)H,L-fireleft(high)H,M-fireleft(high)+right(med)H,H-fireleft(high)+right(high)

Здесь, L=0.0,M=0.5 и H=1.0 нормированы значения тяги для каждого ускорителя.

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

criticLayerSizes = [200 100];
actorLayerSizes = [200 100];

predefinedWeightsandBiases = false;
if predefinedWeightsandBiases
    load('PredefinedWeightsAndBiases.mat');
else
    createNetworkWeights;
end

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

criticNetwork = [imageInputLayer([numObs 1 1],'Normalization','none','Name','observation')
    fullyConnectedLayer(criticLayerSizes(1),'Name','CriticFC1', ... 
                                            'Weights',weights.criticFC1, ...
                                            'Bias',bias.criticFC1)
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(criticLayerSizes(2),'Name','CriticFC2', ...
                                            'Weights',weights.criticFC2, ... 
                                            'Bias',bias.criticFC2)
    reluLayer('Name','CriticRelu2')
    fullyConnectedLayer(1,'Name','CriticOutput',...
                          'Weights',weights.criticOut,...
                          'Bias',bias.criticOut)];

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

criticOpts = rlRepresentationOptions('LearnRate',1e-3);
critic = rlValueRepresentation(criticNetwork,env.getObservationInfo, ...
                          'Observation',{'observation'},criticOpts);

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

actorNetwork = [imageInputLayer([numObs 1 1],'Normalization','none','Name','observation')
    fullyConnectedLayer(actorLayerSizes(1),'Name','ActorFC1',...
                                           'Weights',weights.actorFC1,...
                                           'Bias',bias.actorFC1)
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(actorLayerSizes(2),'Name','ActorFC2',...
                                           'Weights',weights.actorFC2,...
                                           'Bias',bias.actorFC2)
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(numAct,'Name','Action',...
                               'Weights',weights.actorOut,...
                               'Bias',bias.actorOut)
    softmaxLayer('Name','actionProbability')
    ];  

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

actorOptions = rlRepresentationOptions('LearnRate',1e-3);
actor = rlStochasticActorRepresentation(actorNetwork,env.getObservationInfo,env.getActionInfo,... 
                         'Observation',{'observation'}, actorOptions);

Агент PPO генерирует события для ExperienceHorizon количество шагов или до конца эпизода. Затем это обучается на тех событиях с помощью мини-пакетов в конкретном количестве эпох.

  • Установите ExperienceHorizon к 512 шагам, который немного меньше половины общей длительности симуляции 1 200 шагов.

  • Используйте "gae" метод, который вычисляет функцию преимущества на основе сглаживавшей обесцененной суммы временных различий.

  • Чтобы улучшить учебную устойчивость, используйте фактор клипа целевой функции 0,2.

  • Коэффициенты дисконтирования, которые являются близко к 1, поощряют долгосрочные вознаграждения. Используйте коэффициент дисконтирования 0,9995, который имеет период полураспада журнала (0.5) журнал / (0.9995) ≈ 1 386 шагов.

Задайте опции агента с помощью rlPPOAgentOptions.

opt = rlPPOAgentOptions('ExperienceHorizon',512,...
                        'ClipFactor',0.2,...
                        'EntropyLossWeight',0.02,...
                        'MiniBatchSize',64,...
                        'NumEpoch',3,...
                        'AdvantageEstimateMethod','gae',...
                        'GAEFactor',0.95,...
                        'SampleTime',env.Ts,...
                        'DiscountFactor',0.9995);

Создайте агента PPO.

agent = rlPPOAgent(actor,critic,opt);

Обучите агента

Чтобы обучить агента PPO, задайте следующие опции обучения.

  • Запустите обучение самое большее 20 000 эпизодов с каждым эпизодом, длящимся самое большее 1 200 временных шагов.

  • Остановите обучение, когда среднее вознаграждение более чем 100 последовательных эпизодов будет 10000. Это значение указывает, что агент последовательно получает вознаграждение за мягкое приземление.

  • Сохраните копию агента для каждого эпизода, где вознаграждение эпизода 11000 или больше.

trainOpts = rlTrainingOptions(...
    'MaxEpisodes',20000,...
    'MaxStepsPerEpisode',1200,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',10000,...
    'ScoreAveragingWindowLength',100,...
    'SaveAgentCriteria',"EpisodeReward",...
    'SaveAgentValue',11000);

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

plot(env)

Обучите агента с помощью train функция. Из-за сложности среды, этот процесс в вычислительном отношении интенсивен и занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining к false.

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained parameters for the example.
    load('RocketLanderPPOAgentParams.mat');
    loadPretrainedParams(agent,actorParams,criticParams)
end
ans = 
  rlPPOAgent with properties:

    AgentOptions: [1x1 rl.option.rlPPOAgentOptions]

Симулировать

Симулируйте обученного агента в среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

Tf = 120;  % Total simulation length (seconds)
simOptions = rlSimulationOptions('MaxSteps',ceil(Tf/env.Ts));
experience = sim(env,agent,simOptions);

Локальная функция

Функция, чтобы обновить агента предварительно обученными параметрами

function agent = loadPretrainedParams(agent,actorParams,criticParams)
% Set actor parameters.
actor  = getActor(agent);
pretrainedActor  = setLearnableParameters(actor,actorParams);
% Set critic parameters.
critic = getCritic(agent);
pretrainedCritic = setLearnableParameters(critic,criticParams);
% Set actor and critic in agent.
agent = setActor(agent,pretrainedActor);
agent = setCritic(agent,pretrainedCritic);
end

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте