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

В этом примере показано, как обучить агента градиента политики (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 Double Integrator

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

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 N.

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

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

Исправьте начальное значение генератора для повторяемости.

rng(0)

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

Агент 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);

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

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

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

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите 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. The axes 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. The axes contains an object of type rectangle.

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

Ссылки

[1] Саттон, Ричард С. и Эндрю Г. Барто. Обучение с подкреплением: введение. Второе издание. Серия адаптивных расчетов и машинного обучения. Cambridge, MA: The MIT Press, 2018.

См. также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте