이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
카트-폴 시스템이 위쪽으로 똑바로 서서 균형을 유지하도록 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 이상 이동하면 에피소드가 종료됩니다.
매 시간 스텝마다 제공되는 보상 는 다음과 같습니다.
여기서 각 요소는 다음과 같습니다.
는 막대의 똑바로 세워진 위치에서의 변위 각도입니다.
는 카트의 중심 위치에서의 위치 변위입니다.
은 이전 시간 스텝의 제어 노력입니다.
는 카트가 범위를 벗어나는지를 나타내는 플래그(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 observation input. obsPath = [ featureInputLayer(prod(obsInfo.Dimension),Name="obsInLayer") concatenationLayer(1,2,Name="cat") fullyConnectedLayer(128) reluLayer fullyConnectedLayer(200) reluLayer fullyConnectedLayer(1,Name="CriticOutput") ]; % Define path for the action input. actPath = featureInputLayer(prod(actInfo.Dimension),Name="actInLayer");
dlnetwork 객체를 만들고 계층을 추가합니다.
criticNetwork = addLayers(dlnetwork(),obsPath); criticNetwork = addLayers(criticNetwork,actPath);
경로를 연결하고 신경망을 초기화합니다.
criticNetwork = connectLayers(criticNetwork,"actInLayer","cat/in2"); criticNetwork = initialize(criticNetwork);
가중치 개수를 표시하고 신경망 구성을 플로팅합니다.
summary(criticNetwork)
Initialized: true Number of learnables: 26.8k Inputs: 1 'obsInLayer' 5 features 2 'actInLayer' 1 features
plot(criticNetwork)
지정된 심층 신경망을 사용하여 크리틱을 만듭니다. 이미 환경 인터페이스에서 얻은 크리틱에 대한 행동 및 관측값 정보도 지정해야 합니다. 자세한 내용은 rlQValueFunction
항목을 참조하십시오.
critic = rlQValueFunction(criticNetwork, ... obsInfo,actInfo,... ObservationInputNames="obsInLayer", ... ActionInputNames="actInLayer");
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); actorNetwork = initialize(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=5e-03,GradientThreshold=1); actorOptions = rlOptimizerOptions(LearnRate=5e-03,GradientThreshold=1);
rlDDPGAgentOptions
를 사용하여 DDPG 에이전트 옵션을 지정하고 액터와 크리틱의 훈련 옵션을 포함시킵니다.
agentOptions = rlDDPGAgentOptions(... SampleTime=Ts,... ActorOptimizerOptions=actorOptions,... CriticOptimizerOptions=criticOptions,... ExperienceBufferLength=1e5,... TargetSmoothFactor=5e-3,... MaxMiniBatchPerEpoch=200);
점 표기법을 사용하여 에이전트 옵션을 수정할 수도 있습니다.
agentOptions.NoiseOptions.StandardDeviation = 1.0/sqrt(Ts); agentOptions.NoiseOptions.MeanAttractionConstant = 0.1/Ts;
또는 먼저 에이전트를 만든 다음, 에이전트의 option 객체에 액세스하고 점 표기법을 사용하여 옵션을 수정할 수도 있습니다.
그런 다음 actor 객체, critic 객체, agent options 객체를 사용하여 에이전트를 만듭니다. 자세한 내용은 rlDDPGAgent
항목을 참조하십시오.
agent = rlDDPGAgent(actor,critic,agentOptions);
에이전트 훈련시키기
에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.
최대 2000개의 에피소드에 대해 훈련을 실행하며, 각 에피소드마다 최대
ceil(Tf/Ts)
개의 시간 스텝이 지속됩니다.강화 학습 훈련 모니터 대화 상자에 훈련 진행 상황을 표시하고(
Plots
옵션 설정) 명령줄 표시를 비활성화합니다(Verbose
옵션을false
로 설정).그리디 정책 평가가 –390을 초과하면 훈련을 중지합니다. 이 시점에서 에이전트는 막대가 똑바로 서 있는 위치에서 최소한의 제어 노력을 사용하여 빠르게 막대의 균형을 유지할 수 있습니다.
자세한 내용은 rlTrainingOptions
항목을 참조하십시오.
maxepisodes = 2000; maxsteps = ceil(Tf/Ts); trainingOptions = rlTrainingOptions(... MaxEpisodes=maxepisodes,... MaxStepsPerEpisode=maxsteps,... ScoreAveragingWindowLength=5,... Verbose=false,... Plots="training-progress",... StopTrainingCriteria="EvaluationStatistic",... StopTrainingValue=-390);
train
함수를 사용하여 에이전트를 훈련시킵니다. 이 에이전트를 훈련시키는 것은 완료하는 데 몇 시간이 소요되는 계산 집약적인 절차입니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTraining
을 false
로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTraining
을 true
로 설정하십시오.
doTraining = false; if doTraining % evaluate the greedy policy every 10 training episodes evaluator = rlEvaluator(NumEpisodes=1,EvaluationFrequency=10); % Train the agent. trainingStats = train(agent,env,trainingOptions,Evaluator=evaluator); 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)
참고 항목
앱
함수
train
|sim
|rlSimulinkEnv
객체
rlDDPGAgent
|rlDDPGAgentOptions
|rlQValueFunction
|rlContinuousDeterministicActor
|rlTrainingOptions
|rlSimulationOptions
|rlOptimizerOptions
블록
관련 예제
- 카트-폴 시스템의 균형을 유지하도록 PG 에이전트 훈련시키기
- Train DDPG Agent to Swing Up and Balance Pendulum with Bus Signal
- Train DDPG Agent to Swing Up and Balance Pendulum with Image Observation