Обучите агента 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 = featureInputLayer(numObservations,'Normalization','none','Name','state');
actionPath = featureInputLayer(numActions,'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 object. The axes object 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 = [
    featureInputLayer(numObservations,'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, ...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-66);

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

plot(env)

Figure Double Integrator Visualizer contains an axes object. The axes object 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 object. The axes object contains an object of type rectangle.

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

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

Похожие темы