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

Для этой среды:
Восходящим сбалансированным положением маятника является 0 радианами и нисходящим положением зависания является pi радианы
Маятник запускается вертикально с начального угла + /- 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 Н.
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DQN аппроксимирует долгосрочные премиальные заданные наблюдения и действия с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности нейронной сети смотрите, Создают Представления Функции ценности и политика.
statePath = [
imageInputLayer([4 1 1],'Normalization','none','Name','state')
fullyConnectedLayer(24,'Name','CriticStateFC1')
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(24,'Name','CriticStateFC2')];
actionPath = [
imageInputLayer([1 1 1],'Normalization','none','Name','action')
fullyConnectedLayer(24,'Name','CriticActionFC1')];
commonPath = [
additionLayer(2,'Name','add')
reluLayer('Name','CriticCommonRelu')
fullyConnectedLayer(1,'Name','output')];
criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, actionPath);
criticNetwork = addLayers(criticNetwork, commonPath);
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');Просмотрите конфигурацию сети критика.
figure plot(criticNetwork)

Задайте опции для представления критика с помощью rlRepresentationOptions.
criticOpts = rlRepresentationOptions('LearnRate',0.01,'GradientThreshold',1);
Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},criticOpts);
Чтобы создать агента DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions.
agentOpts = rlDQNAgentOptions(... 'UseDoubleDQN',false, ... 'TargetUpdateMethod',"periodic", ... 'TargetUpdateFrequency',4, ... 'ExperienceBufferLength',100000, ... 'DiscountFactor',0.99, ... 'MiniBatchSize',256);
Затем создайте агента DQN с помощью заданного представления критика и опций агента. Для получения дополнительной информации смотрите rlDQNAgent.
agent = rlDQNAgent(critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите один сеанс обучения, содержащий самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите 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 pretrained agent for the example. load('MATLABCartpoleDQN.mat','agent'); end

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