이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
Simulink 환경 만들기 및 에이전트 훈련시키기
이 예제에서는 watertank
Simulink® 모델의 PI 제어기를 강화 학습의 DDPG(심층 결정적 정책 경사법) 에이전트로 변환하는 방법을 보여줍니다. MATLAB®에서 DDPG 에이전트를 훈련시키는 예제는 Compare DDPG Agent to LQR Controller 항목을 참조하십시오.
물탱크 모델
이 예제의 원본 모델은 물탱크 모델입니다. 탱크에 있는 물의 수위를 제어하는 것이 목표입니다. 물탱크 모델에 대한 자세한 내용은 watertank Simulink 모델 (Simulink Control Design) 항목을 참조하십시오.
다음과 같이 변경하여 원본 모델을 수정하십시오.
PID 제어기를 삭제합니다.
RL Agent 블록을 삽입합니다.
관측값 벡터 를 연결합니다. 여기서 는 탱크 내부의 물 높이이고 와 은 기준 높이입니다.
보상 을 설정합니다.
또는 에 해당하는 경우 시뮬레이션이 중지되도록 종료 신호를 구성합니다.
결과로 생성되는 모델은 rlwatertank.slx
입니다. 이 모델 및 그 변경에 대한 자세한 내용은 Create Custom Simulink Environments 항목을 참조하십시오.
open_system("rlwatertank")
환경 만들기
환경 모델을 만들 때는 다음을 정의해야 합니다.
에이전트가 환경과 상호 작용하기 위해 사용하는 행동 및 관측값 신호. 자세한 내용은
rlNumericSpec
항목과rlFiniteSetSpec
항목을 참조하십시오.에이전트가 성공을 측정하기 위해 사용하는 보상 신호. 자세한 내용은 Define Reward and Observation Signals in Custom Environments 항목을 참조하십시오.
관측값 사양 obsInfo
및 행동 사양 actInfo
를 정의합니다.
% Observation info obsInfo = rlNumericSpec([3 1],... LowerLimit=[-inf -inf 0 ]',... UpperLimit=[ inf inf inf]'); % Name and description are optional and not used by the software obsInfo.Name = "observations"; obsInfo.Description = "integrated error, error, and measured height"; % Action info actInfo = rlNumericSpec([1 1]); actInfo.Name = "flow";
환경 객체를 만듭니다.
env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent",... obsInfo,actInfo);
모델에 대한 기준 값을 무작위로 할당하는 사용자 지정 재설정 함수를 설정합니다.
env.ResetFcn = @(in)localResetFcn(in);
시뮬레이션 시간 Tf
와 에이전트 샘플 시간 Ts
를 초 단위로 지정합니다.
Ts = 1.0; Tf = 200;
재현이 가능하도록 난수 생성기 시드값을 고정합니다.
rng(0)
크리틱 만들기
DDPG 에이전트는 파라미터화된 Q-값 함수 근사기를 사용하여 정책의 값을 추정합니다. Q-값 함수 크리틱은 현재 관측값과 행동을 입력값으로 받고 single형 스칼라를 출력값(현재 관측값에 해당하는 상태로부터 행동을 받고 그 후 정책을 따를 때 추정되는 감가된 누적 장기 보상)으로 반환합니다.
크리틱 내에서 파라미터화된 Q-값 함수를 모델링하려면 두 개의 입력 계층(obsInfo
로 지정된 대로 관측값 채널에 대한 입력 계층 및 actInfo
로 지정된 대로 행동 채널에 대한 입력 계층)과 (스칼라 값을 반환하는) 하나의 출력 계층을 갖는 신경망을 사용하십시오.
각 신경망 경로를 layer 객체로 구성된 배열로 정의합니다. 각 경로의 입력 계층과 출력 계층에 이름을 할당합니다. 이러한 이름을 사용하면 경로를 연결한 다음 나중에 신경망 입력 계층 및 출력 계층을 적절한 환경 채널과 명시적으로 연결할 수 있습니다. obsInfo
및 actInfo
사양에서 관측값 공간과 행동 공간의 차원을 가져옵니다.
% Observation path obsPath = [ featureInputLayer(obsInfo.Dimension(1),Name="obsInLyr") fullyConnectedLayer(50) reluLayer fullyConnectedLayer(25,Name="obsPathOutLyr") ]; % Action path actPath = [ featureInputLayer(actInfo.Dimension(1),Name="actInLyr") fullyConnectedLayer(25,Name="actPathOutLyr") ]; % Common path commonPath = [ additionLayer(2,Name="add") reluLayer fullyConnectedLayer(1,Name="QValue") ]; criticNetwork = layerGraph(); criticNetwork = addLayers(criticNetwork,obsPath); criticNetwork = addLayers(criticNetwork,actPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork, ... "obsPathOutLyr","add/in1"); criticNetwork = connectLayers(criticNetwork, ... "actPathOutLyr","add/in2");
크리틱 신경망 구성을 확인합니다.
figure plot(criticNetwork)
신경망을 dlnetwork
객체로 변환하고 이 객체의 속성을 요약합니다.
criticNetwork = dlnetwork(criticNetwork); summary(criticNetwork)
Initialized: true Number of learnables: 1.5k Inputs: 1 'obsInLyr' 3 features 2 'actInLyr' 1 features
지정된 심층 신경망과 환경 사양 객체를 사용하여, 그리고 신경망 입력값이 관측값 채널 및 행동 채널과 연결되어야 하는 경우에는 이름까지 사용하여 크리틱 근사기 객체를 만듭니다.
critic = rlQValueFunction(criticNetwork, ... obsInfo,actInfo, ... ObservationInputNames="obsInLyr", ... ActionInputNames="actInLyr");
Q-값 함수 객체에 대한 자세한 내용은 rlQValueFunction
항목을 참조하십시오.
임의의 입력 관측값과 행동을 사용하여 크리틱을 확인합니다.
getValue(critic, ... {rand(obsInfo.Dimension)}, ... {rand(actInfo.Dimension)})
ans = single
-0.1631
크리틱을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.
액터 만들기
DDPG 에이전트는 연속 행동 공간에 대해 연속 결정적 액터가 학습한 파라미터화된 결정적 정책을 사용합니다.
연속 결정적 액터는 연속 행동 공간에 대해 파라미터화된 결정적 정책을 구현합니다. 이 액터는 현재 관측값을 입력값으로 받고 관측값의 결정적 함수인 행동을 출력값으로 반환합니다.
액터 내에서 파라미터화된 정책을 모델링하려면 (obsInfo
로 지정된 대로 환경 관측값 채널의 내용을 받는) 하나의 입력 계층과 (actInfo
로 지정된 대로 환경 행동 채널에 행동을 반환하는) 하나의 출력 계층을 갖는 신경망을 사용하십시오.
신경망을 layer 객체로 구성된 배열로 정의합니다.
actorNetwork = [ featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(3) tanhLayer fullyConnectedLayer(actInfo.Dimension(1)) ];
신경망을 dlnetwork
객체로 변환하고 이 객체의 속성을 요약합니다.
actorNetwork = dlnetwork(actorNetwork); summary(actorNetwork)
Initialized: true Number of learnables: 16 Inputs: 1 'input' 3 features
지정된 심층 신경망과 환경 사양 객체를 사용하여, 그리고 신경망 입력값이 관측값 채널과 연결되어야 하는 경우에는 이름까지 사용하여 액터 근사기 객체를 만듭니다.
actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);
자세한 내용은 rlContinuousDeterministicActor
항목을 참조하십시오.
임의의 입력 관측값을 사용하여 액터를 확인합니다.
getAction(actor,{rand(obsInfo.Dimension)})
ans = 1x1 cell array
{[-0.3408]}
크리틱을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.
DDPG 에이전트 만들기
지정된 액터와 크리틱 근사기 객체를 사용하여 DDPG 에이전트를 만듭니다.
agent = rlDDPGAgent(actor,critic);
자세한 내용은 rlDDPGAgent
항목을 참조하십시오.
점 표기법을 사용하여 에이전트, 액터 및 크리틱에 대한 옵션을 지정합니다.
agent.SampleTime = Ts; agent.AgentOptions.TargetSmoothFactor = 1e-3; agent.AgentOptions.DiscountFactor = 1.0; agent.AgentOptions.MiniBatchSize = 64; agent.AgentOptions.ExperienceBufferLength = 1e6; agent.AgentOptions.NoiseOptions.Variance = 0.3; agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1e-5; agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-03; agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1; agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-04; agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;
또는 rlDDPGAgentOptions
객체를 사용하여 에이전트 옵션을 지정할 수 있습니다.
임의의 입력 관측값을 사용하여 에이전트를 확인합니다.
getAction(agent,{rand(obsInfo.Dimension)})
ans = 1x1 cell array
{[-0.7926]}
에이전트 훈련시키기
에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.
최대 5000개의 에피소드에 대해 각 훈련을 실행합니다. 각 에피소드가 최대
ceil(Tf/Ts)
개(즉, 200개)의 시간 스텝 동안 지속되도록 지정합니다.에피소드 관리자 대화 상자에 훈련 진행 상황을 표시하고(
Plots
옵션 설정) 명령줄 표시를 비활성화합니다(Verbose
옵션을false
로 설정).연속 20개의 에피소드 동안 에이전트가 받은 평균 누적 보상이 800보다 크면 훈련을 중지합니다. 이 시점에서 에이전트는 탱크에 있는 물의 수위를 제어할 수 있습니다.
자세한 내용은 rlTrainingOptions
항목을 참조하십시오.
trainOpts = rlTrainingOptions(... MaxEpisodes=5000, ... MaxStepsPerEpisode=ceil(Tf/Ts), ... ScoreAveragingWindowLength=20, ... Verbose=false, ... Plots="training-progress",... StopTrainingCriteria="AverageReward",... StopTrainingValue=800);
train
함수를 사용하여 에이전트를 훈련시킵니다. 훈련은 완료하는 데 수 분이 소요되는 계산 집약적인 절차입니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTraining
을 false
로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTraining
을 true
로 설정하십시오.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load the pretrained agent for the example. load("WaterTankDDPG.mat","agent") end
훈련된 에이전트 검증하기
모델에 대해 훈련된 에이전트를 시뮬레이션으로 검증합니다. 재설정 함수는 기준 값을 무작위로 할당하므로, 시뮬레이션 재현이 가능하도록 난수 생성기 시드값을 고정합니다.
rng(1)
환경 내에서 에이전트를 시뮬레이션하고 경험을 출력값으로 반환합니다.
simOpts = rlSimulationOptions(MaxSteps=ceil(Tf/Ts),StopOnError="on");
experiences = sim(env,agent,simOpts);
로컬 재설정 함수
function in = localResetFcn(in) % Randomize reference signal blk = sprintf("rlwatertank/Desired \nWater Level"); h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end in = setBlockParameter(in,blk,Value=num2str(h)); % Randomize initial height h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end blk = "rlwatertank/Water-Tank System/H"; in = setBlockParameter(in,blk,InitialCondition=num2str(h)); end
참고 항목
함수
객체
rlFiniteSetSpec
|rlNumericSpec
|rlQValueFunction
|rlContinuousDeterministicActor
|rlDDPGAgent
|rlDDPGAgentOptions
|rlTrainingOptions
|rlSimulationOptions
관련 예제
- Compare DDPG Agent to LQR Controller
- 카트-폴 시스템의 균형을 유지하도록 DQN 에이전트 훈련시키기
- 진자가 위쪽으로 똑바로 서서 균형을 유지하도록 DQN 에이전트 훈련시키기
- 강화 학습을 사용하여 PI 제어기 조정하기
- Train Reinforcement Learning Agents to Control Quanser QUBE Pendulum