exponenta event banner

Подготовка агента DQN для помощи по поддержанию полосы движения с использованием параллельных вычислений

В этом примере показано, как обучить агента сети глубокого Q-обучения (DQN) для помощи в поддержании полосы движения (LKA) в Simulink ® с помощью параллельного обучения. Пример обучения агента без использования параллельного обучения см. в разделе Подготовка агента DQN для помощи по поддержанию полосы движения (инструментарий обучения усилению).

Дополнительные сведения об агентах DQN см. в разделе Агенты Deep Q-Network (инструментарий обучения усилению). Пример обучения агента DQN в MATLAB ® см. в разделе Подготовка агента DQN к балансировке системы Cart-Pole (инструментарий обучения усилению).

DQN Обзор параллельного обучения

В агенте DQN каждый работник создает новые впечатления из своей копии агента и среды. После каждого N steps, работник отправляет опыт агенту хоста. Агент хоста обновляет свои параметры следующим образом.

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

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

Модель Simulink для Ego Car

Среда обучения усилению для этого примера представляет собой простую модель велосипеда для динамики эго-транспортных средств. Цель обучения заключается в удержании эго-транспортного средства, движущегося вдоль осевой линии полос движения, путем регулировки угла поворота переднего руля. В этом примере используется та же модель транспортного средства, что и у Train DQN Agent для помощи по поддержанию полосы движения (инструментарий обучения по усилению).

m = 1575;   % total vehicle mass (kg)
Iz = 2875;  % yaw moment of inertia (mNs^2)
lf = 1.2;   % longitudinal distance from center of gravity to front tires (m)
lr = 1.6;   % longitudinal distance from center of gravity to rear tires (m)
Cf = 19000; % cornering stiffness of front tires (N/rad)
Cr = 33000; % cornering stiffness of rear tires (N/rad)
Vx = 15;    % longitudinal velocity (m/s)

Определение времени выборки Ts и продолжительность моделирования T в секундах.

Ts = 0.1;
T = 15;

Выходной сигнал системы LKA - угол переднего рулевого управления эго-автомобиля. Чтобы смоделировать физические пределы рулевого управления эго-автомобиля, ограничьте угол рулевого управления диапазоном [–0.5,0.5] рад.

u_min = -0.5;
u_max = 0.5;

Кривизна дороги определяется постоянной величиной 0,001 (м-1). Начальное значение бокового отклонения - 0.2 m и начальное значение для относительного угла рыскания равно –0.1 рад.

rho = 0.001;
e1_initial = 0.2;
e2_initial = -0.1;

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

mdl = 'rlLKAMdl';
open_system(mdl)
agentblk = [mdl '/RL Agent'];

Для этой модели:

  • Сигнал действия угла поворота от агента к окружающей среде составляет от -15 градусов до 15 градусов.

  • Наблюдения из окружающей среды представляют собой боковое отклонение e1, относительный угол рыскания e2, их производные e˙1 и e˙2, а также их интегралы ∫e1 и ∫e2.

  • Моделирование завершается, когда боковое отклонение | e1 | > 1.

  • Вознаграждение rt, предоставляемое на каждом шаге t, равно

rt = - (10e12+5e22+2u2+5e˙12+5e˙22)

где u - управляющий вход с предыдущего временного шага t-1.

Создание интерфейса среды

Создайте интерфейс среды обучения для ego-транспортного средства.

Определите информацию наблюдения.

observationInfo = rlNumericSpec([6 1],'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1));
observationInfo.Name = 'observations';
observationInfo.Description = 'information on lateral deviation and relative yaw angle';

Определите информацию о действии.

actionInfo = rlFiniteSetSpec((-15:15)*pi/180);
actionInfo.Name = 'steering';

Создайте интерфейс среды.

env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

Интерфейс имеет пространство дискретных действий, где агент может применить один из 31 возможных углов поворота от -15 градусов до 15 градусов. Наблюдение представляет собой шестимерный вектор, содержащий боковое отклонение, относительный угол рыскания, а также их производные и интегралы относительно времени.

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

env.ResetFcn = @(in)localResetFcn(in);

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

rng(0)

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

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

Для создания критика сначала создать глубокую нейронную сеть с одним входом (шестимерное наблюдаемое состояние) и одним выходным вектором с 31 элементом (равномерно разнесенные углы поворота от -15 до 15 градусов). Дополнительные сведения о создании представления функции значений глубоких нейронных сетей см. в разделе Создание представлений функций политик и значений (панель обучения усилению).

nI = observationInfo.Dimension(1);  % number of inputs (6)
nL = 120;                           % number of neurons
nO = numel(actionInfo.Elements);    % number of outputs (31)

dnn = [
    featureInputLayer(nI,'Normalization','none','Name','state')
    fullyConnectedLayer(nL,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(nL,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(nO,'Name','fc3')];

Просмотр конфигурации сети.

figure
plot(layerGraph(dnn))

Укажите параметры критического представления с помощью rlRepresentationOptions(Панель инструментов для обучения усилению).

criticOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);

Создайте критическое представление, используя заданную глубокую нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation(Панель инструментов для обучения усилению).

critic = rlQValueRepresentation(dnn,observationInfo,actionInfo,'Observation',{'state'},criticOptions);

Для создания агента DQN сначала укажите параметры агента DQN с помощью rlDQNAgentOptions(Панель инструментов для обучения усилению).

agentOpts = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'UseDoubleDQN',true,...
    'TargetSmoothFactor',1e-3,...
    'DiscountFactor',0.99,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',256);

agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1e-4;

Затем создайте агент DQN, используя указанное представление критика и параметры агента. Дополнительные сведения см. в разделе rlDQNAgent(Панель инструментов для обучения усилению).

agent = rlDQNAgent(critic,agentOpts);

Варианты обучения

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

  • Запускать каждое обучение максимум для 10000 эпизоды, причем каждый эпизод длится не более ceil(T/Ts) временные шаги.

  • Отображение хода обучения только в диалоговом окне «Менеджер эпизодов» (установите Plots и Verbose соответственно варианты).

  • Прекратить обучение, когда доходит награда за эпизод -1.

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 100.

Дополнительные сведения см. в разделе rlTrainingOptions(Панель инструментов для обучения усилению).

maxepisodes = 10000;
maxsteps = ceil(T/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes, ...
    'MaxStepsPerEpisode',maxsteps, ...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue', -1,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',100);

Варианты параллельного обучения

Для параллельного обучения агента укажите следующие варианты обучения.

  • Установите UseParallel опция для true.

  • Параллельное асинхронное обучение агента путем установки ParallelizationOptions.Mode опция для "async".

  • После каждых 30 шагов каждый работник отправляет данные на узел.

  • Агент DQN требует от работников отправки "experiences" на хост.

trainOpts.UseParallel = true;
trainOpts.ParallelizationOptions.Mode = "async";
trainOpts.ParallelizationOptions.DataToSendFromWorkers = "experiences";
trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;

Дополнительные сведения см. в разделе rlTrainingOptions(Панель инструментов для обучения усилению).

Агент поезда

Обучение агента с помощью 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('SimulinkLKADQNParallel.mat','agent')
end

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

Для проверки работоспособности обученного агента раскомментируйте следующие две строки и смоделируйте агента в среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions(инструментарий для обучения по усилению) и sim(Панель инструментов для обучения усилению).

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

Для демонстрации обучаемого агента с использованием детерминированных исходных условий смоделируйте модель в Simulink.

e1_initial = -0.4;
e2_initial = 0.2;
sim(mdl)

Как показано ниже, боковая погрешность (средний график) и относительный угол рыскания (нижний график) приводятся к нулю. Транспортное средство начинает движение от осевой линии (-0,4 м) до ненулевой погрешности угла рыскания (0,2 рад). LKA позволяет эго-автомобилю перемещаться по осевой линии через 2,5 секунды. Угол поворота (верхний график) показывает, что контроллер достигает устойчивого состояния через 2 секунды.

Локальная функция

function in = localResetFcn(in)
% reset
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % random value for lateral deviation
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); % random value for relative yaw angle
end

См. также

(инструментарий для обучения по усилению)

Связанные темы