Этот пример расширяет Агент AC Train в качестве примера, чтобы Сбалансировать полюсную Корзиной Систему, чтобы продемонстрировать асинхронное параллельное обучение агента Критика агента (AC) [1], чтобы сбалансировать полюсную корзиной систему, смоделированную в MATLAB®.
При использовании параллельных вычислений с агентами AC каждый рабочий генерирует события из его копии агента и среды. После каждого N
шаги рабочий вычисляет градиенты из событий и передает вычисленные градиенты обратно в агент хоста. Агент хоста обновляет свои параметры можно следующим образом:
Для асинхронного обучения агент хоста применяет полученные градиенты и передает обновленные параметры обратно рабочему, который обеспечил градиенты. Затем рабочий продолжает генерировать события от его среды с помощью обновленных параметров.
Для синхронного обучения агент хоста ожидает, чтобы получить градиенты от всех рабочих и обновляет свои параметры с помощью этих градиентов. Хост затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.
Создайте предопределенный интерфейс среды для полюсной корзиной системы. Для получения дополнительной информации об этой среде смотрите Загрузку Предопределенные Среды Системы управления.
env = rlPredefinedEnv("CartPole-Discrete");
env.PenaltyForFalling = -10;
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Зафиксируйте случайный seed генератора для воспроизводимости.
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,criticOpts,'Observation',{'state'},obsInfo);
Агент 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,actorOpts,'Observation',{'state'},obsInfo,'Action',{'action'},actInfo);
Чтобы создать агент 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
. Из-за случайности в асинхронном параллельном обучении, можно ожидать, что различное обучение следует из следующего графика traing. Пример обучен с шестью рабочими.
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.
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.