Этот пример показывает, как обучить агента проксимальной оптимизации политики (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 поощряет долгосрочные вознаграждения.
Отклонение в выходе критика уменьшается с помощью метода 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);