MDP 환경에서 강화 학습 에이전트 훈련시키기
이 예제에서는 일반 마르코프 결정 과정(MDP) 환경을 풀도록 Q-러닝 에이전트를 훈련시키는 방법을 보여줍니다. 이러한 에이전트에 대한 자세한 내용은 Q-러닝 에이전트 항목을 참조하십시오.
이 MDP 환경은 다음과 같은 그래프를 가집니다.
여기서 각 요소는 다음과 같습니다.
각 원은 상태를 나타냅니다.
각 상태에는 올라가는(up) 결정이나 내려가는(down) 결정이 있습니다.
에이전트는 상태 1부터 시작합니다.
에이전트는 그래프의 각 천이에 해당하는 값과 동일한 보상을 받습니다.
훈련 목표는 누적 보상을 최대한으로 모으는 것입니다.
재현이 가능하도록 난수 스트림 고정하기
예제 코드의 다양한 단계에서 난수 계산이 포함될 수 있습니다. 예제 코드에 있는 다양한 섹션의 시작 부분에서 난수 스트림을 고정하면 매 실행 시에 섹션의 난수열이 유지되며 결과를 재현할 가능성이 높아집니다. 자세한 내용은 결과 재현성 항목을 참조하십시오. 시드값 0
과 난수 알고리즘인 메르센 트위스터를 사용하여 난수 스트림을 고정합니다. 난수 생성에 사용되는 시드값을 제어하는 방법에 대한 자세한 내용은 rng
항목을 참조하십시오.
previousRngState = rng(0,"twister");
출력값 previousRngState
는 스트림의 이전 상태에 대한 정보를 포함하는 구조체입니다. 이 예제의 끝부분에서 그 상태를 복원할 것입니다.
MDP 환경 만들기
8개의 상태와 2개의 행동("up" 및 "down")을 갖는 MDP 모델을 만듭니다.
MDP = createMDP(8,["up";"down"]);
위 그래프의 천이를 모델링하기 위해, MDP의 상태 천이 행렬과 보상 행렬을 수정합니다. 기본적으로 이러한 행렬은 0을 포함합니다. MDP 모델 생성과 MDP 객체의 속성에 대한 자세한 내용은 createMDP
항목을 참조하십시오.
MDP의 상태 천이 행렬과 보상 행렬을 지정합니다. 예를 들어, 아래 명령에서 다음과 같이 지정합니다.
첫 두 줄은 행동
1
("up")을 취하여 상태 1에서 상태 2로 천이하도록 지정하고 이 천이에 대해 보상 +3을 지정합니다.다음 두 줄은 행동
2
("down")를 취하여 상태 1에서 상태 3으로 천이하도록 지정하고 이 천이에 대해 보상 +1을 지정합니다.
MDP.T(1,2,1) = 1; MDP.R(1,2,1) = 3; MDP.T(1,3,2) = 1; MDP.R(1,3,2) = 1;
이와 비슷하게 이 그래프의 나머지 규칙에 대해서도 상태 천이와 보상을 지정합니다.
% State 2 transition and reward MDP.T(2,4,1) = 1; MDP.R(2,4,1) = 2; MDP.T(2,5,2) = 1; MDP.R(2,5,2) = 1; % State 3 transition and reward MDP.T(3,5,1) = 1; MDP.R(3,5,1) = 2; MDP.T(3,6,2) = 1; MDP.R(3,6,2) = 4; % State 4 transition and reward MDP.T(4,7,1) = 1; MDP.R(4,7,1) = 3; MDP.T(4,8,2) = 1; MDP.R(4,8,2) = 2; % State 5 transition and reward MDP.T(5,7,1) = 1; MDP.R(5,7,1) = 1; MDP.T(5,8,2) = 1; MDP.R(5,8,2) = 9; % State 6 transition and reward MDP.T(6,7,1) = 1; MDP.R(6,7,1) = 5; MDP.T(6,8,2) = 1; MDP.R(6,8,2) = 1; % State 7 transition and reward MDP.T(7,7,1) = 1; MDP.R(7,7,1) = 0; MDP.T(7,7,2) = 1; MDP.R(7,7,2) = 0; % State 8 transition and reward MDP.T(8,8,1) = 1; MDP.R(8,8,1) = 0; MDP.T(8,8,2) = 1; MDP.R(8,8,2) = 0;
상태 "s7"
과 "s8"
을 MDP의 종료 상태로 지정합니다.
MDP.TerminalStates = ["s7";"s8"];
이 과정 모델에 대해 강화 학습 MDP 환경을 만듭니다.
env = rlMDPEnv(MDP);
에이전트의 초기 상태가 항상 상태 1로 지정되도록 초기 에이전트 상태를 반환하는 재설정 함수를 지정합니다. 이 함수는 매 훈련 에피소드 및 시뮬레이션이 시작될 때 호출됩니다. 초기 상태를 1로 설정하는 익명 함수 핸들을 만듭니다.
env.ResetFcn = @() 1;
Q-러닝 에이전트 만들기
Q-러닝 에이전트를 만들기 위해, 먼저 MDP 환경의 관측값과 행동 사양을 사용하여 Q 테이블 모델을 만듭니다. 테이블 모델의 학습률을 0.1로 설정합니다.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); qTable = rlTable(obsInfo, actInfo);
그런 다음, 테이블 모델에서 Q-값 크리틱 함수를 생성합니다.
qFunction = rlQValueFunction(qTable, obsInfo, actInfo);
마지막으로, 이 크리틱 함수를 사용하여 Q-러닝 에이전트를 만듭니다. 이 훈련의 경우 다음이 적용됩니다.
감가되지 않은 장기 보상을 선호하도록 감가 인자를 1.0으로 지정합니다.
에이전트의 엡실론 그리디 탐색 모델에 대한 초기 엡실론 값을 0.9로 지정합니다.
엡실론 파라미터의 감쇠율을 1e-3으로, 최솟값을 0.1로 지정합니다. 점진적으로 탐색을 감쇠시키면 에이전트가 훈련의 후반 단계로 갈수록 그리디 정책을 더욱 활용할 수 있습니다.
SGDM(Stochastic Gradient Descent with Momentum: 모멘텀을 사용한 확률적 경사하강법) 알고리즘을 사용하고 학습률을 0.1로 지정하여 테이블 모델을 업데이트합니다.
L2 정규화 인자 0을 사용합니다. 이 예제에서 정규화를 비활성화하면 감가되지 않은 장기 보상을 더 잘 추정할 수 있습니다.
agentOpts = rlQAgentOptions; agentOpts.DiscountFactor = 1; agentOpts.EpsilonGreedyExploration.Epsilon = 0.9; agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1e-3; agentOpts.EpsilonGreedyExploration.EpsilonMin = 0.1; agentOpts.CriticOptimizerOptions = rlOptimizerOptions( ... Algorithm="sgdm", ... LearnRate=0.1, ... L2RegularizationFactor=0); qAgent = rlQAgent(qFunction,agentOpts);
Q-러닝 에이전트를 만드는 방법에 대한 자세한 내용은 rlQAgent
항목 및 rlQAgentOptions
항목을 참조하십시오.
Q-러닝 에이전트 훈련시키기
에이전트를 훈련시키려면 먼저 훈련 옵션을 지정하십시오. 이 예제에서는 다음 옵션을 사용합니다.
400개의 에피소드에 대해 훈련시키며, 각 에피소드마다 최대 50개의 시간 스텝이 지속됩니다.
에피소드 보상의 평균을 계산하기 위해 윈도우 길이를 30으로 지정합니다.
훈련 옵션에 대한 자세한 내용은 rlTrainingOptions
항목을 참조하십시오.
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 400;
trainOpts.ScoreAveragingWindowLength = 30;
trainOpts.StopTrainingCriteria = "none";
재현이 가능하도록 난수 스트림을 고정합니다.
rng(0,"twister");
train
함수를 사용하여 에이전트를 훈련시킵니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다. 이 예제를 실행하는 동안 시간을 절약하려면 doTraining
을 false
로 설정하여 사전 훈련된 에이전트를 불러오십시오. 에이전트를 직접 훈련시키려면 doTraining
을 true
로 설정하십시오.
doTraining =false; if doTraining % Train the agent. trainingStats = train(qAgent,env,trainOpts); %#ok<UNRCH> else % Load pretrained agent for the example. load("genericMDPQAgent.mat","qAgent"); end
Q-러닝 결과 검증하기
재현이 가능하도록 난수 스트림을 고정합니다.
rng(0,"twister");
훈련 결과를 검증하기 위해 sim
함수를 사용하여 훈련 환경에서 에이전트를 시뮬레이션합니다. 에이전트는 누적 보상이 13
인 최적 경로를 성공적으로 찾습니다.
Data = sim(qAgent,env); cumulativeReward = sum(Data.Reward)
cumulativeReward = 13
감가 인자가 1
로 설정되어 있으므로 훈련된 에이전트의 Q 테이블 값은 환경의 감가되지 않은 리턴값과 일치합니다.
QTable = getLearnableParameters(getCritic(qAgent)); QTable{1}
ans = 8×2 single matrix
13.0000 12.0000
5.0000 10.0000
11.0000 9.0000
3.0000 2.0000
1.0000 9.0000
5.0000 1.0000
0 0
0 0
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
TrueTableValues = 8×2
13 12
5 10
11 9
3 2
1 9
5 1
0 0
0 0