В этом примере показано, как обучить агента критика агента (AC) балансировать систему тележки с шестом, смоделированную в MATLAB®.
Для получения дополнительной информации об агентах AC смотрите Агентов Критика Агента. Для примера, показывающего, как обучить агента AC с помощью параллельных вычислений, смотрите, Обучают Агента AC Балансировать Систему Тележки с шестом Используя Параллельные вычисления.
Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на тележке, которая проходит лишенная трения дорожка. Цель обучения должна заставить маятник стоять вертикально без падения.
Для этой среды:
Восходящим сбалансированным положением маятника является 0
радианами и нисходящим положением зависания является pi
радианы.
Маятник запускается вертикально с начального угла между –0.05 и 0,5 рад.
Сигнал действия силы от агента до среды от –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]
env.PenaltyForFalling = -10;
Интерфейс имеет дискретное пространство действий, где агент может применить одно из двух возможных значений силы к тележке, –10 или 10 Н.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент AC аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (значение состояния). Входной размер сети критика 4, поскольку среда имеет четыре наблюдения. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.
criticNetwork = [ featureInputLayer(4,'Normalization','none','Name','state') fullyConnectedLayer(1,'Name','CriticFC')];
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также указать информацию действия и наблюдения для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlValueRepresentation
.
critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
Агент AC решает который действие взять, заданные наблюдения, с помощью представления актера. Чтобы создать агента, создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие). Выходной размер сети агента 2, поскольку среда имеет два возможных действия, –10 и 10.
Создайте агента подобным образом критику. Для получения дополнительной информации смотрите rlStochasticActorRepresentation
.
actorNetwork = [ featureInputLayer(4,'Normalization','none','Name','state') fullyConnectedLayer(2,'Name','fc') softmaxLayer('Name','actionProb')]; actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1); actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'state'},actorOpts);
Чтобы создать агента AC, сначала задайте опции агента AC с помощью rlACAgentOptions
.
agentOpts = rlACAgentOptions(... 'NumStepsToLookAhead',32, ... 'DiscountFactor',0.99);
Затем создайте агента с помощью заданного представления актера и опций агента по умолчанию. Для получения дополнительной информации смотрите rlACAgent
.
agent = rlACAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции.
Запустите каждый эпизод тренировки для самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция к false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 480 более чем 10 последовательных эпизодов. На данном этапе агент может сбалансировать маятник в вертикальном положении.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',1000,... 'MaxStepsPerEpisode',500,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',480,... 'ScoreAveragingWindowLength',10);
Можно визуализировать систему тележки с шестом во время обучения или симуляции с помощью 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('MATLABCartpoleAC.mat','agent'); end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500