Main Content

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

카트-폴 시스템의 균형을 유지하도록 AC 에이전트 훈련시키기

이 예제에서는 MATLAB®에서 모델링된 카트-폴 시스템의 균형을 유지하도록 액터-크리틱(AC) 에이전트를 훈련시키는 방법을 보여줍니다.

AC 에이전트에 대한 자세한 내용은 Actor-Critic (AC) Agents 항목을 참조하십시오. 병렬 연산을 사용하여 AC 에이전트를 훈련시키는 방법에 대한 예제는 Train AC Agent to Balance Cart-Pole System Using Parallel Computing 항목을 참조하십시오.

카트-폴 MATLAB 환경

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

이 환경의 경우 다음이 적용됩니다.

  • 위쪽으로 똑바로 균형이 잡혀 있을 때의 진자 위치는 0라디안이고, 아래쪽으로 매달려 있을 때의 위치는 pi라디안입니다.

  • 진자의 초기 각이 –0.05rad과 0.05rad 사이이고 위쪽을 향해 있을 때 시작합니다.

  • 에이전트에서 환경으로 전달되는 힘 행동 신호는 –10N 또는 10N입니다.

  • 환경에서 관측하는 값은 카트의 위치와 속도, 진자 각, 진자 각 도함수입니다.

  • 막대가 수직에서 12도 이상 기울거나 카트가 원래 위치에서 2.4m 이상 이동하면 에피소드가 종료됩니다.

  • 막대가 위쪽을 향해 바로 서 있는 매 시간 스텝마다 보상 +1이 주어집니다. 진자가 넘어지면 벌점 –5가 적용됩니다.

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

환경 인터페이스 만들기

진자에 대해 미리 정의된 환경 인터페이스를 만듭니다.

env = rlPredefinedEnv("CartPole-Discrete")
env = 
  CartPoleDiscreteAction with properties:

                  Gravity: 9.8000
                 MassCart: 1
                 MassPole: 0.1000
                   Length: 0.5000
                 MaxForce: 10
                       Ts: 0.0200
    ThetaThresholdRadians: 0.2094
               XThreshold: 2.4000
      RewardForNotFalling: 1
        PenaltyForFalling: -5
                    State: [4x1 double]

env.PenaltyForFalling = -10;

인터페이스에는 에이전트가 힘 값 –10N 또는 10N 중 하나를 카트에 적용할 수 있는 이산 행동 공간이 있습니다.

환경 인터페이스에서 관측값과 행동 정보를 가져옵니다.

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

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

rng(0)

AC 에이전트 만들기

AC 에이전트는 가치-함수 크리틱을 사용하여 감가된 누적 장기 보상을 근사합니다. 가치-함수 크리틱은 관측값을 입력값으로 받고 single형 스칼라(추정되는 감가된 누적 장기 보상)를 출력값으로 반환해야 합니다.

크리틱 내에서 가치 함수를 근사하려면 신경망을 사용하십시오. 신경망을 layer 객체로 구성된 배열로 정의하고, 환경 사양 객체에서 관측값 공간 차원과 가능한 행동 개수를 가져옵니다. 심층 신경망 가치 함수 표현을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.

criticNet = [
    featureInputLayer(obsInfo.Dimension(1))
    fullyConnectedLayer(32)
    reluLayer
    fullyConnectedLayer(1)];

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

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

   Number of learnables: 193

   Inputs:
      1   'input'   4 features

criticNet과 관측값 사양을 사용하여 크리틱 근사기 객체를 만듭니다. 자세한 내용은 rlValueFunction 항목을 참조하십시오.

critic = rlValueFunction(criticNet,obsInfo);

임의의 관측값 입력값을 사용하여 크리틱을 확인합니다.

getValue(critic,{rand(obsInfo.Dimension)})
ans = single
    -0.3590

AC 에이전트는 확률적 정책을 사용하여 어떤 행동을 취할지 결정합니다. 이산 행동 공간의 경우에는 이산 범주형 액터에 의해 근사됩니다. 이 액터는 관측값 신호를 입력값으로 받고 각 행동에 대한 확률을 반환해야 합니다.

액터 내에서 정책 함수를 근사하려면 심층 신경망을 사용하십시오. 신경망을 layer 객체로 구성된 배열로 정의하고, 환경 사양 객체에서 관측값 공간 차원과 가능한 행동 개수를 가져옵니다.

actorNet = [
    featureInputLayer(obsInfo.Dimension(1))
    fullyConnectedLayer(32)
    reluLayer
    fullyConnectedLayer(numel(actInfo.Elements))
    softmaxLayer];

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

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

   Number of learnables: 226

   Inputs:
      1   'input'   4 features

actorNet과 관측값 및 행동 사양을 사용하여 액터 근사기 객체를 만듭니다. 자세한 내용은 rlDiscreteCategoricalActor 항목을 참조하십시오.

actor = rlDiscreteCategoricalActor(actorNet,obsInfo,actInfo);

가능한 행동의 확률 분포를 임의 관측값의 함수로 반환하려면 현재 신경망 가중치가 주어진 경우 evaluate를 사용합니다.

prb = evaluate(actor,{rand(obsInfo.Dimension)})
prb = 1x1 cell array
    {2x1 single}

prb{1}
ans = 2x1 single column vector

    0.4414
    0.5586

액터와 크리틱을 사용하여 에이전트를 만듭니다. 자세한 내용은 rlACAgent 항목을 참조하십시오.

agent = rlACAgent(actor,critic);

임의의 관측값 입력값을 사용하여 에이전트를 확인합니다.

getAction(agent,{rand(obsInfo.Dimension)})
ans = 1x1 cell array
    {[-10]}

점 표기법을 사용하여 액터와 크리틱에 대한 훈련 옵션을 포함하여 에이전트 옵션을 지정합니다. 또는 에이전트를 만들기 전에 rlACAgentOptions 객체와 rlOptimizerOptions 객체를 사용할 수 있습니다.

agent.AgentOptions.EntropyLossWeight = 0.01;

agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-2;
agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;
agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-2;
agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;

에이전트 훈련시키기

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

  • 최대 1000개의 에피소드에 대해 각 훈련 에피소드를 실행하며, 각 에피소드마다 최대 500개의 시간 스텝이 지속됩니다.

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

  • 연속 10개의 에피소드 동안 에이전트가 받은 평균 누적 보상이 480보다 크면 훈련을 중지합니다. 이 시점에서 에이전트는 똑바로 서 있는 위치에서 진자의 균형을 유지할 수 있습니다.

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

trainOpts = rlTrainingOptions(...
    MaxEpisodes=1000,...
    MaxStepsPerEpisode=500,...
    Verbose=false,...
    Plots="training-progress",...
    StopTrainingCriteria="AverageReward",...
    StopTrainingValue=480,...
    ScoreAveragingWindowLength=10);

훈련이나 시뮬레이션 중에 plot 함수를 사용하여 카트-폴 시스템을 시각화할 수 있습니다.

plot(env)

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

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

doTraining = false;

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

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

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

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

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

totalReward = sum(experience.Reward)
totalReward = 500

참고 항목

함수

객체

관련 예제

세부 정보