exponenta event banner

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

В этом примере показано, как обучить агент глубокого детерминированного политического градиента (DDPG) качаться вверх и уравновешивать маятник с помощью наблюдения изображения, смоделированного в MATLAB ®.

Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.

Простой маятник с изображением MATLAB

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

Для этой среды:

  • Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.

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

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

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

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

Здесь:

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

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

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

Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред системы управления.

Создание интерфейса среды

Создайте предопределенный интерфейс среды для маятника.

env = rlPredefinedEnv('SimplePendulumWithImage-Continuous')
env = 
  SimplePendlumWithImageContinuousAction with properties:

             Mass: 1
        RodLength: 1
       RodInertia: 0
          Gravity: 9.8100
     DampingRatio: 0
    MaximumTorque: 2
               Ts: 0.0500
            State: [2x1 double]
                Q: [2x2 double]
                R: 1.0000e-03

Интерфейс имеет непрерывное пространство действия, в котором агент может прикладывать крутящий момент от -2 до 2 Н· м.

Получение спецификации наблюдения и действия из интерфейса среды.

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Зафиксируйте начальное число случайного генератора для воспроизводимости.

rng(0)

Создание агента DDPG

Агент DDPG аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую сверточную нейронную сеть (CNN) с тремя входами (изображение, угловая скорость и действие) и одним выходом. Дополнительные сведения о создании представлений см. в разделе Создание представлений политик и функций значений.

hiddenLayerSize1 = 400;
hiddenLayerSize2 = 300;

imgPath = [
    imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
    convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
    reluLayer('Name','relu1')
    fullyConnectedLayer(2,'Name','fc1')
    concatenationLayer(3,2,'Name','cat1')
    fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')
    ];
dthetaPath = [
    imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
    fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
    ];
actPath =[
    imageInputLayer(actInfo(1).Dimension,'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc6','BiasLearnRateFactor',0,'Bias',zeros(hiddenLayerSize2,1))
    ];

criticNetwork = layerGraph(imgPath);
criticNetwork = addLayers(criticNetwork,dthetaPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = connectLayers(criticNetwork,'fc5','cat1/in2');
criticNetwork = connectLayers(criticNetwork,'fc6','add/in2');

Просмотр конфигурации сети критиков.

figure
plot(criticNetwork)

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

Укажите параметры критического представления с помощью rlRepresentationOptions.

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

Раскомментируйте следующую строку, чтобы использовать GPU для ускорения обучения критика CNN. Дополнительные сведения о поддерживаемых графических процессорах см. в разделе Поддержка графических процессоров по выпуску (Панель инструментов параллельных вычислений).

% criticOptions.UseDevice = 'gpu';

Создайте критическое представление, используя указанную нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation.

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation',{'pendImage','angularRate'},'Action',{'action'},criticOptions);

Агент DDPG решает, какое действие предпринять для данных наблюдений, используя представление актера. Для создания актёра сначала создать глубокую сверточную нейронную сеть (CNN) с двумя входами (изображение и угловая скорость) и одним выходом (действие).

Сконструировать актера аналогично критику.

imgPath = [
    imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
    convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
    reluLayer('Name','relu1')
    fullyConnectedLayer(2,'Name','fc1')
    concatenationLayer(3,2,'Name','cat1')
    fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')
    tanhLayer('Name','tanh1')
    scalingLayer('Name','scale1','Scale',max(actInfo.UpperLimit))
    ];
dthetaPath = [
    imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
    fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
    ];

actorNetwork = layerGraph(imgPath);
actorNetwork = addLayers(actorNetwork,dthetaPath);
actorNetwork = connectLayers(actorNetwork,'fc5','cat1/in2');

actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);

Раскомментируйте следующую строку, чтобы использовать GPU для ускорения обучения актера CNN.

% actorOptions.UseDevice = 'gpu';

Создайте представление актера, используя указанную нейронную сеть и опции. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation.

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'pendImage','angularRate'},'Action',{'scale1'},actorOptions);

Просмотр конфигурации сети актера.

figure
plot(actorNetwork)

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

Для создания агента DDPG сначала укажите параметры агента DDPG с помощью rlDDPGAgentOptions.

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',env.Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',128);
agentOptions.NoiseOptions.Variance = 0.6;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;

Затем создайте агента, используя указанное представление актера, представление критика и параметры агента. Дополнительные сведения см. в разделе rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOptions);

Агент поезда

Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции.

  • Запустите каждую тренировку максимум для 5000 эпизодов, причем каждый эпизод длится максимум 400 временных шагов.

  • Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots опция).

  • Прекратите обучение, когда агент получает скользящее среднее совокупное вознаграждение, превышающее -740 в течение десяти последовательных эпизодов. В этот момент агент может быстро сбалансировать маятник в вертикальном положении, используя минимальное усилие управления.

Дополнительные сведения см. в разделе rlTrainingOptions.

maxepisodes = 5000;
maxsteps = 400;
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-740);

Маятник можно визуализировать с помощью plot функция во время обучения или моделирования.

plot(env)

Figure Simple Pendulum Visualizer contains 2 axes. Axes 1 contains 2 objects of type line, rectangle. Axes 2 contains an object of type image.

Обучение агента с помощью train функция. Обучение этого агента - интенсивный вычислительный процесс, который занимает несколько часов. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions);
else
    % Load pretrained agent for the example.
    load('SimplePendulumWithImageDDPG.mat','agent')       
end

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

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

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

Figure Simple Pendulum Visualizer contains 2 axes. Axes 1 contains 2 objects of type line, rectangle. Axes 2 contains an object of type image.

См. также

Связанные темы