В этом примере показано, как обучить агента сети глубокого Q-обучения (DQN) качаться вверх и балансировать маятник, смоделированный в Simulink ®.
Дополнительные сведения об агентах DQN см. в разделе Агенты Deep Q-Network. Пример подготовки агента DQN в MATLAB ® см. в разделе Подготовка агента DQN к балансировке системы Cart-Pole.
Среда обучения армированию для этого примера представляет собой простой бесфрикционный маятник, который первоначально висит в нижнем положении. Цель тренировки состоит в том, чтобы сделать маятник стоящим вертикально, не падая при минимальном усилии управления.
Откройте модель.
mdl = 'rlSimplePendulumModel';
open_system(mdl)
Для этой модели:
Уравновешенное вверх положение маятника равно 0 радиан, а нижнее положение подвешивания равно pi радианы.
Сигнал воздействия крутящего момента от агента к окружающей среде составляет от -2 до 2 Н· м.
Наблюдениями из окружающей среды являются синус угла маятника, косинус угла маятника и производная угла маятника.
Вознаграждение , предоставляемое на каждом временном интервале, составляет
θt2+0.1θt˙2+0.001ut-12)
Здесь:
- угол смещения из вертикального положения.
- производная угла смещения.
- контрольное усилие от предыдущего временного шага.
Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред 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 имеет пространство дискретных действий, он может полагаться на мультивыходный критический аппроксиматор, который обычно является более эффективным вариантом, чем на сопоставимый одновыходный аппроксиматор. Мультивыходный аппроксиматор имеет только наблюдение в качестве входного и выходной вектор, имеющий столько элементов, сколько возможно дискретных действий. Каждый выходной элемент представляет собой ожидаемое совокупное долгосрочное вознаграждение, следующее из наблюдения, данного в качестве входного сигнала, когда принимается соответствующее дискретное действие.
Для создания критика сначала создать глубокую нейронную сеть с входным вектором из трёх элементов (для синуса, косинуса и производной угла маятника) и одним выходным вектором с тремя элементами (-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))

Укажите параметры критического представления с помощью 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

Для проверки работоспособности обучаемого агента смоделируйте его в маятниковой среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);