Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

차선 유지 보조를 위해 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와 시뮬레이션 지속 시간 Tf를 초 단위로 정의합니다.

Ts = 0.1;
T = 15;

LKA 시스템의 출력값은 자기 차량의 앞쪽 조향각입니다. 자기 차량의 물리적 한계를 시뮬레이션하기 위해 조향각 범위를 [-0.5,0.5]rad로 제한합니다.

u_min = -0.5;
u_max = 0.5;

도로의 곡률은 상수 0.001(m-1)로 정의됩니다. 횡방향 편차의 초기값은 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도까지입니다.

  • 환경에서 관측하는 값은 횡방향 편차 e1과 상대적 요 각도 e2, 이들의 도함수인 e˙1e˙2, 이들의 적분인 e1e2입니다.

  • 횡방향 편차 |e1|>1.이면 시뮬레이션이 종료됩니다.

  • 매 시간 스텝 t마다 제공되는 보상 rt는 다음과 같습니다.

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 = "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 에이전트는 파라미터화된 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)

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

dnn과 관측값 및 행동 사양을 사용하여 크리틱을 만듭니다. 자세한 내용은 rlQValueFunction 항목을 참조하십시오.

critic = rlVectorQValueFunction(dnn,observationInfo,actionInfo);

rlOptimizerOptions를 사용하여 크리틱에 대한 훈련 옵션을 지정합니다.

criticOptions = rlOptimizerOptions( ...
    LearnRate=1e-4, ...
    GradientThreshold=1, ...
    L2RegularizationFactor=1e-4);

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 함수를 사용하여 에이전트를 훈련시킵니다. 훈련은 완료하는 데 몇 시간이 소요되는 계산 집약적인 절차입니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTrainingfalse로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTrainingtrue로 설정하십시오.

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 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

참고 항목

함수

객체

블록

관련 예제

세부 정보