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

Этот пример расширяет пример, Обучают Агента AC Балансировать полюсную Корзиной Систему, чтобы продемонстрировать асинхронное параллельное обучение агента Критика агента (AC) [1], чтобы сбалансировать полюсную корзиной систему, смоделированную в MATLAB®.

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

При использовании параллельных вычислений с агентами AC каждый рабочий генерирует события из его копии агента и среды. После каждого N шаги, рабочий вычисляет градиенты из событий и передает вычисленные градиенты обратно в агента хоста. Агент хоста обновляет свои параметры можно следующим образом:

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

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

Создайте полюсный корзиной интерфейс среды MATLAB

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

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

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

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

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

rng(0)

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

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

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

Полюсная корзиной система может визуализироваться с 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.

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

|

Похожие темы