exponenta event banner

Подготовка агента DDPG с предварительно обученной сетью акторов

В этом примере показано, как обучить агента глубокого детерминированного градиента политики (DDPG) для помощи в поддержании полосы движения (LKA) в Simulink. Чтобы сделать обучение более эффективным, актер агента DDPG инициализируется глубокой нейронной сетью, которая ранее обучалась с помощью контролируемого обучения. Этот обучаемый актер проходит обучение по примеру Imitate MPC Controller for Lane Keeping Assist.

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

Модель Simulink

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

u_min = -1.04;
u_max = 1.04;

Определите кривизну дороги как постоянную 0,001 (м-1).

rho = 0.001;

Установить исходные значения бокового отклонения (e1_initial) и относительный угол рыскания (e2_initial). Во время тренировки эти начальные условия устанавливаются случайными значениями для каждого учебного эпизода.

e1_initial = 0.2;
e2_initial = -0.1;

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

mdl = 'rlActorLKAMdl';
open_system(mdl)

Определите путь к блоку агента RL в модели.

agentblk = [mdl '/RL Agent'];

Создать среду

Создайте интерфейс среды обучения для ego-транспортного средства. Для этого сначала определите параметры наблюдения и действий. Эти наблюдения и действия аналогичны функциям контролируемого обучения, используемым в Imitate MPC Controller for Lane Keeping Assist.

Шестью наблюдениями для окружающей среды являются боковая скорость vy, скорость рыскания ψ˙, боковое отклонение e1, относительный угол рыскания e2, угол рулевого управления на предыдущем шаге u0 и кривизна

observationInfo = rlNumericSpec([6 1],...
    'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1));
observationInfo.Name = 'observations';

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

actionInfo = rlNumericSpec([1 1],'LowerLimit',u_min,'UpperLimit',u_max);
actionInfo.Name = 'steering';

В модели блок обработки сигналов для LKA создает сигнал вектора наблюдения, вычисляет функцию вознаграждения и вычисляет сигнал остановки.

Вознаграждение rt, предоставляемое на каждом временном шаге t, является следующим, где u - управляющий вход из предыдущего временного шага t-1.

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

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

Создание среды обучения армированию.

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

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

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

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

rng(0)

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

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

critic = createLaneKeepingCritic(observationInfo,actionInfo);

Агент DDPG решает, какое действие предпринять для данных наблюдений, используя представление актера. Для создания актёра сначала создать глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).

[actor,actorOptions] = createLaneKeepingActor(observationInfo,actionInfo);

Эти начальные сети актеров и критиков имеют случайные начальные значения параметров.

Для создания агента DDPG сначала укажите параметры агента DDPG.

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',64 ...
    );
agentOptions.NoiseOptions.StandardDeviation = 0.3;
agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;

Создайте агент DDPG, используя указанное представление актера, представление критика и параметры агента. Дополнительные сведения см. в разделе rlDDPGAgent.

agent = rlDDPGAgent(actor,critic,agentOptions);

Агент поезда

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

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

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

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

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

Дополнительные сведения см. в разделе rlTrainingOptions.

maxepisodes = 50000;
maxsteps = 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 pretrained agent for the example.
    load('ddpgFromScratch.mat');
end

Агент поезда с предварительно обученным актером

Вы можете установить актерскую сеть вашего агента на глубокую нейронную сеть, которая была ранее обучена. В этом примере используйте глубокую нейронную сеть из Imitate MPC Controller для примера Lane Keeping Assist. Эта сеть была обучена имитировать модельный прогностический контроллер с использованием контролируемого обучения.

Загрузите предварительно обученную сеть актера.

load('imitateMPCNetActorObj.mat','imitateMPCNetObj'); 

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

supervisedActor = rlDeterministicActorRepresentation(imitateMPCNetObj,observationInfo,actionInfo, ...
'Observation',imitateMPCNetObj.InputNames,'Action',{'Scale1'},actorOptions);

Проверьте, что сеть используется supervisedActor тот же, что был загружен. Для этого оцените сеть и агента, используя одно и то же случайное входное наблюдение.

testData = rand(6,1);

Оцените глубокую нейронную сеть.

predictImNN = predict(imitateMPCNetObj,testData','ExecutionEnvironment','cpu');

Оцените актера.

evaluateRLRep = getAction(supervisedActor,{testData});

Сравните результаты.

error = evaluateRLRep{:} - predictImNN
error = single
    0

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

agent = rlDDPGAgent(supervisedActor,critic,agentOptions);

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

trainingOpts.MaxEpisodes = 5000;
doTraining = false;

if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOpts);
else
    % Load pretrained agent for the example.
    load('ddpgFromPretrained.mat');
end

Благодаря использованию предварительно обученной сети субъектов обучение агента DDPG становится более эффективным. Как общее время обучения, так и общее количество этапов обучения улучшились примерно на 20%. Кроме того, количество эпизодов для тренировки, чтобы приблизиться к окрестности оптимального результата, уменьшилось с приблизительно 4500 до приблизительно 3500.

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

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

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

Для проверки работоспособности обучаемого агента в модели Simulink смоделировать модель с использованием предварительно определенных исходных условий (e1_initial = 0.2 и e2_initial = -0.1).

sim(mdl)

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

Закройте модель Simulink без сохранения изменений.

bdclose(mdl)

Локальные функции

function in = localResetFcn(in)
% Set random value for lateral deviation.
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand));

% Set random value for relative yaw angle.
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand));
end

function agent = loadPretrainedParams(agent,actorParams,criticParams)
% Set actor parameters.
actor = getActor(agent);
pretrainedActor = setLearnableParameters(actor,actorParams);

% Set critic parameters.
critic = getCritic(agent);
pretrainedCritic = setLearnableParameters(critic,criticParams);

% Set actor and critic representations in the agent.
agent = setActor(agent,pretrainedActor);
agent = setCritic(agent,pretrainedCritic);
end

См. также

|

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