이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
차선 유지 보조를 위해 DQN 에이전트 훈련시키기
이 예제에서는 Simulink®에서 차선 유지 보조(LKA)를 위해 DQN(심층 Q-러닝 신경망) 에이전트를 훈련시키는 방법을 보여줍니다. DQN 에이전트에 대한 자세한 내용은 DQN(심층 Q-신경망) 에이전트 항목을 참조하십시오.
자기 차량의 Simulink 모델
이 예제의 강화 학습 환경은 자기 차량 동특성에 대한 간단한 자전거 모델입니다. 훈련 목표는 앞쪽 조향각을 조정하여 자기 차량이 차선의 중심선을 따라 주행하도록 하는 것입니다. 이 예제에서는 Lane Keeping Assist System Using Model Predictive Control (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]
rad로 제한합니다.
u_min = -0.5; u_max = 0.5;
도로의 곡률은 상수 0.001()로 정의됩니다. 횡방향 편차의 초기값은 0.2m이고, 상대적 요 각도의 초기값은 –0.1rad입니다.
rho = 0.001; e1_initial = 0.2; e2_initial = -0.1;
모델을 엽니다.
mdl = 'rlLKAMdl'; open_system(mdl); agentblk = [mdl '/RL Agent'];
이 모델의 경우 다음이 적용됩니다.
에이전트에서 환경으로 전달되는 조향각 행동 신호는 –15도에서 15도까지입니다.
환경에서 관측하는 값은 횡방향 편차 과 상대적 요 각도 , 이들의 도함수인 과 , 이들의 적분인 과 입니다.
횡방향 편차 이면 시뮬레이션이 종료됩니다.
매 시간 스텝 마다 제공되는 보상 는 다음과 같습니다.
여기서 는 이전 시간 스텝 의 제어 입력입니다.
환경 인터페이스 만들기
자기 차량에 대한 강화 학습 환경 인터페이스를 만듭니다. 이를 위해 먼저 관측값 사양과 행동 사양을 만듭니다.
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도까지 적용할 수 있는 이산 행동 공간이 있습니다. 관측값은 횡방향 편차와 상대적 요 각도, 그리고 시간의 도함수와 적분까지 포함한 6차원 벡터입니다.
횡방향 편차와 상대적 요 각도의 초기 조건을 정의하려면 익명 함수 핸들을 사용하여 환경 재설정 함수를 지정하십시오. 다음 재설정 함수는 횡방향 편차와 상대적 요 각도의 초기값을 무작위로 할당합니다.
env.ResetFcn = @(in)localResetFcn(in);
재현이 가능하도록 난수 생성기 시드값을 고정합니다.
rng(0)
DQN 에이전트 만들기
DQN 에이전트는 관측값과 행동이 주어지면 가치 함수 크리틱 표현을 사용하여 장기 보상을 근사합니다.
DQN 에이전트는 다중 출력 Q-값 크리틱 근사기를 사용할 수 있는데, 일반적으로 이 방식이 더 효율적입니다. 다중 출력 근사기는 입력값으로 관측값을 갖고 출력값으로 상태-행동 값을 갖습니다. 각 출력 요소는 관측값 입력값이 나타내는 상태로부터 상응하는 이산 행동을 취했을 때 기대되는 누적 장기 보상을 표현합니다.
크리틱을 만들려면 먼저 1개의 입력값(6차원 관측 상태)과 31개의 요소(-15도에서 15도까지의 균일 간격 조향각)로 구성된 1개의 출력 벡터를 갖는 심층 신경망을 만드십시오. 심층 신경망 가치 함수 표현을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.
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')]; dnn = dlnetwork(dnn);
신경망 구성을 확인합니다.
figure plot(layerGraph(dnn))
rlOptimizerOptions
를 사용하여 크리틱 최적화 함수에 대한 옵션을 지정합니다.
criticOptions = rlOptimizerOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
지정된 심층 신경망과 옵션을 사용하여 크리틱 표현을 만듭니다. 환경 인터페이스에서 얻는 크리틱에 대한 행동 및 관측값 정보도 지정해야 합니다. 자세한 내용은 rlVectorQValueFunction
항목을 참조하십시오.
critic = rlVectorQValueFunction(dnn,observationInfo,actionInfo);
DQN 에이전트를 만들려면 먼저 rlDQNAgentOptions
객체를 사용하여 DQN 에이전트 옵션을 지정하십시오.
agentOptions = rlDQNAgentOptions(... 'SampleTime',Ts,... 'UseDoubleDQN',true,... 'CriticOptimizerOptions',criticOptions,... 'ExperienceBufferLength',1e6,... 'MiniBatchSize',64);
그런 다음, 지정된 크리틱 표현과 에이전트 옵션을 사용하여 DQN 에이전트를 만듭니다. 자세한 내용은 rlDQNAgent
항목을 참조하십시오.
agent = rlDQNAgent(critic,agentOptions);
에이전트 훈련시키기
에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.
최대 5000개의 에피소드에 대해 훈련을 실행하며, 각 에피소드마다 최대
ceil(T/Ts)
개의 시간 스텝이 지속됩니다.에피소드 관리자 대화 상자에 훈련 진행 상황을 표시하고(
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을 향해 갑니다. 차량은 중심선으로부터 벗어나(–0.4m) 0이 아닌 요 각도 오차(0.2rad)로 시작합니다. 차선 유지 보조를 통해 자기 차량은 약 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