train

Обучите агентов обучения с подкреплением в заданном окружении

Описание

trainStats = train(env,agents) обучает одного или нескольких агентов обучения с подкреплением в заданном окружении, используя опции обучения по умолчанию. Хотя agents является входной параметр, после каждого эпизода тренировки, train обновляет параметры каждого агента, указанного в agents максимизировать их ожидаемое долгосрочное вознаграждение от окружения. Когда обучение прекращается, agents отражает состояние каждого агента в конце заключительного эпизода тренировки.

trainStats = train(agents,env) выполняет то же обучение, что и предыдущий синтаксис.

пример

env = train(___,trainOpts) обучает agents в пределах env, с использованием объекта опций обучения trainOpts. Используйте опции обучения, чтобы задать параметры обучения, такие как критерии завершения обучения, время сохранения агентов, максимальное количество эпизодов для обучения и максимальное количество шагов в каждом эпизоде. Используйте этот синтаксис после любого из входных параметров в предыдущих синтаксисах.

Примеры

свернуть все

Обучите агента, настроенного в примере Train PG Agent, балансировке системы тележки с шестом в соответствующем окружении. Наблюдение от окружения является вектором, содержащим положение и скорость тележки, а также угловое положение и скорость полюса. Действие представляет собой скаляр с двумя возможными элементами (сила в -10 или 10 Ньютонов, приложенная к тележке).

Загрузите файл, содержащий окружение и уже настроенный для нее агент PG.

load RLTrainExample.mat

Задайте некоторые параметры обучения используя rlTrainingOptions. Эти параметры включают максимальное количество эпизодов для обучения, максимальные шаги на эпизод и условия прекращения обучения. В данном примере используйте максимум 1000 эпизодов и 500 шагов на эпизод. Проинструктируйте обучение, чтобы остановить, когда среднее вознаграждение за предыдущие пять эпизодов достигает 500. Создайте набор опций по умолчанию и используйте запись через точку для изменения некоторых значений параметров.

trainOpts = rlTrainingOptions;

trainOpts.MaxEpisodes = 1000;
trainOpts.MaxStepsPerEpisode = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 500;
trainOpts.ScoreAveragingWindowLength = 5;

Во время обучения train команда может сохранить агентов кандидата, которые дают хорошие результаты. Дополнительно сконфигурируйте опции обучения, чтобы сохранить агента, когда вознаграждение эпизода превышает 500. Сохраните агент в папку с именем savedAgents.

trainOpts.SaveAgentCriteria = "EpisodeReward";
trainOpts.SaveAgentValue = 500;
trainOpts.SaveAgentDirectory = "savedAgents";

Наконец, отключите отображение командной строки. Включите Диспетчер эпизодов обучения с подкреплением, чтобы можно было наблюдать процесс обучения визуально.

trainOpts.Verbose = false;
trainOpts.Plots = "training-progress";

Теперь вы готовы обучить агента PG. Для предопределённого окружения тележки с шестом, используемой в этом примере, можно использовать plot чтобы сгенерировать визуализацию системы тележки с шестом.

plot(env)

Когда вы запускаете этот пример, и эта визуализация, и менеджер эпизода обучения с подкреплением обновляются с каждым эпизодом тренировки. Поместите их один за другим на экране, чтобы наблюдать прогресс и обучить агента. (Этот расчет может занять 20 минут или более.)

trainingInfo = train(agent,env,trainOpts);

Диспетчер эпизодов показывает, что обучение успешно достигает условия прекращения вознаграждения в 500, усредненных за предыдущие пять эпизодов. На каждом эпизоде тренировки train обновлений agent с параметрами, полученными в предыдущем эпизоде. Когда обучение прекращается, можно моделировать окружение с помощью обученного агента, чтобы оценить его эффективность. Окружение графика обновления во время симуляции, как это было во время обучения.

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

Во время обучения, train сохраняет на диск любые агенты, которые удовлетворяют условию, заданному в trainOps.SaveAgentCritera и trainOpts.SaveAgentValue. Чтобы проверить эффективность любого из этих агентов, можно загрузить данные из файлов данных в указанную вами папку trainOpts.SaveAgentDirectory, и моделируйте окружение с этим агентом.

В этом примере показано, как настроить обучение с мультиагентом в среде Simulink ®. В примере вы обучаете двух агентов совместному выполнению задачи перемещения объекта.

В этом примере окружения является двумерной поверхностью без трения, содержащей элементы, представленные кругами. Целевой объект C представлен синим кругом с радиусом 2 м, а роботы A (красный) и B (зеленый) представлены меньшими кругами с радиусами 1 м каждый. Роботы пытаются вывести объект C за пределы кругового звонка радиусом 8 м, прикладывая силы через столкновение. Все элементы окружения имеют массу и подчиняются законам движения Ньютона. В сложение сил контакта между элементами и окружением контуров моделируются как системы пружины и демпфера массы. Элементы могут перемещаться по поверхности через приложение внешних сил в направлениях X и Y. В третьей размерности нет движения, и общая энергия системы сохранена.

Создайте набор параметров, необходимых для этого примера.

rlCollaborativeTaskParams

Откройте модель Simulink.

mdl = "rlCollaborativeTask";
open_system(mdl)

Для этого окружения:

  • 2-мерное пространство ограничено от -12 м до 12 м в обоих направлениях X и Y.

  • Значения жесткости контактной пружины и демпфирования составляют 100 Н/м и 0,1 Н/м/с, соответственно.

  • Агенты разделяют одинаковые наблюдения позиций, скоростей A, B и C и значений действия с последнего временного шага.

  • Симуляция заканчивается, когда объект C выходит за пределы кругового звонка.

  • На каждом временном шаге агенты получают следующее вознаграждение:

rA=rglobal+rlocal,ArB=rglobal+rlocal,Brglobal=0.001dcrlocal,A=-0.005dAC-0.008uA2rlocal,B=-0.005dBC-0.008uB2

Здесь:

  • rAи rB - вознаграждения, полученные агентами A и B, соответственно.

  • rglobal является вознаграждением команды, которое получено обоими агентами, когда объект C движется ближе к контуру звонка.

  • rlocal,A и rlocal,B - локальные штрафы, полученные агентами A и B на основе их расстояний от объекта C и величины действия от последнего временного шага.

  • dC - расстояние объекта C от центра звонка.

  • dAC и dBC - расстояния между агентом A и объектом C и агентом B и объектом C, соответственно.

  • uA и uB являются значениями действий агентов A и B с последнего временного шага.

Этот пример использует агенты проксимальной оптимизации политики (PPO) с дискретными пространствами действий. Дополнительные сведения об агентах PPO см. в разделе Агенты оптимизации проксимальной политики. Агенты прикладывают к роботам внешние силы, которые приводят к движению. На каждом временном шаге агенты выбирают действия uA,B=[FX,FY], где FX,FY является одной из следующих пар внешних сил.

FX=-1.0N,  FY=-1.0N

FX=-1.0N,  FY=0

FX=-1.0N,  FY=1.0N

FX=0,               FY=-1.0N

FX=0,               FY=0

FX=0,               FY=1.0N

FX=1.0N,     FY=-1.0N

FX=1.0N,     FY=0

FX=1.0N,     FY=1.0N

Создайте окружение

Чтобы создать мультиагента окружения, задайте блок пути агентов с помощью строковых массивов. Кроме того, задайте объекты наблюдения и спецификации действия, используя массивы ячеек. Порядок объектов спецификации в массиве ячеек должен совпадать с порядком, заданным в массиве путей блоков. Когда агенты доступны в рабочем пространстве MATLAB во время создания окружения, массивы наблюдений и спецификации действия являются необязательными. Для получения дополнительной информации о создании мультиагента окружений см. rlSimulinkEnv.

Создайте спецификации ввода-вывода для окружения. В этом примере агенты являются однородными и имеют одинаковые спецификации ввода-вывода.

% Number of observations
numObs = 16;

% Number of actions
numAct = 2;

% Maximum value of externally applied force (N)
maxF = 1.0;

% I/O specifications for each agent
oinfo = rlNumericSpec([numObs,1]);
ainfo = rlFiniteSetSpec({
    [-maxF -maxF]
    [-maxF  0   ]
    [-maxF  maxF]
    [ 0    -maxF]
    [ 0     0   ]
    [ 0     maxF]
    [ maxF -maxF]
    [ maxF  0   ]
    [ maxF  maxF]});
oinfo.Name = 'observations';
ainfo.Name = 'forces';

Создайте интерфейс окружения Simulink.

blks = ["rlCollaborativeTask/Agent A", "rlCollaborativeTask/Agent B"];
obsInfos = {oinfo,oinfo};
actInfos = {ainfo,ainfo};
env = rlSimulinkEnv(mdl,blks,obsInfos,actInfos);

Задайте функцию сброса для окружения. Функция сброса resetRobots обеспечивает запуск роботов со случайных начальных положений в начале каждого эпизода.

env.ResetFcn = @(in) resetRobots(in,RA,RB,RC,boundaryR);

Создание агентов

Агенты PPO полагаются на представления актёра и критика, чтобы узнать оптимальную политику. В этом примере агенты поддерживают функциональные аппроксимации на основе нейронной сети для актёра и критика.

Создайте нейронную сеть критика и представление. Выходом сети критика является функция ценности состояния V(s) для состояния s.

% Reset the random seed to improve reproducibility
rng(0)

% Critic networks
criticNetwork = [...
    featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','CriticFC1','WeightsInitializer','he')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(64,'Name','CriticFC2','WeightsInitializer','he')
    reluLayer('Name','CriticRelu2')
    fullyConnectedLayer(32,'Name','CriticFC3','WeightsInitializer','he')
    reluLayer('Name','CriticRelu3')
    fullyConnectedLayer(1,'Name','CriticOutput')];

% Critic representations
criticOpts = rlRepresentationOptions('LearnRate',1e-4);
criticA = rlValueRepresentation(criticNetwork,oinfo,'Observation',{'observation'},criticOpts);
criticB = rlValueRepresentation(criticNetwork,oinfo,'Observation',{'observation'},criticOpts);

Выходы сети актёра являются вероятностями π(a|s)принятия каждой возможной пары действий в определенном состоянии s. Создайте нейронную сеть актёра и представление.

% Actor networks
actorNetwork = [...
    featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','ActorFC1','WeightsInitializer','he')
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(64,'Name','ActorFC2','WeightsInitializer','he')
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(32,'Name','ActorFC3','WeightsInitializer','he')
    reluLayer('Name','ActorRelu3')
    fullyConnectedLayer(numel(ainfo.Elements),'Name','Action')
    softmaxLayer('Name','SM')];

% Actor representations
actorOpts = rlRepresentationOptions('LearnRate',1e-4);
actorA = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
    'Observation',{'observation'},actorOpts);
actorB = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
    'Observation',{'observation'},actorOpts);

Создайте агентов. Оба агента используют одинаковые опции.

agentOptions = rlPPOAgentOptions(...
    'ExperienceHorizon',256,...
    'ClipFactor',0.125,...
    'EntropyLossWeight',0.001,...
    'MiniBatchSize',64,...
    'NumEpoch',3,...
    'AdvantageEstimateMethod','gae',...
    'GAEFactor',0.95,...
    'SampleTime',Ts,...
    'DiscountFactor',0.9995);
agentA = rlPPOAgent(actorA,criticA,agentOptions);
agentB = rlPPOAgent(actorB,criticB,agentOptions);

Во время обучения агенты собирают опыт до тех пор, пока не будет достигнут горизонт опыта 256 шагов или прекращение эпизода, а затем обучаются из мини-пакетов 64 переживаний. Этот пример использует коэффициент клипа целевой функции 0,125 для улучшения устойчивости обучения и коэффициент дисконтирования 0,9995 для поощрения долгосрочных вознаграждений.

Обучите агентов

Задайте следующие опции обучения для обучения агентов.

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

  • Остановите обучение агента, когда его среднее вознаграждение за 100 последовательных эпизодов составляет -10 или более.

maxEpisodes = 1000;
maxSteps = 5e3;
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxEpisodes,...
    'MaxStepsPerEpisode',maxSteps,...
    'ScoreAveragingWindowLength',100,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-10);

Чтобы обучить несколько агентов, задайте массив агентов для train функция. Порядок агентов в массиве должен совпадать с порядком путей к блокам агентов, заданным во время создания окружения. Это гарантирует, что объекты агента связаны с соответствующими интерфейсами ввода-вывода в окружении. Обучение этих агентов может занять несколько часов, в зависимости от доступной вычислительной степени.

Файл MAT rlCollaborativeTaskAgents содержит набор предварительно обученных агентов. Можно загрузить файл и просмотреть эффективность агентов. Чтобы обучить агентов самостоятельно, установите doTraining на true.

doTraining = false;
if doTraining
    stats = train([agentA, agentB],env,trainOpts);
else
    load('rlCollaborativeTaskAgents.mat');
end

Следующий рисунок показывает моментальный снимок процесса обучения. Вы можете ожидать различных результатов из-за случайности в процессе обучения.

Моделирование агентов

Моделируйте обученных агентов в окружении.

simOptions = rlSimulationOptions('MaxSteps',maxSteps);
exp = sim(env,[agentA agentB],simOptions);

Figure Multi Agent Collaborative Task contains an axes. The axes contains 5 objects of type rectangle, text.

Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

Входные параметры

свернуть все

Агенты для обучения, заданные как объект агента обучения с подкреплением, такой как rlACAgent или rlDDPGAgent, или как массив таких объектов.

Если env является мультиагент окружения, созданной с помощью rlSimulinkEnv, задайте агентов как массив. Порядок агентов в массиве должен совпадать с порядком агентов, используемых для создания env. Мультиагент не поддерживается для MATLAB® окружения.

Примечание

train обновлений agents на каждом эпизоде тренировки. Когда обучение прекращается, agents отражает состояние каждого агента в конце заключительного эпизода тренировки. Поэтому вознаграждения, полученные конечными агентами, не обязательно являются самыми высокими, достигнутыми в процессе обучения из-за непрерывного исследования. Чтобы сохранить агентов во время обучения, создайте rlTrainingOptions объект, задающий свойства SaveAgentCriteria и SaveAgentValue, и передающий его в train как trainOpts аргумент.

Дополнительные сведения о том, как создать и сконфигурировать агентов для обучения с подкреплением, см. в разделе Агенты обучения с подкреплением.

Окружение, в которой агенты действуют, заданная как один из следующих видов объекта окружения обучения с подкреплением:

  • Предопределенные MATLAB или Simulink® окружение, созданная с помощью rlPredefinedEnv. Такой вид окружения не поддерживает одновременное обучение нескольких агентов.

  • Пользовательское окружение MATLAB, которую вы создаете с такими функциями, как rlFunctionEnv или rlCreateEnvTemplate. Такой вид окружения не поддерживает одновременное обучение нескольких агентов.

  • Пользовательское окружение Simulink, которую вы создаете используя rlSimulinkEnv. Этот вид окружения поддерживает обучение нескольких агентов одновременно.

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

Когда env - окружение Simulink, вызывающая train компилирует и имитирует модель, связанную со окружением.

Параметры и опции обучения, заданные как rlTrainingOptions объект. Используйте этот аргумент, чтобы задать такие параметры и опции, как:

  • Критерии окончания обучения

  • Критерии для сохранения агентов

  • Как отобразить процесс обучения

  • Опции для параллельных вычислений

Для получения дополнительной информации см. rlTrainingOptions.

Выходные аргументы

свернуть все

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

Номера эпизодов, возвращенные как вектор-столбец [1;2;…;N], где N количество эпизодов в запуске. Этот вектор полезен, если вы хотите построить график эволюции других величин от эпизода к эпизоду.

Вознаграждение за каждый эпизод, возвращаемое в вектор-столбец длины N. Каждая запись содержит вознаграждение за соответствующий эпизод.

Количество шагов в каждом эпизоде, возвращаемое в вектор-столбец длины N. Каждая запись содержит количество шагов в соответствующем эпизоде.

Среднее вознаграждение за окно усреднения, заданное в trainOpts, возвращенный как вектор-столбец длины N. Каждая запись содержит среднее вознаграждение, вычисленное в конце соответствующего эпизода.

Общее количество шагов агента в обучении, возвращенных как вектор-столбец длины N. Каждая запись содержит совокупную сумму записей в EpisodeSteps до этого момента.

Оценка критиком долгосрочного вознаграждения с использованием текущего агента и окружения начальных условий, возвращенная как вектор-столбец длины N. Каждая запись является оценкой критика (Q 0) для агента соответствующего эпизода. Это поле присутствует только для агентов, у которых есть критики, такие какrlDDPGAgent и rlDQNAgent.

Информация, собранная во время симуляций, выполненного для обучения, возвращается как:

  • Для обучения в окружениях MATLAB, структура, содержащая SimulationError поля. Это поле является вектором-столбцом с одной записью на эпизод. Когда StopOnError опция rlTrainingOptions является "off"каждая запись содержит любые ошибки, возникшие во время соответствующего эпизода.

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

Совет

  • train обновляет агентов по мере процессов обучения. Чтобы сохранить параметры исходного агента для дальнейшего использования, сохраните агенты в MAT-файле.

  • По умолчанию вызов train открывает Диспетчер эпизодов обучения с подкреплением, который позволяет вам визуализировать прогресс обучения. В график Episode Manager показано вознаграждение за каждый эпизод, текущее среднее значение вознаграждения и оценка критиком Q 0 (для агентов, у которых есть критики). Диспетчер эпизодов также отображает различные эпизоды и статистику обучения. Чтобы выключить Диспетчер эпизодов обучения с подкреплением, установите Plots опция trainOpts на "none".

  • Если вы используете предопределённое окружение, для которой существует визуализация, можно использовать plot(env) для визуализации окружения. Если вы звоните plot(env) перед обучением затем визуализация обновляется во время обучения, чтобы позволить вам визуализировать прогресс каждого эпизода. (Для пользовательских окружений необходимо реализовать свои собственные plot метод.)

  • Обучение прекращается, когда условия, указанные в trainOpts удовлетворены. Чтобы завершить обучение в прогресс, в Диспетчере эпизодов обучения с подкреплением нажмите Stop Training. Потому что train обновляет агента в каждом эпизоде, можно возобновить обучение, позвонив train(agent,env,trainOpts) снова, не теряя обученных параметров, выученных во время первого вызова, train.

  • Во время обучения можно сохранить агентов кандидата, которые соответствуют условиям, которые вы задаете с trainOpts. Например, можно сохранить любого агента, чье вознаграждение по эпизоду превышает определенное значение, даже если общее условие прекращения обучения еще не удовлетворено. train хранит сохраненные агенты в MAT-файле в указанной папке trainOpts. Сохраненные агенты могут быть полезны, например, чтобы позволить вам протестировать агентов-кандидатов, сгенерированных во время длительного процесса обучения. Для получения дополнительной информации о сохранении критериев и сохранении местоположения смотрите rlTrainingOptions.

Алгоритмы

В целом, train выполняет следующие итерационные шаги:

  1. Инициализация agent.

  2. Для каждого эпизода:

    1. Сбросьте окружение.

    2. Получите s 0 начального наблюдения от окружения.

    3. Вычислите начальное a действия 0 = μ (s 0).

    4. Установите текущее действие на начальное действие (a a 0) и установите текущее наблюдение на начальное наблюдение (s − s 0).

    5. Пока эпизод не закончен или не завершен:

      1. Постройте окружение с помощью a действий, чтобы получить следующую s наблюдений 'и r вознаграждения.

      2. Учитесь на наборе опыта (s, a, r, s ').

      3. Вычислите следующее a действия '= μ (s').

      4. Обновите текущее действие следующим действием (a a ') и обновите текущее наблюдение следующим наблюдением (s − s').

      5. Пропуск, если удовлетворены условия прекращения эпизода, определенные в окружении.

  3. Если условие прекращения обучения задано как trainOpts достигается, прекращает обучение. В противном случае начнем следующий эпизод.

Специфика того, как train выполняет эти расчеты в зависимости от вашего строения агента и окружения. Например, сброс окружения в начале каждого эпизода может включать рандомизацию начальных значений состояния, если вы конфигурируете своё окружение, чтобы сделать это.

Расширенные возможности

Введенный в R2019a