Настройте агента обучения с подкреплением с ограничениями

В этом примере показано, как обучить агента обучения с подкреплением (RL) с действиями, ограниченными с помощью блока Constraint Enforcement. Этот блок вычисляет измененные действия управления, которые ближе всего к действиям, выводимым агентом, удовлетворяющим ограничениям и границам действия. Обучение агентов обучения с подкреплением требует Пакета Reinforcement Learning Toolbox™.

В этом примере цель агента состоит в том, чтобы максимально приблизить зеленый мяч к изменяющемуся целевому положению красного мяча [1].

Динамика зеленого мяча от скорости v к позиции x регулируются законом Ньютона с небольшим коэффициентом демпфирования τ.

1s(τs+1).

Допустимая область положения мяча 0x1 и скорость зеленого мяча ограничена областью значений [-1,1].

Положение целевого красного мяча равномерно случайное в области значений [0,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)

Подсистема Окружения выполняет следующие шаги.

  • Применяет скорость входа к модели окружения и генерирует результаты наблюдений выхода

  • Вычисляет вознаграждение за обучение r=[1-10(x-xr)2]+, где xr обозначает положение красного мяча

  • Устанавливает сигнал завершения isDone на true если положение мяча нарушает ограничение 0x1

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

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 состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.

Изучение функции ограничения

В этом примере сигнал положения мяча xk+1 должен удовлетворять 0xk+11. Чтобы разрешить некоторое ослабление, ограничение устанавливается таким образом, чтобы 0.1xk+10.9. Динамическая модель от скорости до положения имеет очень маленькую константу демпфирования, поэтому она может быть аппроксимирована xk+1xk+h(xk)uk. Поэтому ограничения для зеленого мяча задаются следующим уравнением.

[xk-xk]+[h(xk)-h(xk)]uk[0.9-0.1]

Блок Constraint Enforcement принимает ограничения формы fx+gxuc. Для вышеприведенного уравнения коэффициенты этой ограничительной функции следующие.

fx=[xk-xk],gx=[h(xk)-h(xk)],c=[0.9-0.1]

Функция h(xk) аппроксимируется глубокой нейронной сетью, которая обучается на данных, собранных путем симуляции агента RL в окружении. Чтобы узнать неизвестную функцию h(xk)агент RL передает случайное внешнее действие окружению, которая равномерно распределена в области значений [-1,1].

Чтобы собрать данные, используйте collectDataBall вспомогательная функция. Эта функция моделирует окружение и агента и собирает получившиеся входные и выходные данные. Получившиеся обучающие данные имеют три столбца: xk, uk, и xk+1.

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

Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь обученная глубокая нейронная сеть аппроксимирует h(xk), и блок 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 гарантирует, что положение мяча x никогда не нарушает ограничение 0x1.

Симулируйте обученного агента, используя 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

См. также

Блоки

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте