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

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

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

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

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

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

  • Масса запускается в исходном положении +/-2 модуля. Сигнал действия силы от агента до среды от -От 2 до 2 Н.

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

  • Эпизод завершает работу, если масса перемещает больше, чем 5 m от исходного положения или если |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 = [
    imageInputLayer([numObservations 1 1],'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 = [
    imageInputLayer([numObservations 1 1],'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 с UseBaseline набор опции к истинному использованию rlPGAgentOptions.

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',-45);

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

plot(env)

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

doTraining = false;

if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained parameters for the example.
    load('DoubleIntegPGBaselineParams.mat');
    iLoadPretrainedParams(agent,actorParams,criticParams);
end

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

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

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

totalReward = sum(experience.Reward)
totalReward = -43.2169

Локальная функция

Функция, чтобы обновить агента предварительно обученными параметрами

function iLoadPretrainedParams(agent,actorParams,criticParams)
actor  = getActor(agent);
pretrainedActor  = setLearnableParameters(actor, actorParams);
critic = getCritic(agent);
pretrainedCritic = setLearnableParameters(critic, criticParams);

setActor(agent,pretrainedActor);
setCritic(agent,pretrainedCritic);
end

Ссылки

[1] Саттон, Barto. "Обучение с подкреплением: Введение", Нажатие MIT, Кембридж, 2-й Выпуск, p. 330, 2018.

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

Похожие темы