В этом примере показано, как обучить двуногого робота, смоделированного в Simscape™ Multibody™, чтобы обойти использование агента глубоко детерминированного градиента политики (DDPG). Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики.
Среда обучения с подкреплением для этого примера является двуногим роботом. Учебная цель состоит в том, чтобы сделать обход робота в прямой линии с помощью минимального усилия по управлению.
Загрузите параметры модели к основной рабочей области MATLAB®.
robotParametersRL
Откройте модель.
mdl = 'rlWalkingBipedRobot';
open_system(mdl)
Робот моделируется с помощью Simscape Multibody и Библиотеки Сил контакта Simscape Multibody.
Для этой модели:
Нейтральный 0
положение радиана с обоими участками прямо и плоскими лодыжками.
Контакт ноги моделируется, пользуясь Библиотекой Сил контакта Simscape Multibody.
Агент может управлять 3 отдельными соединениями, лодыжкой, коленом и бедром, на обоих участках робота путем применения сигналов крутящего момента от -3
к 3
Nm. Фактические вычисленные сигналы действия нормированы между -1
и 1
.
Среда предоставляет 29 наблюдений агенту. Наблюдения:
Y (ответвление) и Z (вертикальные) переводы центра туловища массы. Перевод в направлении Z нормирован к подобной области значений как другие наблюдения.
X (прямой), Y (ответвление) и Z (вертикальные) скорости перевода.
Отклоняйтесь от курса, сделайте подачу, и углы вращения туловища.
Отклоняйтесь от курса, сделайте подачу, и скорости вращения списка туловища.
Угловые положения и скорости 3 соединений (лодыжка, колено, бедро) на обоих участках.
Значения действия от предыдущего временного шага.
Эпизод завершает работу если:
Центр туловища робота массы меньше 0,1 м в (упавшем) направлении Z или больше чем 1 м в направлении Y (боковое движение).
Абсолютное значение или списка, подачи или отклонения от курса больше 0,7854 радианов.
Премиальная функция если на каждом временном шаге, вдохновлен [1]. Эта премиальная функция поощряет агента продвигаться путем обеспечения положительного вознаграждения за положительную прямую скорость. Это также поощряет агента избегать завершения эпизода путем обеспечения постоянного вознаграждения () на каждом временном шаге. Другие условия в премиальной функции являются штрафами за существенные изменения в боковых и вертикальных переводах, и для использования избыточного усилия по управлению.
где:
скорость перевода в направлении X (вперед к цели) робота.
боковое смещение перевода робота от целевой траектории прямой линии.
нормированное вертикальное перемещение перевода центра робота массы.
крутящий момент от соединения от предыдущего временного шага.
шаг расчета среды.
итоговое время симуляции среды.
Создайте спецификацию наблюдения.
numObs = 29;
obsInfo = rlNumericSpec([numObs 1]);
obsInfo.Name = 'observations';
Создайте спецификацию действия.
numAct = 6; actInfo = rlNumericSpec([numAct 1],'LowerLimit',-1,'UpperLimit',1); actInfo.Name = 'foot_torque';
Создайте интерфейс среды для модели робота обхода.
blk = [mdl,'/RL Agent'];
env = rlSimulinkEnv(mdl,blk,obsInfo,actInfo);
env.ResetFcn = @(in) walkerResetFcn(in,upper_leg_length/100,lower_leg_length/100,h/100);
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Агент и сети критика для этого примера вдохновлены [2].
Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения. Для примера, который создает нейронные сети для агентов DDPG, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Создайте агента и сети критика с помощью createNetworks
функция помощника.
[criticNetwork,actorNetwork] = createNetworks(numObs,numAct);
Просмотрите конфигурацию сети критика.
figure plot(criticNetwork)
Задайте опции для критика и представлений агента с помощью rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-3,... 'GradientThreshold',1,'L2RegularizationFactor',2e-4); actorOptions = rlRepresentationOptions('Optimizer','adam','LearnRate',1e-4,... 'GradientThreshold',1,'L2RegularizationFactor',1e-5);
Создайте критика и представления агента с помощью заданных глубоких нейронных сетей и опций. Необходимо также указать информацию действия и наблюдения для каждого представления, которое вы уже получили из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOptions); actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'ActorTanh1'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions; agentOptions.SampleTime = Ts; agentOptions.DiscountFactor = 0.99; agentOptions.MiniBatchSize = 250; agentOptions.ExperienceBufferLength = 1e6; agentOptions.TargetSmoothFactor = 1e-3; agentOptions.NoiseOptions.MeanAttractionConstant = 1; agentOptions.NoiseOptions.Variance = 0.1;
Затем создайте агента DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый сеанс обучения для самое большее 10 000 эпизодов с каждым эпизодом, длящимся в большей части maxSteps
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 100 более чем 250 последовательных эпизодов.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 150.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxEpisodes = 10000; maxSteps = floor(Tf/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxEpisodes,... 'MaxStepsPerEpisode',maxSteps,... 'ScoreAveragingWindowLength',250,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',100,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',150);
Задайте следующие опции обучения, чтобы обучить агента в параллельном учебном режиме. Если вам не установили программное обеспечение Parallel Computing Toolbox™, установите UseParallel
к false
.
Установите UseParallel
опция к true
.
Обучите агента параллельно асинхронно.
После каждых 32 шагов каждый рабочий отправляет события в хост.
Агенты DDPG требуют, чтобы рабочие отправили 'Experiences'
к хосту.
trainOpts.UseParallel = true; trainOpts.ParallelizationOptions.Mode = 'async'; trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32; trainOpts.ParallelizationOptions.DataToSendFromWorkers = 'Experiences';
Обучите агента с помощью 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('rlWalkingBipedRobotDDPG.mat','agent') end
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Чтобы подтвердить производительность обученного агента, симулируйте его в среде двуногого робота. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',maxSteps);
experience = sim(env,agent,simOptions);
[1] Н. Хисс и др., "Появление Поведений Передвижения в Богатых Средах", Технический отчет, ArXiv, 2017.
[2] Т.П. Лилликрэп и др., "Непрерывное Управление с Глубоким Обучением с подкреплением", Международная конференция по вопросам Изучения Представлений, 2016.