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

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

Дополнительные сведения об агентах DQN см. в разделе Агенты глубоких Q-сетей. Для примера, который обучает агента DQN в MATLAB ®, смотрите Обучите агента DQN для балансировки системы тележки с шестом.

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

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

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

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

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

Окружение обучения с подкреплением для этого примера является простой моделью велосипеда для динамики автомобиля , оборудованного датчиком. Цель обучения состоит в том, чтобы сохранить автомобили , оборудованные датчиком, перемещающиеся по осевой линии полос движения, путем регулировки угла поворота переднего руля. Этот пример использует ту же модель транспортного средства, что и Train DQN Agent for Lane Keeping Assist.

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 (m-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.

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

Создайте интерфейс окружения обучения с подкреплением для автомобиля , оборудованного датчиком.

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

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

См. также

Похожие темы