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

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

Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики. Для примера, показывающего, как обучить агента DDPG в Simulink®, смотрите, Обучают Агента DDPG к Swing и Маятнику Баланса.

Двойной интегратор среда 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)

Задайте опции для представления критика с помощью 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.Variance = 0.3;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-6;

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

agent = rlDDPGAgent(actor,critic,agentOpts);

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

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

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

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

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

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

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

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

plot(env)

Обучите агента с помощью 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);

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

Смотрите также

Похожие темы