Main Content

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

Simulink 환경 만들기 및 에이전트 훈련시키기

이 예제에서는 watertank Simulink® 모델의 PI 제어기를 강화 학습의 심층 결정적 정책 경사법(DDPG) 에이전트로 변환하는 방법을 보여줍니다. MATLAB®에서 DDPG 에이전트를 훈련시키는 예제는 Train DDPG Agent to Control Double Integrator System 항목을 참조하십시오.

물탱크 모델

이 예제의 원본 모델은 물탱크 모델입니다. 탱크에 있는 물의 수위를 제어하는 것이 목표입니다. 물탱크 모델에 대한 자세한 내용은 watertank Simulink 모델 (Simulink Control Design) 항목을 참조하십시오.

다음과 같이 변경하여 원본 모델을 수정하십시오.

  1. PID 제어기를 삭제합니다.

  2. RL Agent 블록을 삽입합니다.

  3. 관측값 벡터 [e dteh]T 를 연결합니다. 여기서 h는 탱크의 높이, e=r-h, r은 기준 높이입니다.

  4. 보상 reward=10(|e|<0.1)-1(|e|0.1)-100(h0||h20)을 설정합니다.

  5. h0 또는 h20에 해당하는 경우 시뮬레이션이 중지되도록 종료 신호를 구성합니다.

결과로 생성되는 모델은 rlwatertank.slx입니다. 이 모델 및 그 변경에 대한 자세한 내용은 Simulink 강화 학습 환경 만들기 항목을 참조하십시오.

open_system('rlwatertank')

환경 인터페이스 만들기

환경 모델을 만들 때는 다음을 정의해야 합니다.

  • 에이전트가 환경과 상호 작용하기 위해 사용하는 행동 및 관측값 신호. 자세한 내용은 rlNumericSpec 항목과 rlFiniteSetSpec 항목을 참조하십시오.

  • 에이전트가 성공을 측정하기 위해 사용하는 보상 신호. 자세한 내용은 Define Reward Signals 항목을 참조하십시오.

관측값 사양 obsInfo 및 행동 사양 actInfo를 정의합니다.

obsInfo = rlNumericSpec([3 1],...
    'LowerLimit',[-inf -inf 0  ]',...
    'UpperLimit',[ inf  inf inf]');
obsInfo.Name = 'observations';
obsInfo.Description = 'integrated error, error, and measured height';
numObservations = obsInfo.Dimension(1);

actInfo = rlNumericSpec([1 1]);
actInfo.Name = 'flow';
numActions = actInfo.Dimension(1);

환경 인터페이스 객체를 작성합니다.

env = rlSimulinkEnv('rlwatertank','rlwatertank/RL Agent',...
    obsInfo,actInfo);

모델에 대한 참조 값을 무작위화하는 사용자 지정 재설정 함수를 설정합니다.

env.ResetFcn = @(in)localResetFcn(in);

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

Ts = 1.0;
Tf = 200;

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

rng(0)

DDPG 에이전트 만들기

관측값과 행동이 주어진 DDPG 에이전트는 크리틱 가치 함수 표현을 사용하여 장기 보상을 근사합니다. 크리틱을 만들려면 먼저 관측값과 행동에 해당하는 2개의 입력값 및 1개의 출력값을 갖는 심층 신경망을 만드십시오. 심층 신경망 가치 함수 표현을 만드는 방법에 대한 자세한 내용은 Create Policies and Value Functions 항목을 참조하십시오.

statePath = [
    featureInputLayer(numObservations,'Normalization','none','Name','State')
    fullyConnectedLayer(50,'Name','CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(25,'Name','CriticStateFC2')];
actionPath = [
    featureInputLayer(numActions,'Normalization','none','Name','Action')
    fullyConnectedLayer(25,'Name','CriticActionFC1')];
commonPath = [
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1,'Name','CriticOutput')];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

크리틱 신경망 구성을 확인합니다.

figure
plot(criticNetwork)

Figure contains an axes object. The axes object contains an object of type graphplot.

rlRepresentationOptions 객체를 사용하여 크리틱 표현에 대한 옵션을 지정합니다.

criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

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

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},criticOpts);

관측값이 주어진 DDPG 에이전트는 액터 표현을 사용하여 어떤 행동을 수행할지 결정합니다. 액터를 만들려면 먼저 관측값에 해당하는 1개의 입력값 및 행동에 해당하는 1개의 출력값을 갖는 심층 신경망을 만드십시오.

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

actorNetwork = [
    featureInputLayer(numObservations,'Normalization','none','Name','State')
    fullyConnectedLayer(3, 'Name','actorFC')
    tanhLayer('Name','actorTanh')
    fullyConnectedLayer(numActions,'Name','Action')
    ];

actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},actorOptions);

DDPG 에이전트를 만들려면 먼저 rlDDPGAgentOptions 객체를 사용하여 DDPG 에이전트 옵션을 지정하십시오.

agentOpts = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'DiscountFactor',1.0, ...
    'MiniBatchSize',64, ...
    'ExperienceBufferLength',1e6); 
agentOpts.NoiseOptions.Variance = 0.3;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;

그런 다음, 지정된 액터 표현, 크리틱 표현, 에이전트 옵션을 사용하여 DDPG 에이전트를 만듭니다. 자세한 내용은 rlDDPGAgent 항목을 참조하십시오.

agent = rlDDPGAgent(actor,critic,agentOpts);

에이전트 훈련시키기

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

  • 최대 5000개의 에피소드에 대해 각 훈련을 실행합니다. 각 에피소드가 최대 ceil(Tf/Ts)개(즉, 200개)의 시간 스텝 동안 지속되도록 지정합니다.

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

  • 연속되는 20개의 에피소드에서 에이전트가 받은 평균 누적 보상이 800점 이상일 때 훈련을 중지합니다. 이 시점에서 에이전트는 탱크에 있는 물의 수위를 제어할 수 있습니다.

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

maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes, ...
    'MaxStepsPerEpisode',maxsteps, ...
    'ScoreAveragingWindowLength',20, ...
    'Verbose',false, ...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',800);

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

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

훈련된 에이전트 검증하기

모델에 대해 훈련된 에이전트를 시뮬레이션으로 검증합니다.

simOpts = rlSimulationOptions('MaxSteps',maxsteps,'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

참고 항목

관련 항목