Обучите агента DQN к Swing и маятнику баланса

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

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

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

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

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

mdl = 'rlSimplePendulumModel';
open_system(mdl)

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

  • Восходящее сбалансированное положение маятника является 0 радианами, и нисходящим положением зависания является pi радианы.

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

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

  • Вознаграждение 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 Н · m.

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

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

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

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

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

  • Отобразите прогресс обучения в диалоговом окне Episode Manager (установите 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.

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

Похожие темы