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

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

Для получения дополнительной информации об основном агенте PG без базовой линии смотрите, что пример Обучает Агента PG Балансировать Систему Тележки с шестом.

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

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

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

  • Масса запускается в исходном положении между –2 и 2 модулями.

  • Сигнал действия силы от агента до среды от –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.

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

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

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

env = rlPredefinedEnv("DoubleIntegrator-Discrete")
env = 
  DoubleIntegratorDiscreteAction with properties:

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

Интерфейс имеет дискретное пространство действий, где агент может применить одно из трех возможных значений силы к массе:-2, 0, или 2 Н.

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

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

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

rng(0)

Создайте агента агента PG

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

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

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

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

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

actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},actorOpts);

Создайте базовую линию агента PG

Базовая линия, которая меняется в зависимости от состояния, может уменьшать отклонение ожидаемого значения обновления и таким образом улучшить скорость изучения для агента PG. Возможный элемент для выбора для базовой линии является оценкой функции ценности состояния [1].

В этом случае базовое представление является глубокой нейронной сетью с одним входом (состояние) и один выход (значение состояния).

Создайте базовую линию подобным образом к агенту.

baselineNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','state')
    fullyConnectedLayer(8,'Name','BaselineFC')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(1,'Name','BaselineFC2','BiasLearnRateFactor',0)];

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

baseline = rlValueRepresentation(baselineNetwork,obsInfo,'Observation',{'state'},baselineOpts);

Чтобы создать агента PG с базовой линией, задайте опции агента PG с помощью rlPGAgentOptions и набор UseBaseline набор опции к true.

agentOpts = rlPGAgentOptions(...
    'UseBaseline',true, ...
    'DiscountFactor',0.99);

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

agent = rlPGAgent(actor,baseline,agentOpts);

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

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

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

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

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

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

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

Можно визуализировать двойную систему интегратора с помощью 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 parameters for the example.
    load('DoubleIntegPGBaseline.mat');
end

Симулируйте агента PG

Чтобы подтвердить производительность обученного агента, симулируйте его в двойной среде интегратора. Для получения дополнительной информации о симуляции агента смотрите 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 = -43.0392

Ссылки

[1] Саттон, Ричард С. и Эндрю Г. Барто. Обучение с подкреплением: Введение. Второй выпуск. Адаптивный Ряд Расчета и Машинного обучения. Кембридж, MA: Нажатие MIT, 2018.

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

Похожие темы