주요 콘텐츠

카트-폴 시스템이 위쪽으로 똑바로 서서 균형을 유지하도록 DDPG 에이전트 훈련시키기

이 예제에서는 Simscape™ Multibody™에서 모델링된 카트-폴 시스템이 위쪽으로 똑바로 서서 균형을 유지하도록 DDPG(심층 결정적 정책 경사) 에이전트를 훈련시키는 방법을 보여줍니다.

DDPG 에이전트에 대한 자세한 내용은 DDPG(심층 결정적 정책 경사) 에이전트 항목을 참조하십시오. MATLAB®에서 DDPG 에이전트를 훈련시키는 방법에 대한 예제는 Compare DDPG Agent to LQR Controller 항목을 참조하십시오.

예제 코드의 다양한 단계에서 난수 계산이 포함될 수 있습니다. 예제 코드에 있는 다양한 섹션의 시작 부분에서 난수 스트림을 고정하면 매 실행 시에 섹션의 난수열이 유지되며 결과를 재현할 가능성이 높아집니다. 자세한 내용은 결과 재현성 항목을 참조하십시오.

재현이 가능하도록 난수 스트림 고정하기

예제 코드의 다양한 단계에서 난수 계산이 포함될 수 있습니다. 난수 스트림을 고정하면 매 코드 실행 시 난수 시퀀스가 유지되며 결과를 재현할 가능성이 높아집니다. 이 예제의 다양한 지점에서 난수 스트림을 고정할 것입니다. 메르센 트위스터 난수 알고리즘을 사용하여 시드값 0으로 난수 스트림을 고정합니다. 난수 생성에 사용되는 시드값을 제어하는 방법에 대한 자세한 내용은 rng 항목을 참조하십시오.

previousRngState = rng(0,"twister");

출력값 previousRngState는 스트림의 이전 상태에 대한 정보를 포함하는 구조체입니다. 이 예제의 끝부분에서 그 상태를 복원할 것입니다.

카트-폴 Simscape 모델

이 예제의 강화 학습 환경은 카트의 비구동 관절에 붙어 있는 막대로, 카트는 마찰이 없는 트랙을 따라 움직입니다. 훈련 목표는 최소한의 제어 노력으로 이 막대가 똑바로 서 있게 만드는 것입니다.

모델을 엽니다.

mdl = "rlCartPoleSimscapeModel";
open_system(mdl)

카트-폴 시스템은 Simscape Multibody를 사용하여 모델링됩니다.

이 모델의 경우 다음이 적용됩니다.

  • 위쪽을 향해 있을 때의 막대 각도는 0라디안이고, 아래쪽으로 매달려 있을 때의 진자 위치는 pi라디안입니다.

  • 에이전트에서 환경으로 전달되는 힘(오른쪽을 양의 방향으로 간주) 행동 신호는 –15N에서 15N까지입니다.

  • 환경에서 관측하는 값은 카트의 위치와 속도, 막대 각의 사인과 코사인, 도함수입니다.

  • 카트가 원래 위치에서 3.5m 이상 이동하면 에피소드가 종료됩니다.

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

rt=-0.1(5θt2+xt2+0.05ut-12)-100B

여기서 각 요소는 다음과 같습니다.

  • θt는 막대의 똑바로 세워진 위치에서의 변위 각도(시계 반대 방향을 양의 방향으로 간주)입니다.

  • xt는 카트의 중심 위치(오른쪽을 양의 방향으로 간주)에서의 위치 변위입니다.

  • ut-1은 이전 시간 스텝의 제어 노력입니다.

  • B는 카트가 범위를 벗어나는지를 나타내는 플래그(1 또는 0)입니다.

이 모델에 대한 자세한 설명은 Load Predefined Control System Environments 항목을 참조하십시오.

환경 객체 만들기

막대에 대해 미리 정의된 환경 객체를 만듭니다.

env = rlPredefinedEnv("CartPoleSimscapeModel-Continuous")
env = 
SimulinkEnvWithAgent with properties:

           Model : rlCartPoleSimscapeModel
      AgentBlock : rlCartPoleSimscapeModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

환경에는 에이전트가 수평력(–15N에서 15N 사이)을 카트에 적용할 수 있는 연속 행동 공간이 있습니다.

환경 객체에서 관측값과 행동 정보를 가져옵니다.

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

에이전트 샘플 시간 Ts와 시뮬레이션 시간 Tf를 초 단위로 지정합니다.

Ts = 0.02;
Tf = 25;

DDPG 에이전트 만들기

이 예제에서는 DDPG 에이전트를 만들고 훈련시킵니다. 이 에이전트는 다음을 사용합니다.

  • 정책의 값을 추정하기 위해 Q-값 함수 크리틱 사용. Q-값 함수 크리틱은 현재 관측값과 행동을 입력값으로 받고 single형 스칼라를 출력값(현재 관측값에 해당하는 상태로부터 행동이 주어지고 이후 정책을 따랐을 때 추정되는 감가된 누적 장기 보상)으로 반환합니다.

  • 연속 행동 공간에 대해 연속 결정적 액터가 학습한 결정적 정책 사용. 이 액터는 현재 관측값을 입력값으로 받고 관측값의 결정적 함수인 행동을 출력값으로 반환합니다.

액터 함수와 크리틱 함수는 신경망 표현을 통해 근사됩니다. 은닉 계층 크기가 200인 신경망을 초기화하기 위해 agent initialization 객체를 만듭니다.

initOpts = rlAgentInitializationOptions(NumHiddenUnit=200);

rlDDPGAgentOptions를 사용하여 훈련을 위한 하이퍼파라미터를 구성합니다.

  • 액터와 크리틱 학습률을 5e-3으로 지정합니다. 학습률이 높으면 대대적인 업데이트가 야기되어 발산이 발생할 수 있으며, 값이 낮으면 최적점에 도달하기까지 많은 업데이트가 필요할 수 있습니다.

  • 기울기 임계값을 1로 지정합니다. 기울기를 자르면 학습 안정성이 향상됩니다.

  • 경험 버퍼의 용량을 1e5로 지정합니다. 용량이 크면 다양한 경험 세트를 저장할 수 있습니다.

  • 평활화 인자를 5e-3으로 지정하여 타깃 크리틱 신경망을 업데이트합니다.

  • 에이전트의 샘플 시간을 Ts로 지정합니다.

  • 훈련 Epoch 1회당 최대 200개의 미니 배치로 학습합니다.

criticOptions = rlOptimizerOptions( ...
    LearnRate=5e-03, ...
    GradientThreshold=1);
actorOptions = rlOptimizerOptions( ...
    LearnRate=5e-03, ...
    GradientThreshold=1);
agentOptions = rlDDPGAgentOptions(...
    SampleTime=Ts,...
    ActorOptimizerOptions=actorOptions,...
    CriticOptimizerOptions=criticOptions,...
    ExperienceBufferLength=1e5,...
    TargetSmoothFactor=5e-3,...
    MaxMiniBatchPerEpoch=200);

또는 먼저 에이전트를 만든 다음, 에이전트의 option 객체에 액세스하고 점 표기법을 사용하여 옵션을 수정할 수도 있습니다.

이 예제의 DDPG 에이전트는 탐색에 Ornstein-Uhlenbeck(OU) 잡음 모델을 사용합니다. 점 표기법을 사용하여 다음 잡음 옵션을 지정합니다.

  • 평균 유인 값을 0.1/Ts로 지정합니다. 평균 유인 값이 클수록 잡음 값이 평균에 가깝게 유지됩니다.

  • 훈련 중 탐색을 개선하기 위해 표준편차 값을 1/Ts로 지정합니다.

agentOptions.NoiseOptions.StandardDeviation = 1.0/sqrt(Ts);
agentOptions.NoiseOptions.MeanAttractionConstant = 0.1/Ts;

재현이 가능하도록 난수 스트림을 고정합니다.

rng(0,"twister");

그런 다음 입력 사양 객체와 agent options 객체를 사용하여 에이전트를 만듭니다. 자세한 내용은 rlDDPGAgent 항목을 참조하십시오.

agent = rlDDPGAgent(obsInfo,actInfo,initOpts,agentOptions);

에이전트 훈련시키기

에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.

  • 최대 2000개의 에피소드에 대해 각 훈련 에피소드를 실행하며, 각 에피소드마다 최대 ceil(Tf/Ts)개의 시간 스텝이 지속됩니다.

  • 강화 학습 훈련 모니터 대화 상자에 훈련 진행 상황을 표시하고(Plots 옵션 설정) 명령줄 표시를 비활성화합니다(Verbose 옵션을 false로 설정).

  • 훈련 에피소드 10개마다 시뮬레이션을 1번 실행하여 그리디 정책 성능을 평가합니다.

  • 그리디 정책 평가가 –390을 초과하면 훈련을 중지합니다. 이 시점에서 에이전트는 막대가 똑바로 서 있는 위치에서 최소한의 제어 노력을 사용하여 빠르게 막대의 균형을 유지할 수 있습니다.

훈련 옵션에 대한 자세한 내용은 rlTrainingOptions 항목과 rlEvaluator 항목을 참조하십시오.

% training options
maxepisodes = 2000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    MaxEpisodes=maxepisodes,...
    MaxStepsPerEpisode=maxsteps,...
    ScoreAveragingWindowLength=5,...
    Verbose=false,...
    Plots="training-progress",...
    StopTrainingCriteria="EvaluationStatistic",...
    StopTrainingValue=-390);

% agent evaluation
evl = rlEvaluator(NumEpisodes=1,EvaluationFrequency=10);

재현이 가능하도록 난수 스트림을 고정합니다.

rng(0,"twister");

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

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions,Evaluator=evl);
else
    % Load the pretrained agent for the example.
    load("SimscapeCartPoleDDPG.mat","agent")
end

훈련 과정의 스냅샷이 아래 그림에 나와 있습니다. 훈련 과정에서 임의성으로 인해 서로 다른 결과가 나올 수 있습니다.

DDPG 에이전트 시뮬레이션하기

재현이 가능하도록 난수 스트림을 고정합니다.

rng(0,"twister");

훈련된 에이전트의 성능을 검증하려면 카트-폴 환경 내에서 에이전트를 시뮬레이션하십시오. 에이전트 시뮬레이션에 대한 자세한 내용은 rlSimulationOptions 항목과 sim 항목을 참조하십시오.

simOptions = rlSimulationOptions(MaxSteps=500);
experience = sim(env,agent,simOptions);

previousRngState에 저장된 정보를 사용하여 난수 스트림을 복원합니다.

rng(previousRngState);

참고 항목

함수

객체

블록

도움말 항목