Обучите агента DQN качаться вверх и балансировать маятник

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

Дополнительные сведения об агентах DQN см. в разделе Агенты глубоких Q-сетей. Для примера, который обучает агента DQN в MATLAB ®, смотрите Обучите агента DQN для балансировки системы тележки с шестом.

Модель качания маятника

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

Откройте модель.

mdl = 'rlSimplePendulumModel';
open_system(mdl)

Для этой модели:

  • Положение уравновешенного маятника вверх составляет 0 радиан, а положение свешивания вниз pi радианы.

  • Сигнал действия крутящего момента от агента к окружению от -2 до 2 Н· м.

  • Наблюдения от окружения являются синусом угла маятника, косинусом угла маятника и производной угла маятника.

  • Вознаграждение rt, предоставляется в любое время,

rt=-(θt2+0.1θt˙2+0.001ut-12)

Здесь:

  • θt - угол смещения из вертикального положения.

  • θt˙ является производной от угла перемещения.

  • ut-1 - усилие управления от предыдущего временного шага.

Для получения дополнительной информации об этой модели см. Раздел «Загрузка предопределённых окружений Simulink».

Создайте интерфейс окружения

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

env = rlPredefinedEnv('SimplePendulumModel-Discrete')
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

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

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

env.ResetFcn = @(in)setVariable(in,'theta0',pi,'Workspace',mdl);

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

obsInfo = getObservationInfo(env)
obsInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "observations"
    Description: [0x0 string]
      Dimension: [3 1]
       DataType: "double"

actInfo = getActionInfo(env)
actInfo = 
  rlFiniteSetSpec with properties:

       Elements: [3x1 double]
           Name: "torque"
    Description: [0x0 string]
      Dimension: [1 1]
       DataType: "double"

Задайте время симуляции Tf и шаг расчета агентом Ts в секундах.

Ts = 0.05;
Tf = 20;

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

rng(0)

Создание агента DQN

Агент DQN аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя функцию ценности критика.

Поскольку DQN имеет дискретное пространство действий, он может опираться на мультивыход, которая в целом является более эффективной опцией, чем опора на сопоставимую аппроксимацию с одним выходом. Мультивыход аппроксимация имеет только наблюдение как вход и выходной вектор, имеющий столько элементов, сколько количества возможных дискретных действий. Каждый выходной элемент представляет ожидаемое совокупное долгосрочное вознаграждение, последующее от наблюдения, данного как вход, когда принято соответствующее дискретное действие.

Чтобы создать критика, сначала создайте глубокую нейронную сеть с вектором входа из трех элементов (для синуса, косинуса и производной угла маятника) и одним вектором выхода с тремя элементами (-2, 0 или 2 Nm действия). Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.

dnn = [
    featureInputLayer(3,'Normalization','none','Name','state')
    fullyConnectedLayer(24,'Name','CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(48,'Name','CriticStateFC2')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(3,'Name','output')];

Просмотрите строение критика.

figure
plot(layerGraph(dnn))

Figure contains an axes. The axes contains an object of type graphplot.

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

criticOpts = rlRepresentationOptions('LearnRate',0.001,'GradientThreshold',1);

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

critic = rlQValueRepresentation(dnn,obsInfo,actInfo,'Observation',{'state'},criticOpts);

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

agentOptions = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',3000,... 
    'UseDoubleDQN',false,...
    'DiscountFactor',0.9,...
    'MiniBatchSize',64);

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

agent = rlDQNAgent(critic,agentOptions);

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

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

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

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

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

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше -1100.

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

trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',1000,...
    'MaxStepsPerEpisode',500,...
    'ScoreAveragingWindowLength',5,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-1100,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',-1100);

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

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions);
else
    % Load the pretrained agent for the example.
    load('SimulinkPendulumDQNMulti.mat','agent');
end

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

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

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

Figure Simple Pendulum Visualizer contains an axes. The axes contains 2 objects of type line, rectangle.

См. также

Похожие темы