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

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

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

Двойной интегратор среда MATLAB

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

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

  • Масса запускается в исходном положении +/-4 модуля.

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

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

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

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

где:

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

  • u сила, применился к массе

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

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

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

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

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

env.MaxForce = Inf;

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

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

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

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

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);

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

critic = rlRepresentation(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 = rlRepresentation(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).

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

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

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

Двойная система интегратора может визуализироваться с plot(env) во время обучения или симуляции.

plot(env);

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

doTraining = false;
if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load 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

MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.

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

Похожие темы