В этом примере показано, как обучить агента обучения с подкреплением (RL) с действиями, ограниченными с помощью блока Constraint Enforcement. Этот блок вычисляет измененные действия управления, которые ближе всего к действиям, выводимым агентом, удовлетворяющим ограничениям и границам действия. Обучение агентов обучения с подкреплением требует Пакета Reinforcement Learning Toolbox™.
В этом примере цель агента состоит в том, чтобы максимально приблизить зеленый мяч к изменяющемуся целевому положению красного мяча [1].
Динамика зеленого мяча от скорости к позиции регулируются законом Ньютона с небольшим коэффициентом демпфирования .
.
Допустимая область положения мяча и скорость зеленого мяча ограничена областью значений .
Положение целевого красного мяча равномерно случайное в области значений . Агент может наблюдать только шумную оценку этого целевого положения.
Установите случайный seed и сконфигурируйте параметры модели
% set random seed rng('default') % parameters Tv = 0.8; % sample time for visualizer Ts = 0.1; % sample time for controller tau = 0.01; % damping constant for green ball velLimit = 1; % maximum speed for green ball s0 = 200; % random seed s1 = 100; % random seed x0 = 0.2; % initial position for ball
В этом примере ограничительная функция представлена с помощью обученной глубокой нейронной сети. Чтобы обучить сеть, необходимо сначала собрать обучающие данные из окружения.
Для этого сначала создайте окружение RL с помощью rlBallOneDim
модель. Эта модель применяет случайные внешние действия через блок Агент к окружению.
mdl = 'rlBallOneDim';
open_system(mdl)
Подсистема Окружения выполняет следующие шаги.
Применяет скорость входа к модели окружения и генерирует результаты наблюдений выхода
Вычисляет вознаграждение за обучение , где обозначает положение красного мяча
Устанавливает сигнал завершения isDone
на true
если положение мяча нарушает ограничение
Для этой модели наблюдения от окружения включают положение и скорость зеленого мяча и шумное измерение положения красного мяча. Задайте непрерывное пространство наблюдений для этих трех значений.
obsInfo = rlNumericSpec([3 1]);
Действие, которое агент применяет к зеленому мячу, является его скоростью. Создайте непрерывное пространство действий и примените необходимые пределы скорости.
actInfo = rlNumericSpec([1 1],'LowerLimit',-velLimit,'UpperLimit',velLimit);
Создайте окружение RL для этой модели.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
Задайте функцию сброса, которая случайным образом инициализирует окружение в начале каждого эпизода тренировки или симуляции.
env.ResetFcn = @(in)localResetFcn(in);
Затем создайте агента обучения с подкреплением DDPG, который поддерживает непрерывные действия и наблюдения, используя createDDPGAgentBall
вспомогательная функция. Эта функция создает критика и представления актера на основе спецификаций действий и наблюдений и использует представления для создания агента DDPG.
agent = createDDPGAgentBall(Ts,obsInfo,actInfo);
В rlBallOneDim
модель, блок Агент не генерирует действия. Вместо этого он сконфигурирован для передачи случайного внешнего действия в окружение. Цель использования модели сбора данных с неактивным блоком RL Agent состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.
В этом примере сигнал положения мяча должен удовлетворять . Чтобы разрешить некоторое ослабление, ограничение устанавливается таким образом, чтобы Динамическая модель от скорости до положения имеет очень маленькую константу демпфирования, поэтому она может быть аппроксимирована . Поэтому ограничения для зеленого мяча задаются следующим уравнением.
Блок Constraint Enforcement принимает ограничения формы . Для вышеприведенного уравнения коэффициенты этой ограничительной функции следующие.
Функция аппроксимируется глубокой нейронной сетью, которая обучается на данных, собранных путем симуляции агента RL в окружении. Чтобы узнать неизвестную функцию агент RL передает случайное внешнее действие окружению, которая равномерно распределена в области значений .
Чтобы собрать данные, используйте collectDataBall
вспомогательная функция. Эта функция моделирует окружение и агента и собирает получившиеся входные и выходные данные. Получившиеся обучающие данные имеют три столбца: , , и .
В данном примере загружает предварительно собранные обучающие данные. Чтобы собрать данные самостоятельно, установите collectData
на true
.
collectData = false; if collectData count = 1050; data = collectDataBall(env,agent,count); else load trainingDataBall data end
Обучите глубокую нейронную сеть аппроксимировать ограничительную функцию с помощью trainConstraintBall
вспомогательная функция. Эта функция форматирует данные для обучения, затем создает и обучает глубокую нейронную сеть. Для настройки глубокой нейронной сети требуется программное обеспечение Deep Learning Toolbox™.
В данном примере, чтобы гарантировать воспроизводимость, загружает предварительно обученную сеть. Чтобы обучить сеть самостоятельно, установите trainConstraint
на true
.
trainConstraint = false; if trainConstraint network = trainConstraintBall(data); else load trainedNetworkBall network end
Следующий рисунок показывает пример процесса обучения.
Проверьте обученную нейронную сеть с помощью validateNetworkBall
вспомогательная функция. Эта функция обрабатывает входные обучающие данные с помощью обученной глубокой нейронной сети. Затем он сравнивает вывод сети с выходом обучения и вычисляет корневую среднеквадратичную ошибку (RMSE).
validateNetworkBall(data,network)
Test Data RMSE = 9.996700e-02
Маленькое значение RMSE указывает, что сеть успешно узнала функцию ограничения.
Чтобы обучить агента с ограничениями, используйте rlBallOneDimWithConstraint
модель. Эта модель ограничивает действия от агента перед применением их к окружению.
mdl = 'rlBallOneDimWithConstraint';
open_system(mdl)
Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь обученная глубокая нейронная сеть аппроксимирует , и блок Constraint Enforcement применяет ограничительные функции и ограничения скорости.
В данном примере используются следующие параметры параметров блоков ограничения.
Количество ограничений - 2
Количество действий - 1
Ограничение ограничено - [0.9;-0.1]
Создайте окружение RL с помощью этой модели. Наблюдение и спецификации действия соответствуют тем, что использовались для предыдущих данных наборов окружения.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);
Укажите опции для настройки агента. Обучите агента RL для 300 эпизодов с 300 шагами на эпизод.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',300, ... 'MaxStepsPerEpisode', 300, ... 'Verbose', false, ... 'Plots','training-progress');
Обучите агента. Обучение является длительным процессом. В данном примере загружает предварительно обученного агента, используя loadAgentParams
вспомогательная функция. Чтобы обучить агента самостоятельно, установите trainAgent
на true
.
trainAgent = false; if trainAgent trainingStats = train(agent,env,trainOpts); else loadAgentParams(agent,'rlAgentBallParams') end
Следующий рисунок показывает результаты обучения. Процесс обучения сходится к хорошему агенту в течение 20 эпизодов.
Поскольку общее количество шагов равняется продукту числа эпизодов и шагов эпизодов, каждый эпизод тренировки запусков до конца без раннего прекращения. Поэтому блок Constraint Enforcement гарантирует, что положение мяча никогда не нарушает ограничение .
Симулируйте обученного агента, используя simWithTrainedAgentBall
вспомогательная функция.
simWithTrainedAgentBall(env,agent)
Агент успешно отслеживает положение красного мяча.
Чтобы увидеть преимущества обучения агента с ограничениями, можно обучить агента без ограничений и сравнить результаты обучения с случаем ограничения.
Чтобы обучить агента без ограничений, используйте rlBallOneDimWithoutConstraint
модель. Эта модель применяет действия от агента непосредственно к окружению.
mdl = 'rlBallOneDimWithoutConstraint';
open_system(mdl)
Создайте окружение RL с помощью этой модели.
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);
Создайте нового агента DDPG для обучения. Этот агент имеет то же строение, что и агент, используемый в предыдущем обучении.
agent = createDDPGAgentBall(Ts,obsInfo,actInfo);
Обучите агента с помощью тех же опций обучения, что и в случае принудительного применения противоречия. В данном примере, как и в предыдущем обучении, загружает предварительно обученного агента. Чтобы обучить агента самостоятельно, установите trainAgent
к true.
trainAgent = false; if trainAgent trainingStats2 = train(agent,env,trainOpts); else loadAgentParams(agent,'rlAgentBallCompParams') end
Следующий рисунок показывает результаты обучения. Процесс обучения сходится к хорошему агенту после 50 эпизодов. После этого точка имеет плохую эффективность для некоторых эпизодов, например, около эпизодов 140 и 230.
Поскольку общее количество шагов меньше, чем продукт числа эпизодов и шагов эпизодов, обучение включает эпизоды, которые завершились раньше из-за нарушений ограничений.
Симулируйте обученного агента.
simWithTrainedAgentBall(env,agent)
Агент успешно отслеживает положение красного мяча с более статическим смещением, чем агент, обученный с ограничениями.
В этом примере обучение агента RL с блоком Constraint Enforcement гарантирует, что действия, примененные к окружению, никогда не приводят к нарушению ограничений. В результате процесс обучения быстро сходится к хорошему агенту. Настройка того же агента без ограничений приводит к более медленной сходимости и более низкой эффективности.
bdclose('rlBallOneDim') bdclose('rlBallOneDimWithConstraint') bdclose('rlBallOneDimWithoutConstraint') close('Ball One Dim')
function in = localResetFcn(in) % Reset function in = setVariable(in,'x0',rand); in = setVariable(in,'s0',randi(5000)); in = setVariable(in,'s1',randi(5000)); end
[1] Даляль, Гал, Кришнамурти Двиотам, Матей Вецерик, Тодд Хестер, Космин Падурару и Юваль Тасса. «Безопасное исследование в непрерывных пространствах действий». Препринт, представленный 26 января 2018 года. https://arxiv.org/abs/1801.08757