В этом примере показано, как обучить агента сети глубокого Q-обучения (DQN) балансировать систему тележек, смоделированную в MATLAB ®.
Дополнительные сведения об агентах DQN см. в разделе Агенты Deep Q-Network. Пример подготовки агента DQN в Simulink ® см. в разделе Подготовка агента DQN к качанию вверх и балансировке маятника.
Среда обучения армированию для этого примера представляет собой столб, прикрепленный к неактивированному соединению на тележке, которое перемещается по безфрикционной дорожке. Тренировочная цель - сделать стойку стойки вертикальной, не переваливая.

Для этой среды:
Вертикальное равновесное положение полюса 0 радианы, и положение подвешивания вниз pi радианы.
Столб начинается вертикально с начального угла от -0,05 до 0,05 радиана.
Сигнал силового воздействия от агента к окружающей среде составляет от -10 до 10 Н.
Наблюдения из среды - это положение и скорость тележки, угол полюса и производная угла полюса.
Эпизод заканчивается, если полюс находится более чем на 12 градусов от вертикали или если телега перемещается более чем на 2,4 м от исходного положения.
Вознаграждение + 1 предусмотрено за каждый шаг времени, когда столб остается в вертикальном положении. При падении полюса применяется штраф -5.
Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред системы управления.
Создайте предварительно определенный интерфейс среды для системы.
env = rlPredefinedEnv("CartPole-Discrete")env =
CartPoleDiscreteAction with properties:
Gravity: 9.8000
MassCart: 1
MassPole: 0.1000
Length: 0.5000
MaxForce: 10
Ts: 0.0200
ThetaThresholdRadians: 0.2094
XThreshold: 2.4000
RewardForNotFalling: 1
PenaltyForFalling: -5
State: [4x1 double]
Интерфейс имеет пространство дискретных действий, где агент может применить одно из двух возможных значений силы к корзине, -10 или 10 N.
Получите информацию о наблюдении и спецификации действий.
obsInfo = getObservationInfo(env)
obsInfo =
rlNumericSpec with properties:
LowerLimit: -Inf
UpperLimit: Inf
Name: "CartPole States"
Description: "x, dx, theta, dtheta"
Dimension: [4 1]
DataType: "double"
actInfo = getActionInfo(env)
actInfo =
rlFiniteSetSpec with properties:
Elements: [-10 10]
Name: "CartPole Action"
Description: [0x0 string]
Dimension: [1 1]
DataType: "double"
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент DQN аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, с помощью критика стоимости-функции.
Агенты DQN могут использовать многовыходные критические аппроксиматоры Q-значений, которые обычно более эффективны. Многоотходный аппроксиматор имеет наблюдения в качестве входных данных и значения действия состояния в качестве выходных данных. Каждый выходной элемент представляет собой ожидаемое совокупное долгосрочное вознаграждение за принятие соответствующего дискретного действия из состояния, указанного входами наблюдения.
Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (4-мерное наблюдаемое состояние) и одним выходным вектором с двумя элементами (один для действия 10 N, другой для действия -10 N). Дополнительные сведения о создании представлений «значение-функция» на основе нейронной сети см. в разделе Создание представлений политик и функций значений.
dnn = [
featureInputLayer(obsInfo.Dimension(1),'Normalization','none','Name','state')
fullyConnectedLayer(24,'Name','CriticStateFC1')
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(24, 'Name','CriticStateFC2')
reluLayer('Name','CriticCommonRelu')
fullyConnectedLayer(length(actInfo.Elements),'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.
agentOpts = rlDQNAgentOptions(... 'UseDoubleDQN',false, ... 'TargetSmoothFactor',1, ... 'TargetUpdateFrequency',4, ... 'ExperienceBufferLength',100000, ... 'DiscountFactor',0.99, ... 'MiniBatchSize',256);
Затем создайте агент DQN, используя указанное представление критика и параметры агента. Дополнительные сведения см. в разделе rlDQNAgent.
agent = rlDQNAgent(critic,agentOpts);
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции:
Запустите одну тренировку, содержащую не более 1000 эпизодов, причем каждый эпизод длится не более 500 временных шагов.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и отключите отображение командной строки (установите Verbose опция для false).
Прекратите обучение, когда агент получит скользящее среднее совокупное вознаграждение, превышающее 480. В этот момент агент может сбалансировать систему тележек в вертикальном положении.
Дополнительные сведения см. в разделе rlTrainingOptions.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',1000, ... 'MaxStepsPerEpisode',500, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',480);
Можно визуализировать систему тележек, которая может быть визуализирована с помощью plot функция во время обучения или моделирования.
plot(env)

Обучение агента с помощью train функция. Обучение этого агента - интенсивный вычислительный процесс, который занимает несколько минут. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load the pretrained agent for the example. load('MATLABCartpoleDQNMulti.mat','agent') end

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