В этом примере показано, как обучить агента ближайшей оптимизации политики (PPO) с дискретным пространством действий сажать ракету на землю. Для получения дополнительной информации об агентах PPO смотрите Ближайших Агентов Оптимизации политики.
Среда в этом примере является ракетой 3-DOF, представленной круговым диском массой. Ракета имеет два ускорителя для прямого и вращательного движения. Действия силы тяжести вертикально вниз, и нет никакой аэродинамической силы сопротивления. Цель обучения должна заставить робота приземлиться на землю в заданном местоположении.
Для этой среды:
Движение ракеты ограничено в X (горизонтальная ось) от-100 до 100 метров и Y (вертикальная ось) от 0 до 120 метров.
Целевое положение в (0,0), метры и целевая ориентация являются 0 радианами.
Максимальная тяга, примененная каждым ускорителем, составляет 8,5 Н.
Шаг расчета составляет 0,1 секунды.
Наблюдения средой являются положением ракеты , ориентация , скорость , скорость вращения , и датчик, читая, который обнаруживает грубо приземление (-1), мягкое приземление (1) или в воздухе (0) условие. Наблюдения нормированы между-1 и 1.
В начале каждого эпизода ракета начинает со случайной начальной буквы положение и ориентация. Высота всегда сбрасывается к 100 метрам.
Вознаграждение если в то время шаг следующие.
Здесь:
,,, и положения и скорости ракеты вдоль осей X и Y.
нормированное расстояние ракеты от целевого положения.
нормированная скорость ракеты.
и максимальные расстояния и скорости.
ориентация относительно вертикальной оси.
и значения действия для левых и правых ускорителей.
разреженное вознаграждение за мягкую посадку с горизонтальными и вертикальными скоростями меньше чем 0,5 м/с.
Создайте среду MATLAB для высаживающегося на берег ракеты, использующего RocketLander
класс.
env = RocketLander;
Получите спецификации наблюдений и спецификации действия от среды.
actionInfo = getActionInfo(env); observationInfo = getObservationInfo(env); numObs = observationInfo.Dimension(1); numAct = numel(actionInfo.Elements);
Установите шаг расчета для среды
Ts = 0.1;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент PPO в этом примере работает с дискретным пространством действий. На каждом временном шаге агент выбирает одну из следующих дискретных пар действия.
Здесь, и нормированы значения тяги для каждого ускорителя.
Чтобы оценить политику и функцию ценности, агент обеспечивает функциональные аппроксимации для агента и критика, которые моделируются с помощью глубоких нейронных сетей. Обучение может быть чувствительно к начальным сетевым весам и смещениям, и результаты могут меняться в зависимости от различных множеств значений. Сетевые веса случайным образом инициализируются к маленьким значениям в этом примере.
Создайте глубокую нейронную сеть критика с шестью входными параметрами и одним выходом. Выход сети критика является обесцененным долгосрочным вознаграждением за входные наблюдения.
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);