Обучите агента переменного тока балансировать систему тележки с шестом с помощью параллельных вычислений

Этот пример показывает, как обучить агента актёра-критика (AC) балансировать систему тележки с шестом, смоделированную в MATLAB ®, используя асинхронное параллельное обучение. Для примера, который показывает, как обучить агента, не используя параллельное обучение, смотрите Обучите агента AC для балансировки системы тележки с шестом.

Параллельное обучение актёра

Когда вы используете параллельные вычисления с агентами 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, поскольку окружение обеспечивает 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)

Figure Cart Pole Visualizer contains an axes. The axes 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

Симулируйте агент переменного тока

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

plot(env)

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

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

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

totalReward = sum(experience.Reward)
totalReward = 500

Ссылки

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

См. также

|

Похожие темы