Этот пример расширяет пример, Обучают Агента AC Балансировать полюсную Корзиной Систему, чтобы продемонстрировать асинхронное параллельное обучение агента Критика агента (AC) [1], чтобы сбалансировать полюсную корзиной систему, смоделированную в MATLAB®.
При использовании параллельных вычислений с агентами AC каждый рабочий генерирует события из его копии агента и среды. После каждого N
шаги, рабочий вычисляет градиенты из событий и передает вычисленные градиенты обратно в агента хоста. Агент хоста обновляет свои параметры можно следующим образом:
Для асинхронного обучения агент хоста применяет полученные градиенты и передает обновленные параметры обратно рабочему, который обеспечил градиенты. Затем рабочий продолжает генерировать события его средой с помощью обновленных параметров.
Для синхронного обучения агент хоста ожидает, чтобы получить градиенты от всех рабочих и обновляет свои параметры с помощью этих градиентов. Хост затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.
Создайте предопределенный интерфейс среды для полюсной корзиной системы. Для получения дополнительной информации об этой среде смотрите Загрузку Предопределенные Среды Системы управления.
env = rlPredefinedEnv("CartPole-Discrete");
env.PenaltyForFalling = -10;
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент AC аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (значение состояния). Входным размером сети критика является [4 1 1]
поскольку среда обеспечивает 4 наблюдения. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
criticNetwork = [ imageInputLayer([4 1 1],'Normalization','none','Name','state') fullyConnectedLayer(32,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(1, 'Name', 'CriticFC')]; criticOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1); critic = rlRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);
Агент AC решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие). Выходной размер сети агента 2, поскольку агент может применить 2 значения силы к среде,-10 и 10.
actorNetwork = [ imageInputLayer([4 1 1],'Normalization','none','Name','state') fullyConnectedLayer(32, 'Name','ActorStateFC1') reluLayer('Name','ActorRelu1') fullyConnectedLayer(2,'Name','action')]; actorOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'state'},'Action',{'action'},actorOpts);
Чтобы создать агента AC, сначала задайте опции агента AC с помощью rlACAgentOptions
.
agentOpts = rlACAgentOptions(... 'NumStepsToLookAhead',32,... 'EntropyLossWeight',0.01,... 'DiscountFactor',0.99);
Затем создайте агента с помощью заданного представления агента и опций агента. Для получения дополнительной информации смотрите rlACAgent
.
agent = rlACAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 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 pretrained agent for the example. load('MATLABCartpoleParAC.mat','agent'); end
Полюсная корзиной система может визуализироваться с plot(env)
в процессе моделирования.
plot(env)
Чтобы подтвердить производительность обученного агента, симулируйте его в полюсной корзиной среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500
[1] Mnih, V, и др. "Асинхронные методы для глубокого обучения с подкреплением", Международная конференция по вопросам Машинного обучения, 2016.