Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) качаться и балансировать систему тележки с шестом, смоделированную в Simscape™ Multibody™.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, показывающего, как обучить агента DDPG в MATLAB ®, смотрите Train DDPG Agent to Control Double Integrator System.
Окружение обучения с подкреплением для этого примера является шестом, прикрепленным к неактуированному соединению на тележке, которое перемещается по безфрикционной дорожке. Цель обучения состоит в том, чтобы сделать шест вертикальным, не падая, используя минимальное усилие управления.
Откройте модель.
mdl = 'rlCartPoleSimscapeModel';
open_system(mdl)
Система тележки с шестом моделируется с помощью Simscape Multibody.
Для этой модели:
Положение сбалансированного полюса вверх 0
радианы, и положение свисания вниз pi
радианы.
Сигнал действия силы от агента к окружению от -15 до 15 Н.
Наблюдения от окружения являются положением и скоростью тележки, и синуса, косинуса и производной угла шеста.
Эпизод прекращается, если тележка перемещается более чем на 3,5 м от исходного положения.
Вознаграждение , предоставляется в любое время,
Здесь:
- угол смещения от вертикального положения полюса.
- перемещение положения от центрального положения тележки.
- усилие управления от предыдущего временного шага.
- флаг (1 или 0), который указывает, находится ли тележка вне границ.
Для получения дополнительной информации об этой модели см. Раздел «Загрузка предопределённых окружений Simulink».
Создайте предопределенный интерфейс окружения для полюса.
env = rlPredefinedEnv('CartPoleSimscapeModel-Continuous')
env = SimulinkEnvWithAgent with properties: Model : rlCartPoleSimscapeModel AgentBlock : rlCartPoleSimscapeModel/RL Agent ResetFcn : [] UseFastRestart : on
Интерфейс имеет непрерывное пространство действий, где агент может применить возможные значения крутящего момента от -15 до 15 Н к полюсу.
Получите информацию о наблюдении и действии из интерфейса окружения.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Задайте время симуляции Tf
и шаг расчета агентом Ts
в секундах
Ts = 0.02; Tf = 25;
Исправьте начальное значение генератора для повторяемости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами (состояние и действие) и одним выходом. Размер входа пути действия [1 1 1]
поскольку агент может применить действие как одно значение силы к окружению. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.
statePath = [ featureInputLayer(numObservations,'Normalization','none','Name','observation') fullyConnectedLayer(128,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(200,'Name','CriticStateFC2')]; actionPath = [ featureInputLayer(1,'Normalization','none','Name','action') fullyConnectedLayer(200,'Name','CriticActionFC1','BiasLearnRateFactor',0)]; commonPath = [ additionLayer(2,'Name','add') reluLayer('Name','CriticCommonRelu') fullyConnectedLayer(1,'Name','CriticOutput')]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1'); criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');
Просмотрите строение критика.
figure plot(criticNetwork)
Задайте опции для представления критика используя rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданных глубокой нейронной сети и опций. Необходимо также указать информацию о действии и наблюдении для критика, которую вы уже получили из интерфейса окружения. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,... 'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает, какое действие предпринять, заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).
Построение актёра подобно критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','observation') fullyConnectedLayer(128,'Name','ActorFC1') reluLayer('Name','ActorRelu1') fullyConnectedLayer(200,'Name','ActorFC2') reluLayer('Name','ActorRelu2') fullyConnectedLayer(1,'Name','ActorFC3') tanhLayer('Name','ActorTanh1') scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))]; actorOptions = rlRepresentationOptions('LearnRate',5e-04,'GradientThreshold',1); actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'observation'},'Action',{'ActorScaling'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'MiniBatchSize',128); agentOptions.NoiseOptions.StandardDeviation = 0.4; agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;
Затем создайте агента с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запускайте каждый эпизод тренировки для большинства 2000 эпизодов с каждым эпизодом, длящимся самое большее ceil(Tf/Ts)
временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и отключить отображение командной строки (установите Verbose
опция для false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше -400 в пяти последовательных эпизодах. На данной точке агент может быстро сбалансировать шест в вертикальном положении с помощью минимальных усилий по управлению.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше -400.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 2000; maxsteps = ceil(Tf/Ts); trainingOptions = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'ScoreAveragingWindowLength',5,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-400,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-400);
Обучите агента с помощью train
функция. Обучение этого процесса агента является интенсивным в вычислительном отношении и занимает несколько часов. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions); else % Load the pretrained agent for the example. load('SimscapeCartPoleDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
bdclose(mdl)
rlDDPGAgent
| rlSimulinkEnv
| train