진자가 위쪽으로 똑바로 서서 균형을 유지하도록 DDPG 에이전트 훈련시키기
이 예제에서는 Simulink®에서 모델링된 진자가 위쪽으로 똑바로 서서 균형을 유지하도록 DDPG(심층 결정적 정책 경사) 에이전트를 훈련시키는 방법을 보여줍니다.
DDPG 에이전트에 대한 자세한 내용은 DDPG(심층 결정적 정책 경사) 에이전트 항목을 참조하십시오. MATLAB®에서 DDPG 에이전트를 훈련시키는 예제는 Compare DDPG Agent to LQR Controller 항목을 참조하십시오.
재현이 가능하도록 난수 스트림 고정하기
예제 코드의 다양한 단계에서 난수 계산이 포함될 수 있습니다. 예제 코드에 있는 다양한 섹션의 시작 부분에서 난수 스트림을 고정하면 매 실행 시에 섹션의 난수열이 유지되며 결과를 재현할 가능성이 높아집니다. 자세한 내용은 결과 재현성 항목을 참조하십시오.
시드값 0과 난수 알고리즘인 메르센 트위스터를 사용하여 난수 스트림을 고정합니다. 난수 생성에 사용되는 시드값을 제어하는 방법에 대한 자세한 내용은 rng 항목을 참조하십시오.
previousRngState = rng(0,"twister");출력값 previousRngState는 스트림의 이전 상태에 대한 정보를 포함하는 구조체입니다. 이 예제의 끝부분에서 그 상태를 복원할 것입니다.
진자 스윙업 모델
이 예제의 강화 학습 환경은 처음에 아래쪽을 향해 매달려 있는 마찰 없는 단순 진자입니다. 훈련 목표는 최소한의 제어 노력으로 이 진자가 똑바로 서 있게 만드는 것입니다.
모델을 엽니다.
mdl = "rlSimplePendulumModel";
open_system(mdl)
이 모델의 경우 다음이 적용됩니다.
위쪽으로 똑바로 균형이 잡혀 있을 때의 진자 위치는 0라디안이고, 아래쪽으로 매달려 있을 때의 진자 위치는
pi라디안입니다.에이전트에서 환경으로 전달되는 토크 행동 신호는 –2Nm에서 2Nm까지입니다.
환경에서 관측하는 값은 진자 각의 사인, 진자 각의 코사인, 진자 각 도함수입니다.
매 시간 스텝마다 제공되는 보상 는 다음과 같습니다.
여기서 각 요소는 다음과 같습니다.
는 똑바로 세워진 위치에서의 변위 각도입니다.
는 변위 각도의 도함수입니다.
은 이전 시간 스텝의 제어 노력입니다.
이 모델에 대한 자세한 설명은 Load Predefined Control System Environments 항목을 참조하십시오.
환경 인터페이스 만들기
진자에 대해 미리 정의된 환경 객체를 만듭니다.
env = rlPredefinedEnv("SimplePendulumModel-Continuous")env =
SimulinkEnvWithAgent with properties:
Model : rlSimplePendulumModel
AgentBlock : rlSimplePendulumModel/RL Agent
ResetFcn : []
UseFastRestart : on
obsInfo = getObservationInfo(env);
객체에는 에이전트가 –2Nm에서 2Nm 사이의 토크 값을 진자에 적용할 수 있는 연속 행동 공간이 있습니다.
actInfo = getActionInfo(env)
actInfo =
rlNumericSpec with properties:
LowerLimit: -2
UpperLimit: 2
Name: "torque"
Description: [0×0 string]
Dimension: [1 1]
DataType: "double"
환경의 관측값을 진자 각의 사인, 진자 각의 코사인, 진자 각 도함수가 되도록 설정합니다.
set_param( ... "rlSimplePendulumModel/create observations", ... "ThetaObservationHandling","sincos");
진자의 초기 조건을 아래쪽을 향해 매달려 있는 것으로 정의하려면 익명 함수 핸들을 사용하여 환경 재설정 함수를 지정하십시오. 이 재설정 함수는 모델 작업 공간 변수 theta0을 pi로 설정합니다.
env.ResetFcn = @(in)setVariable(in,"theta0",pi,"Workspace",mdl);
에이전트 샘플 시간 Ts와 시뮬레이션 시간 Tf를 초 단위로 지정합니다.
Ts = 0.05; Tf = 20;
DDPG 에이전트 만들기
에이전트를 만들면 액터 신경망과 크리틱 신경망은 무작위로 초기화됩니다. 난수 생성에 사용되는 시드값을 고정하여 섹션의 재현이 가능하도록 합니다.
rng(0,"twister")환경 사양 객체를 사용하여 디폴트 rlDDPGAgent 객체를 만듭니다.
agent = rlDDPGAgent(obsInfo,actInfo);
환경에서 RL Agent 블록이 디폴트 설정인 1초 대신 매 Ts초마다 실행되도록 하려면 에이전트의 SampleTime 속성을 설정합니다.
agent.AgentOptions.SampleTime = Ts;
더 원활한 (하지만 더 느릴 수 있는) 훈련을 촉진하기 위해 학습률과 기울기 임계값을 낮게 설정합니다.
agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-3; agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-3; agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1; agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;
경험 버퍼의 길이와 미니 버퍼 크기를 늘립니다.
agent.AgentOptions.ExperienceBufferLength = 1e5; agent.AgentOptions.MiniBatchSize = 128;
에이전트 훈련시키기
에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.
최대 5000개의 에피소드에 대해 훈련을 실행하며, 각 에피소드마다 최대
ceil(Tf/Ts)개의 시간 스텝이 지속됩니다.강화 학습 훈련 모니터 대화 상자에 훈련 진행 상황을 표시하고(
Plots옵션 설정) 명령줄 표시를 비활성화합니다(Verbose옵션을false로 설정).결정적 정책을 평가할 때 에이전트가 받은 평균 누적 보상이 –740보다 크면 훈련을 중지합니다. 이 시점에서 에이전트는 진자가 똑바로 서 있는 위치에서 최소한의 제어 노력을 사용하여 빠르게 진자의 균형을 유지할 수 있습니다.
누적 보상이 –740보다 큰 각 에피소드에 대한 에이전트의 복사본을 저장합니다.
훈련 옵션에 대한 자세한 내용은 rlTrainingOptions 항목을 참조하십시오.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainOpts = rlTrainingOptions(... MaxEpisodes=maxepisodes,... MaxStepsPerEpisode=maxsteps,... ScoreAveragingWindowLength=5,... Verbose=false,... Plots="training-progress",... StopTrainingCriteria="EvaluationStatistic",... StopTrainingValue=-740,... SaveAgentCriteria="EvaluationStatistic",... SaveAgentValue=-740);
train 함수를 사용하여 에이전트를 훈련시킵니다. 이 에이전트를 훈련시키는 것은 완료하는 데 몇 시간이 소요되는 계산 집약적인 절차입니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTraining을 false로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTraining을 true로 설정하십시오.
doTraining =false; if doTraining % Use the rlEvaluator object to measure policy performance every 10 % episodes evaluator = rlEvaluator(... NumEpisodes=1,... EvaluationFrequency=10); % Train the agent. trainingResults = train(agent,env,trainOpts,Evaluator=evaluator); else % Load the pretrained agent for the example. load("SimulinkPendulumDDPG.mat","agent") end

DDPG 에이전트 시뮬레이션하기
재현이 가능하도록 난수 스트림을 고정합니다.
rng(0,"twister");훈련된 에이전트의 성능을 검증하려면 진자 환경 내에서 에이전트를 시뮬레이션하십시오. 에이전트 시뮬레이션에 대한 자세한 내용은 rlSimulationOptions 항목과 sim 항목을 참조하십시오.
simOptions = rlSimulationOptions(MaxSteps=500); experience = sim(env,agent,simOptions);

totalReward = sum(experience.Reward)
totalReward = -731.2350
시뮬레이션을 통해, 에이전트가 진자를 세로로 안정되게 유지하는 것을 알 수 있습니다.
previousRngState에 저장된 정보를 사용하여 난수 스트림을 복원합니다.
rng(previousRngState);
참고 항목
앱
함수
train|sim|rlSimulinkEnv
객체
rlDDPGAgent|rlDDPGAgentOptions|rlQValueFunction|rlContinuousDeterministicActor|rlTrainingOptions|rlSimulationOptions|rlOptimizerOptions
