Обучите агента DDPG качаться вверх и балансировать маятник

Этот пример показывает, как обучить агента глубокого детерминированного градиента политики (DDPG) качаться и балансировать маятник, смоделированный в Simulink ®.

Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, который обучает агента DDPG в MATLAB ®, смотрите Обучите Агента DDPG для управления Системой Double Integrator.

Модель качания маятника

Окружение обучения с подкреплением для этого примера является математическим маятником без трения, который первоначально висит в нисходящем положении. Цель обучения состоит в том, чтобы сделать маятник вертикальным, не падая, используя минимальные усилия по управлению.

Откройте модель.

mdl = 'rlSimplePendulumModel';
open_system(mdl)

Для этой модели:

  • Положение сбалансированного маятника вверх 0 радианы, и положение свисания вниз pi радианы.

  • Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.

  • Наблюдения от окружения являются синусом угла маятника, косинусом угла маятника и производной угла маятника.

  • Вознаграждение rt, обеспечивается на каждом временном шаге,

rt=-(θt2+0.1θt˙2+0.001ut-12)

Здесь:

  • θt - угол смещения из вертикального положения.

  • θt˙ является производной от угла перемещения.

  • ut-1 - усилие управления от предыдущего временного шага.

Для получения дополнительной информации об этой модели см. Раздел «Загрузка предопределённых окружений 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

Агент 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)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика используя 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

Моделирование агента DDPG

Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);

Figure Simple Pendulum Visualizer contains an axes. The axes contains 2 objects of type line, rectangle.

См. также

| |

Похожие темы