Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) качаться и балансировать маятник, смоделированный в Simulink ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, который обучает агента DDPG в MATLAB ®, смотрите Обучите Агента DDPG для управления Системой Double Integrator.
Окружение обучения с подкреплением для этого примера является математическим маятником без трения, который первоначально висит в нисходящем положении. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.
Откройте модель.
mdl = 'rlSimplePendulumModel';
open_system(mdl)
Для этой модели:
Положение сбалансированного маятника вверх 0
радианы, и положение свисания вниз pi
радианы.
Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.
Наблюдения от окружения являются синусом угла маятника, косинусом угла маятника и производной угла маятника.
Вознаграждение , обеспечивается на каждом временном шаге,
Здесь:
- угол смещения из вертикального положения.
является производной от угла перемещения.
- усилие управления от предыдущего временного шага.
Для получения дополнительной информации об этой модели см. Раздел «Загрузка предопределённых окружений Simulink».
Создайте предопределенный интерфейс окружения для маятника.
env = rlPredefinedEnv('SimplePendulumModel-Continuous')
env = SimulinkEnvWithAgent with properties: Model : rlSimplePendulumModel AgentBlock : rlSimplePendulumModel/RL Agent ResetFcn : [] UseFastRestart : on
Интерфейс имеет непрерывное пространство действий, где агент может применить значения крутящего момента между -2 и 2 Н· м к маятнику.
Установите наблюдения окружения как синус угла маятника, косинуса угла маятника и производной угла маятника.
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 = [ featureInputLayer(numObs,'Normalization','none','Name','observation') fullyConnectedLayer(400,'Name','CriticStateFC1') reluLayer('Name', 'CriticRelu1') fullyConnectedLayer(300,'Name','CriticStateFC2')]; actionPath = [ featureInputLayer(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);
Создайте представление критика с помощью заданных глубокой нейронной сети и опций. Вы также должны задать информацию о действии и наблюдении для критика, которую вы получаете из интерфейса окружения. Для получения дополнительной информации смотрите rlQValueRepresentation
.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOpts);
Агент DDPG решает, какое действие взять заданные наблюдения, используя представление актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом, наблюдением и одним выходом, действием.
Построение актёра подобно критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(numObs,'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 = rlDeterministicActorRepresentation(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.StandardDeviation = 0.6; agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запустите обучение на самое большее 50000 эпизодах с каждым эпизодом, длящимся самое большее ceil(Tf/Ts)
временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и отключить отображение командной строки (установите Verbose
опция для false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше -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 the pretrained agent for the example. load('SimulinkPendulumDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
rlDDPGAgent
| rlSimulinkEnv
| train