Main Content

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

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

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

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

카트-폴 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);

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

Ts = 0.02;
Tf = 25;

재현이 가능하도록 난수 생성기 시드값을 고정합니다.

rng(0)

DDPG 에이전트 만들기

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

크리틱 내에서 파라미터화된 Q-값 함수를 모델링하려면 두 개의 입력 계층(obsInfo로 지정된 대로 관측값 채널에 대한 입력 계층 및 actInfo로 지정된 대로 행동 채널에 대한 입력 계층)과 (스칼라 값을 반환하는) 하나의 출력 계층을 갖는 신경망을 사용하십시오. prod(obsInfo.Dimension)prod(actInfo.Dimension)은 행 벡터, 열 벡터 또는 행렬로 정렬되는지에 관계없이 각각 관측값 공간과 행동 공간의 차원 수를 반환합니다.

신경망을 layer 객체로 구성된 배열로 정의합니다. 각 경로의 입력 계층과 출력 계층에 이름을 할당합니다. 이러한 이름을 사용하면 경로를 연결한 다음 나중에 신경망 입력 계층 및 출력 계층을 적절한 환경 채널과 명시적으로 연결할 수 있습니다.

심층 신경망 가치 함수 표현을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.

% Define path for the state input
statePath = [
    featureInputLayer(prod(obsInfo.Dimension),Name="NetObsInLayer")
    fullyConnectedLayer(128)
    reluLayer
    fullyConnectedLayer(200,Name="sPathOut")];

% Define path for the action input
actionPath = [
    featureInputLayer(prod(actInfo.Dimension),Name="NetActInLayer")
    fullyConnectedLayer(200,Name="aPathOut",BiasLearnRateFactor=0)];

% Define path for the critic output (value)
commonPath = [
    additionLayer(2,Name="add")
    reluLayer
    fullyConnectedLayer(1,Name="CriticOutput")];

% Create layerGraph object and add layers
criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);

% Connect paths and convert to dlnetwork object
criticNetwork = connectLayers(criticNetwork,"sPathOut","add/in1");
criticNetwork = connectLayers(criticNetwork,"aPathOut","add/in2");
criticNetwork = dlnetwork(criticNetwork);

가중치 개수를 표시하고 신경망 구성을 플로팅합니다.

summary(criticNetwork)
   Initialized: true

   Number of learnables: 27.1k

   Inputs:
      1   'NetObsInLayer'   5 features
      2   'NetActInLayer'   1 features
plot(criticNetwork)

지정된 심층 신경망과 옵션을 사용하여 크리틱 표현을 만듭니다. 이미 환경 인터페이스에서 얻은 크리틱에 대한 행동 및 관측값 정보도 지정해야 합니다. 자세한 내용은 rlQValueFunction 항목을 참조하십시오.

critic = rlQValueFunction(criticNetwork, ...
    obsInfo,actInfo,...
    ObservationInputNames="NetObsInLayer", ...
    ActionInputNames="NetActInLayer");

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

액터 내에서 파라미터화된 정책을 모델링하려면 (obsInfo로 지정된 대로 환경 관측값 채널의 내용을 받는) 하나의 입력 계층과 (actInfo로 지정된 대로 환경 행동 채널에 행동을 반환하는) 하나의 출력 계층을 갖는 신경망을 사용하십시오.

tanhLayer의 출력값은 -1과 1 사이로 제한되므로 scalingLayer를 사용하여 신경망 출력값을 행동의 범위로 스케일링합니다.

actorNetwork = [
    featureInputLayer(prod(obsInfo.Dimension))
    fullyConnectedLayer(128)
    reluLayer
    fullyConnectedLayer(200)
    reluLayer
    fullyConnectedLayer(prod(actInfo.Dimension))
    tanhLayer
    scalingLayer(Scale=max(actInfo.UpperLimit))
    ];

dlnetwork로 변환하고 가중치 개수를 표시합니다.

actorNetwork = dlnetwork(actorNetwork);
summary(actorNetwork)
   Initialized: true

   Number of learnables: 26.7k

   Inputs:
      1   'input'   5 features

크리틱과 비슷한 방식으로 액터를 만듭니다. 자세한 내용은 rlContinuousDeterministicActor 항목을 참조하십시오.

actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);

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

criticOptions = rlOptimizerOptions(LearnRate=1e-03,GradientThreshold=1);
actorOptions = rlOptimizerOptions(LearnRate=5e-04,GradientThreshold=1);

rlDDPGAgentOptions를 사용하여 DDPG 에이전트 옵션을 지정하고 액터와 크리틱의 훈련 옵션을 포함시킵니다.

agentOptions = rlDDPGAgentOptions(...
    SampleTime=Ts,...
    ActorOptimizerOptions=actorOptions,...
    CriticOptimizerOptions=criticOptions,...
    ExperienceBufferLength=1e6,...
    MiniBatchSize=128);

점 표기법을 사용하여 에이전트 옵션을 수정할 수도 있습니다.

agentOptions.NoiseOptions.Variance = 0.4;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;

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

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

agent = rlDDPGAgent(actor,critic,agentOptions);

에이전트 훈련시키기

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

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

  • 에피소드 관리자 대화 상자에 훈련 진행 상황을 표시하고(Plots 옵션 설정) 명령줄 표시를 비활성화합니다(Verbose 옵션을 false로 설정).

  • 연속되는 5개의 에피소드에서 에이전트가 받은 평균 누적 보상이 –400보다 클 때 훈련을 중지합니다. 이 시점에서 에이전트는 막대가 똑바로 서 있는 위치에서 최소한의 제어 노력을 사용하여 빠르게 막대의 균형을 유지할 수 있습니다.

  • 누적 보상이 –400보다 큰 각 에피소드에 대한 에이전트의 복사본을 저장합니다.

자세한 내용은 rlTrainingOptions 항목을 참조하십시오.

maxepisodes = 2000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    MaxEpisodes=maxepisodes,...
    MaxStepsPerEpisode=maxsteps,...
    ScoreAveragingWindowLength=5,...
    Verbose=false,...
    Plots="training-progress",...
    StopTrainingCriteria="AverageReward",...
    StopTrainingValue=-400,...
    SaveAgentCriteria="EpisodeReward",...
    SaveAgentValue=-400);

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

doTraining = false;

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

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

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

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

bdclose(mdl)

참고 항목

함수

객체

블록

관련 예제

세부 정보