차선 유지 보조를 위해 DQN 에이전트 훈련시키기
이 예제에서는 Simulink®에서 차선 유지 보조(LKA)를 위해 DQN(심층 Q-러닝 신경망) 에이전트를 훈련시키는 방법을 보여줍니다. DQN 에이전트에 대한 자세한 내용은 DQN(심층 Q-신경망) 에이전트 항목을 참조하십시오.
재현이 가능하도록 난수 스트림 고정하기
예제 코드의 다양한 단계에서 난수 계산이 포함될 수 있습니다. 예제 코드에 있는 다양한 섹션의 시작 부분에서 난수 스트림을 고정하면 매 실행 시에 섹션의 난수열이 유지되며 결과를 재현할 가능성이 높아집니다. 자세한 내용은 결과 재현성 항목을 참조하십시오. 시드값 0과 난수 알고리즘인 메르센 트위스터를 사용하여 난수 스트림을 고정합니다. 난수 생성에 사용되는 시드값을 제어하는 방법에 대한 자세한 내용은 rng 항목을 참조하십시오.
previousRngState = rng(0,"twister");출력값 previousRngState는 스트림의 이전 상태에 대한 정보를 포함하는 구조체입니다. 이 예제의 끝부분에서 그 상태를 복원할 것입니다.
에고 차량에 대한 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 CG to front tires (m) lr = 1.6; % longitudinal distance from CG 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와 시뮬레이션 지속 시간 Tf를 초 단위로 정의합니다.
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 = ... "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);
DQN 에이전트 만들기
DQN 에이전트는 파라미터화된 Q-값 함수 근사기를 사용하여 정책의 값을 추정합니다.
DQN 에이전트는 이산 행동 공간을 가지므로 벡터(즉, 다중 출력) Q-값 함수 크리틱을 만들 수 있는데, 일반적으로 이 방식이 그에 상응하는 단일 출력 크리틱보다 더 효율적입니다.
이산 벡터 Q-값 함수는 입력값으로 관측값만 받고 출력값으로 가능한 이산 행동 개수와 동일한 개수의 요소가 포함된 단일 벡터를 반환합니다. 각 출력 요소의 값은 현재 관측값에 해당하는 상태에서 시작하여 요소 번호에 해당하는 행동을 실행하고 그 후에는 정책을 따를 때 기대되는 감가된 누적 장기 보상을 나타냅니다.
크리틱 내에서 파라미터화된 Q-값 함수를 모델링하려면 1개의 입력값(6차원 관측 상태)과 31개의 요소(-15도에서 15도까지의 균일 간격 조향각)로 구성된 1개의 출력 벡터를 갖는 심층 신경망을 사용하십시오.
% Define number of inputs, neurons, and outputs nI = observationInfo.Dimension(1); % number of inputs (6) nL = 24; % number of neurons nO = numel(actionInfo.Elements); % number of outputs (31) % Define network as array of layer objects dnn = [ featureInputLayer(nI) fullyConnectedLayer(nL) reluLayer fullyConnectedLayer(nL) reluLayer fullyConnectedLayer(nO) ]; % Convert to dlnetwork object dnn = dlnetwork(dnn);
파라미터 개수를 표시하고 신경망 구성을 확인합니다.
summary(dnn)
Initialized: true
Number of learnables: 1.5k
Inputs:
1 'input' 6 features
plot(dnn)

dnn과 관측값 및 행동 사양을 사용하여 크리틱을 만듭니다. 자세한 내용은 rlQValueFunction 항목을 참조하십시오.
critic = rlVectorQValueFunction(dnn,observationInfo,actionInfo);
rlOptimizerOptions를 사용하여 크리틱에 대한 훈련 옵션을 지정합니다.
criticOptions = rlOptimizerOptions( ... LearnRate=1e-3, ... GradientThreshold=1, ... L2RegularizationFactor=1e-4);
rlDQNAgentOptions를 사용하여 DQN 에이전트 옵션을 지정하고 크리틱에 대한 훈련 옵션을 포함시킵니다.
agentOptions = rlDQNAgentOptions(... SampleTime=Ts,... UseDoubleDQN=true,... CriticOptimizerOptions=criticOptions,... ExperienceBufferLength=1e6,... MiniBatchSize=64); agentOptions.EpsilonGreedyExploration.EpsilonDecay = 1e-4;
그런 다음, 지정된 크리틱 표현과 에이전트 옵션을 사용하여 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);
재현이 가능하도록 난수 스트림을 고정합니다.
rng(0,"twister");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 에이전트 시뮬레이션하기
재현이 가능하도록 난수 스트림을 고정합니다.
rng(0,"twister");훈련된 에이전트의 성능을 검증하려면 다음 두 줄의 주석을 해제하고 환경 내에서 에이전트를 시뮬레이션하십시오. 에이전트 시뮬레이션에 대한 자세한 내용은 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초 후에 안정된 상태에 이르는 것을 알 수 있습니다.
previousRngState에 저장된 정보를 사용하여 난수 스트림을 복원합니다.
rng(previousRngState);
재설정 함수
function in = localResetFcn(in) % reset lateral deviation and relative yaw angle to random values in = setVariable(in,"e1_initial", 0.5*(-1+2*rand)); in = setVariable(in,"e2_initial", 0.1*(-1+2*rand)); end
참고 항목
함수
train|sim|rlSimulinkEnv
객체
블록
도움말 항목
- Train DQN Agent for Lane Keeping Assist Using Parallel Computing
- Train PPO Agent with Curriculum Learning for a Lane Keeping Application
- 경로 추종 컨트롤을 위해 DDPG 에이전트 훈련시키기
- Lane Keeping Assist System Using Model Predictive Control (Model Predictive Control Toolbox)
- Create Policies and Value Functions
- DQN(심층 Q-신경망) 에이전트
- 강화 학습 에이전트 훈련시키기