В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) качаться и балансировать маятник, смоделированный в Simulink®.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики. Для примера, который обучает агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Среда обучения с подкреплением для этого примера является простым лишенным трения маятником, который первоначально зависает в нисходящем положении. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально, не запинаясь за использование и падая минимального усилия по управлению.
Откройте модель.
mdl = 'rlSimplePendulumModel';
open_system(mdl)
Для этой модели:
Восходящим сбалансированным положением маятника является 0
радианами и нисходящим положением зависания является pi
радианы.
Сигнал действия крутящего момента от агента до среды от -2
к 2
Nm.
Наблюдения средой являются синусом угла маятника, косинусом угла маятника и угловой производной маятника.
Вознаграждение , если на каждом временном шаге:
где:
угол смещения от вертикального положения
производная угла рассогласования
усилие по управлению от предыдущего временного шага.
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные окружения Simulink.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv('SimplePendulumModel-Continuous')
env = SimulinkEnvWithAgent with properties: Model: "rlSimplePendulumModel" AgentBlock: "rlSimplePendulumModel/RL Agent" ResetFcn: [] UseFastRestart: 'on'
Интерфейс имеет непрерывный пробел действия, где агент может применить возможные значения крутящего момента от -2
к 2
Nm к маятнику.
Установите наблюдения за средой быть синусом угла маятника, косинусом угла маятника и угловой производной маятника.
numObs = 3; set_param('rlSimplePendulumModel/create observations','ThetaObservationHandling','sincos');
Чтобы задать начальное условие маятника как зависание вниз, задайте функцию сброса среды использование указателя анонимной функции. Эта функция сброса устанавливает переменную theta0
рабочего пространства модели к
pi
.
env.ResetFcn = @(in)setVariable(in,'theta0',pi,'Workspace',mdl);
Задайте время симуляции Tf
и шаг расчета агента Ts
в секундах
Ts = 0.05; Tf = 20;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
statePath = [ imageInputLayer([numObs 1 1],'Normalization','none','Name','observation') fullyConnectedLayer(400,'Name','CriticStateFC1') reluLayer('Name', 'CriticRelu1') fullyConnectedLayer(300,'Name','CriticStateFC2')]; actionPath = [ imageInputLayer([1 1 1],'Normalization','none','Name','action') fullyConnectedLayer(300,'Name','CriticActionFC1','BiasLearnRateFactor',0)]; commonPath = [ additionLayer(2,'Name','add') reluLayer('Name','CriticCommonRelu') fullyConnectedLayer(1,'Name','CriticOutput')]; criticNetwork = layerGraph(); criticNetwork = addLayers(criticNetwork,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
.
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOpts);
Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.
Создайте агента так же критику.
actorNetwork = [ imageInputLayer([numObs 1 1],'Normalization','none','Name','observation') fullyConnectedLayer(400,'Name','ActorFC1') reluLayer('Name','ActorRelu1') fullyConnectedLayer(300,'Name','ActorFC2') reluLayer('Name','ActorRelu2') fullyConnectedLayer(1,'Name','ActorFC3') tanhLayer('Name','ActorTanh') scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))]; actorOpts = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'ActorScaling'},actorOpts);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',128); agentOpts.NoiseOptions.Variance = 0.6; agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите обучение в большей части 50000
эпизоды, с каждым эпизодом, длящимся самое большее 400
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -740
более чем пять последовательных эпизодов. На данном этапе агент может быстро сбалансировать маятник в вертикальном положении с помощью минимального усилия по управлению.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше -740
.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'ScoreAveragingWindowLength',5,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-740,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-740);
Обучите агента с помощью train
функция. Обучение этот агент является в вычислительном отношении интенсивным процессом, который занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining
к false
. Чтобы обучить агента самостоятельно, установите doTraining
к true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load pretrained agent for the example. load('SimulinkPendulumDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
rlDDPGAgent
| rlSimulinkEnv
| train