Этот пример показывает, как обучить агента актёра-критика (AC) балансировать систему тележки с шестом, смоделированную в MATLAB ®, используя асинхронное параллельное обучение. Для примера, который показывает, как обучить агента, не используя параллельное обучение, смотрите Обучите агента AC для балансировки системы тележки с шестом.
Когда вы используете параллельные вычисления с агентами AC, каждый рабочий процесс генерирует опыт из своей копии агента и окружения. После каждого N
шаг, рабочий вычисляет градиенты из опыта и отправляет вычисленные градиенты назад агенту хоста. Агент хоста обновляет свои параметры следующим образом.
Для асинхронного обучения агент хоста применяет полученные градиенты, не дожидаясь отправки градиентов всеми работниками, и отправляет обновленные параметры обратно работнику, предоставившему градиенты. Затем рабочий процесс продолжает генерировать опыт из своего окружения, используя обновленные параметры.
Для синхронного обучения агент хоста ожидает получения градиентов от всех работников и обновляет свои параметры с помощью этих градиентов. Затем хост отправляет обновленные параметры всем работникам одновременно. Затем все работники продолжают генерировать опыт, используя обновленные параметры.
Создайте предопределенный интерфейс окружения для системы тележки с шестом. Для получения дополнительной информации об этом окружении см. Раздел «Загрузка предопределенных Окружений системы управления».
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
временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите 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] Мних, Владимир, Адриа Пучдомех Бадия, Мехди Мирза, Алекс Грейвс, Тимоти П. Лилликрап, Тим Харли, Дэвид Сильвер и Корай Кавуккуоглу. «Асинхронные методы глубокого Обучения с подкреплением». ArXiv:1602.01783 [Cs], 16 июня 2016 года. https://arxiv.org/abs/1602.01783.