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

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

Среда

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

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

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

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

  • Максимальная тяга, примененная каждым ускорителем, составляет 8,5 Н.

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

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

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

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

rt=(st-st-1)-0.1θt2-0.01(Lt2+Rt2)+500cst=1-(dˆt+vˆt2)c=(yt0)&&(y˙t-0.5&&|x˙t|0.5)

Здесь:

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

  • dˆt=xt2+yt2/dmax нормированное расстояние ракеты от целевого положения.

  • vˆt=xt˙2+yt˙2/vmax нормированная скорость ракеты.

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

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

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

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

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

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

env = RocketLander;

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

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

Установите шаг расчета для среды

Ts = 0.1;

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

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 нормированы значения тяги для каждого ускорителя.

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

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

criticLayerSizes = [400 300];
actorLayerSizes = [400 300];

criticNetwork = [
        featureInputLayer(numObs,'Normalization','none','Name','observation')
        fullyConnectedLayer(criticLayerSizes(1),'Name','CriticFC1', ...
            'Weights',sqrt(2/numObs)*(rand(criticLayerSizes(1),numObs)-0.5), ...
            'Bias',1e-3*ones(criticLayerSizes(1),1))
        reluLayer('Name','CriticRelu1')
        fullyConnectedLayer(criticLayerSizes(2),'Name','CriticFC2', ...
            'Weights',sqrt(2/criticLayerSizes(1))*(rand(criticLayerSizes(2),criticLayerSizes(1))-0.5), ...
            'Bias',1e-3*ones(criticLayerSizes(2),1))
        reluLayer('Name','CriticRelu2')
        fullyConnectedLayer(1,'Name','CriticOutput', ...
            'Weights',sqrt(2/criticLayerSizes(2))*(rand(1,criticLayerSizes(2))-0.5), ...
            'Bias',1e-3)];

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

criticOpts = rlRepresentationOptions('LearnRate',1e-4);
critic = rlValueRepresentation(criticNetwork,observationInfo,'Observation',{'observation'},criticOpts);

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

actorNetwork = [featureInputLayer(numObs,'Normalization','none','Name','observation')
        fullyConnectedLayer(actorLayerSizes(1),'Name','ActorFC1', ...
            'Weights',sqrt(2/numObs)*(rand(actorLayerSizes(1),numObs)-0.5), ...
            'Bias',1e-3*ones(actorLayerSizes(1),1))
        reluLayer('Name','ActorRelu1')
        fullyConnectedLayer(actorLayerSizes(2),'Name','ActorFC2', ...
            'Weights',sqrt(2/actorLayerSizes(1))*(rand(actorLayerSizes(2),actorLayerSizes(1))-0.5), ...
            'Bias',1e-3*ones(actorLayerSizes(2),1))
        reluLayer('Name', 'ActorRelu2')
        fullyConnectedLayer(numAct,'Name','Action', ...
            'Weights',sqrt(2/actorLayerSizes(2))*(rand(numAct,actorLayerSizes(2))-0.5), ...
            'Bias',1e-3*ones(numAct,1))
        softmaxLayer('Name','actionProb')];

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

actorOpts = rlRepresentationOptions('LearnRate',1e-4);
actor = rlStochasticActorRepresentation(actorNetwork,observationInfo,actionInfo,...
    'Observation',{'observation'},actorOpts);

Задайте гиперпараметры агента с помощью rlPPOAgentOptions объект.

agentOpts = rlPPOAgentOptions(...
                'ExperienceHorizon',600,... 
                'ClipFactor',0.02,...
                'EntropyLossWeight',0.01,...
                'MiniBatchSize',128,...
                'NumEpoch',3,...
                'AdvantageEstimateMethod','gae',...
                'GAEFactor',0.95,...
                'SampleTime',Ts,...
                'DiscountFactor',0.997);

Для этих гиперпараметров:

  • Агент собирает события, пока он не достигает горизонта опыта 600 шагов или завершения эпизода и затем обучается от мини-пакетов 128 событий в течение 3 эпох.

  • Для улучшения учебной устойчивости используйте фактор клипа целевой функции 0,02.

  • Значение коэффициента дисконтирования 0,997 поощряет долгосрочные вознаграждения.

  • Отклонение в критике выход уменьшается при помощи Обобщенного Оценочного метода Преимущества с фактором GAE 0,95.

  • EntropyLossWeight термин 0,01 улучшает исследование во время обучения.

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

agent = rlPPOAgent(actor,critic,agentOpts);

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

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

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

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

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

trainOpts = rlTrainingOptions(...
    'MaxEpisodes',20000,...
    'MaxStepsPerEpisode',600,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',430,...
    'ScoreAveragingWindowLength',100,...
    'SaveAgentCriteria',"EpisodeReward",...
    'SaveAgentValue',700);

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

doTraining = false;
if doTraining   
    trainingStats = train(agent,env,trainOpts);
else
    load('rocketLanderAgent.mat');
end

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

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

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

plot(env)

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

simOptions = rlSimulationOptions('MaxSteps',600);
simOptions.NumSimulations = 5;  % simulate the environment 5 times
experience = sim(env,agent,simOptions);

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

|

Похожие темы