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

  • Отклонение в выходе критика уменьшается с помощью метода Generalized Advantage Estimate с коэффициентом GAE 0,95.

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

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

agent = rlPPOAgent(actor,critic,agentOpts);

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

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

  • Запустите обучение для большинства 20000 эпизодов с каждым эпизодом, длящимся самое большее 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);

Figure Rocket Lander contains an axes. The axes contains 7 objects of type rectangle, line, patch, text.

См. также

|

Похожие темы