Обучите агента AC балансировать систему тележки с шестом Используя параллельные вычисления

В этом примере показано, как обучить агента критика агента (AC) балансировать систему тележки с шестом, смоделированную в MATLAB® при помощи асинхронного параллельного обучения. Для примера, который показывает, как обучить агента, не используя параллельное обучение, смотрите, Обучают Агента AC Балансировать Систему Тележки с шестом.

Обучение параллели агента

Когда вы используете параллельные вычисления с агентами AC, каждый рабочий генерирует события из его копии агента и среды. После каждого N шаги, рабочий вычисляет градиенты из событий и передает вычисленные градиенты обратно в клиентского агента (агент, сопоставленный с процессом MATLAB®, который запускает обучение). Клиентский агент обновляет свои параметры можно следующим образом.

  • Для асинхронного обучения клиентский агент применяет полученные градиенты, не ожидая всех рабочих, чтобы отправить градиенты и передает обновленные параметры обратно рабочему, который предоставил градиенты. Затем рабочий продолжает генерировать события его средой с помощью обновленных параметров.

  • Для синхронного обучения клиентский агент ожидает, чтобы получить градиенты от всех рабочих и обновляет свои параметры с помощью этих градиентов. Клиент затем отправляет обновленные параметры всем рабочим одновременно. Затем все рабочие продолжают генерировать события с помощью обновленных параметров.

Для получения дополнительной информации о синхронном по сравнению с асинхронным распараллеливанием, смотрите, Обучают Агентов Используя Параллельные вычисления и графические процессоры.

Создайте тележку с шестом интерфейс среды MATLAB

Создайте предопределенный интерфейс среды для системы тележки с шестом. Для получения дополнительной информации об этой среде смотрите Загрузку Предопределенные Среды Системы управления.

env = rlPredefinedEnv("CartPole-Discrete");
env.PenaltyForFalling = -10;

Получите информацию о наблюдении и действии из интерфейса среды.

obsInfo = getObservationInfo(env);
numObservations = obsInfo.Dimension(1);
actInfo = getActionInfo(env);

Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.

rng(0)

Создайте агента AC

Агент 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)

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

Чтобы обучить агента с помощью параллельных вычислений, задайте следующие опции обучения.

  • Установите 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

Симулируйте агента AC

Можно визуализировать систему тележки с шестом с функцией построения графика в процессе моделирования.

plot(env)

Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

totalReward = sum(experience.Reward)
totalReward = 500

Ссылки

[1] Mnih, Владимир, Adrià Puigdomènech Бадия, Мехди Мирза, Алекс Грэйвс, Тимоти П. Лилликрэп, Тим Харли, Дэвид Сильвер и Корей Кэваккуоглу. ‘Асинхронные методы для Глубокого Обучения с подкреплением’. ArXiv:1602.01783 [Cs], 16 июня 2016. https://arxiv.org/abs/1602.01783.

Смотрите также

|

Связанные примеры

Больше о