В этом примере показано, как обучить агента актёра-критика (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);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запускайте каждый эпизод тренировки самое большее для 1000 эпизодов с каждым эпизодом, длящимся самое большее 500 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите 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