Обучите агента DDPG управлять системой двойного интегратора

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

Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Для примера, показывающего, как обучить агента DDPG в Simulink ®, смотрите Train DDPG Agent to Swing Up and Balance Mendulum.

Интегратор MATLAB Окружения

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

Для этого окружения:

  • Масса начинается с начального положения от -4 до 4 модулей.

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

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

  • Эпизод прекращается, если масса перемещается более чем на 5 м от исходного положения или если |x|<0.01.

  • Вознаграждение rt, предоставляемый на каждом временном шаге, является дискретизацией r(t):

r(t)=-(x(t)Qx(t)+u(t)Ru(t))

Здесь:

  • x - вектор состояния массы.

  • u - сила, приложенная к массе.

  • Q - веса на эффективности системы управления; Q=[100;01].

  • R - вес усилия по управлению; R=0.01.

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

Создайте интерфейс окружения

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

env = rlPredefinedEnv("DoubleIntegrator-Continuous")
env = 
  DoubleIntegratorContinuousAction with properties:

             Gain: 1
               Ts: 0.1000
      MaxDistance: 5
    GoalThreshold: 0.0100
                Q: [2x2 double]
                R: 0.0100
         MaxForce: Inf
            State: [2x1 double]

env.MaxForce = Inf;

Интерфейс имеет непрерывное пространство действий, где агент может применить значения силы от - Inf на Inf в массу.

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

obsInfo = getObservationInfo(env);
numObservations = obsInfo.Dimension(1);
actInfo = getActionInfo(env);
numActions = numel(actInfo);

Исправьте начальное значение генератора для повторяемости.

rng(0)

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

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

statePath = imageInputLayer([numObservations 1 1],'Normalization','none','Name','state');
actionPath = imageInputLayer([numActions 1 1],'Normalization','none','Name','action');
commonPath = [concatenationLayer(1,2,'Name','concat')
             quadraticLayer('Name','quadratic')
             fullyConnectedLayer(1,'Name','StateValue','BiasLearnRateFactor',0,'Bias',0)];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork,'state','concat/in1');
criticNetwork = connectLayers(criticNetwork,'action','concat/in2');

Просмотрите строение критика.

figure
plot(criticNetwork)

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

Задайте опции для представления критика используя rlRepresentationOptions.

criticOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);

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

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},criticOpts);

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

Построение актёра подобно критику.

actorNetwork = [
    imageInputLayer([numObservations 1 1],'Normalization','none','Name','state')
    fullyConnectedLayer(numActions,'Name','action','BiasLearnRateFactor',0,'Bias',0)];

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

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},actorOpts);

Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions.

agentOpts = rlDDPGAgentOptions(...
    'SampleTime',env.Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',32);
agentOpts.NoiseOptions.StandardDeviation = 0.3;
agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-6;

Создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOpts);

Обучите агента

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

  • Запуск не более 1000 эпизодов в обучающем сеансе с каждым эпизодом, длящимся самое большее 200 временных шагов.

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots опция) и отключить отображение командной строки (установите Verbose опция).

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

Для получения дополнительной информации смотрите rlTrainingOptions.

trainOpts = rlTrainingOptions(...
    'MaxEpisodes', 5000, ...
    'MaxStepsPerEpisode', 200, ...
    'Verbose', false, ...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-66);

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

plot(env)

Figure Double Integrator Visualizer contains an axes. The axes contains an object of type rectangle.

Обучите агента с помощью 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('DoubleIntegDDPG.mat','agent');
end

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

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

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

Figure Double Integrator Visualizer contains an axes. The axes contains an object of type rectangle.

totalReward = sum(experience.Reward)
totalReward = single
    -65.9933

См. также

Похожие темы