В этом примере показано, как обучить агента критика агента (AC) балансировать систему тележки с шестом, смоделированную в MATLAB® при помощи асинхронного параллельного обучения. Для примера, который показывает, как обучить агента, не используя параллельное обучение, смотрите, Обучают Агента AC Балансировать Систему Тележки с шестом.
Когда вы используете параллельные вычисления с агентами AC, каждый рабочий генерирует события из его копии агента и среды. После каждого N
шаги, рабочий вычисляет градиенты из событий и передает вычисленные градиенты обратно в клиентского агента (агент, сопоставленный с процессом MATLAB®, который запускает обучение). Клиентский агент обновляет свои параметры можно следующим образом.
Для асинхронного обучения клиентский агент применяет полученные градиенты, не ожидая всех рабочих, чтобы отправить градиенты и передает обновленные параметры обратно рабочему, который предоставил градиенты. Затем рабочий продолжает генерировать события его средой с помощью обновленных параметров.
Для синхронного обучения клиентский агент ожидает, чтобы получить градиенты от всех рабочих и обновляет свои параметры с помощью этих градиентов. Клиент затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.
Для получения дополнительной информации о синхронном по сравнению с асинхронным распараллеливанием, смотрите, Обучают Агентов Используя Параллельные вычисления и графические процессоры.
Создайте предопределенный интерфейс среды для системы тележки с шестом. Для получения дополнительной информации об этой среде смотрите Загрузку Предопределенные Среды Системы управления.
env = rlPredefinedEnv("CartPole-Discrete");
env.PenaltyForFalling = -10;
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент AC аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (значение состояния). Входной размер сети критика 4, поскольку среда обеспечивает 4 наблюдения. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.
criticNetwork = [ featureInputLayer(4,'Normalization','none','Name','state') fullyConnectedLayer(32,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(1, 'Name', 'CriticFC')]; criticOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1); critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
Агент AC решает который действие взять, заданные наблюдения, с помощью представления актера. Чтобы создать агента, создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие). Выходной размер сети агента 2, поскольку агент может применить 2 значения силы к среде, –10 и 10.
actorNetwork = [ featureInputLayer(4,'Normalization','none','Name','state') fullyConnectedLayer(32, 'Name','ActorStateFC1') reluLayer('Name','ActorRelu1') fullyConnectedLayer(2,'Name','action')]; actorOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1); actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'state'},actorOpts);
Чтобы создать агента AC, сначала задайте опции агента AC с помощью rlACAgentOptions
.
agentOpts = rlACAgentOptions(... 'NumStepsToLookAhead',32,... 'EntropyLossWeight',0.01,... 'DiscountFactor',0.99);
Затем создайте агента с помощью заданного представления актера и опций агента. Для получения дополнительной информации смотрите rlACAgent
.
agent = rlACAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции.
Запустите каждое обучение в большей части 1000
эпизоды, с каждым эпизодом, длящимся в большей части 500
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 500
по 10
последовательные эпизоды. На данном этапе агент может сбалансировать маятник в вертикальном положении.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',1000,... 'MaxStepsPerEpisode', 500,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',500,... 'ScoreAveragingWindowLength',10);
Можно визуализировать систему тележки с шестом, может во время обучения или симуляции с помощью plot
функция.
plot(env)
Чтобы обучить агента с помощью параллельных вычислений, задайте следующие опции обучения.
Установите UseParallel
опция к True
.
Обучите агента параллельно асинхронно путем установки ParallelizationOptions.Mode
опция к "async"
.
После каждых 32 шагов каждый рабочий вычисляет градиенты из событий, и отправьте их клиенту.
Агент AC требует, чтобы рабочие отправили "gradients"
клиенту.
Агент AC требует 'StepsUntilDataIsSent'
быть равным agentOptions.NumStepsToLookAhead
.
trainOpts.UseParallel = true; trainOpts.ParallelizationOptions.Mode = "async"; trainOpts.ParallelizationOptions.DataToSendFromWorkers = "gradients"; trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
Для получения дополнительной информации смотрите rlTrainingOptions
.
Обучите агента с помощью 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('MATLABCartpoleParAC.mat','agent'); end
Можно визуализировать систему тележки с шестом с функцией построения графика в процессе моделирования.
plot(env)
Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500
[1] Mnih, Владимир, Adrià Puigdomènech Бадия, Мехди Мирза, Алекс Грэйвс, Тимоти П. Лилликрэп, Тим Харли, Дэвид Сильвер и Корей Кэваккуоглу. ‘Асинхронные методы для Глубокого Обучения с подкреплением’. ArXiv:1602.01783 [Cs], 16 июня 2016. https://arxiv.org/abs/1602.01783.