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

В этом примере показано, как обучить агента глубокой Q-образовательной-сети (DQN) хранению маршрута помогает (LKA) в Simulink®. Для получения дополнительной информации об агентах DQN смотрите Глубоких Агентов Q-сети.

Модель Simulink для автомобиля эго

Среда обучения с подкреплением для этого примера является простой моделью велосипеда для динамики автомобиля, оборудованного датчиком. Цель обучения должна сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрутов путем корректировки переднего руководящего угла. Этот пример использует ту же модель транспортного средства, как в Маршруте Хранение Помогает Системе Используя Прогнозирующее Управление Модели (Model Predictive Control Toolbox). Автомобильные движущие силы эго заданы следующими параметрами.

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

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

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

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

rng(0)

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

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

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

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

nI = observationInfo.Dimension(1);  % number of inputs (6)
nL = 24;                            % 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))

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика с помощью rlRepresentationOptions.

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

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

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

Чтобы создать агента DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions.

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

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

agent = rlDQNAgent(critic,agentOptions);

Обучите агента

Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:

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

  • Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots опция к training-progress) и отключите отображение командной строки (установите Verbose опция к false).

  • Остановите обучение, когда вознаграждение эпизода достигнет –1.

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

Для получения дополнительной информации смотрите rlTrainingOptions.

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

Обучите агента с помощью train функция. Обучение является в вычислительном отношении интенсивным процессом, который занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining к false. Чтобы обучить агента самостоятельно, установите doTraining к true.

doTraining = false;

if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOpts);
else
    % Load the pretrained agent for the example.
    load('SimulinkLKADQNMulti.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 рад). Хранение маршрута помогает, делает автомобильное перемещение эго вдоль средней линии приблизительно после 2,5 секунд. Держащийся угол (нижний график) показывает, что контроллер достигает устойчивого состояния приблизительно после 2 секунд.

Закройте модель Simulink.

if ~doTraining
    %bdclose(mdl)
end

Функция сброса

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

Смотрите также

Похожие темы