このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
MDP 環境での強化学習エージェントの学習
この例では、一般的なマルコフ決定過程 (MDP) 環境を解決するために Q 学習エージェントに学習させる方法を示します。これらのエージェントの詳細については、Q 学習エージェントを参照してください。
MDP 環境は次のようなグラフです。
ここで、以下となります。
各円は状態を表します。
各状態において、上がる (up) または下がる (down) の判定があります。
エージェントは状態 1 から開始します。
エージェントは、グラフ内の各遷移の値に等しい報酬を受け取ります。
学習の目標は、最大の累積報酬を収集することです。
MDP 環境の作成
8 つの状態と 2 つのアクション ("up" と "down") をもつ MDP モデルを作成します。
MDP = createMDP(8,["up";"down"]);
上のグラフからの遷移をモデル化するには、MDP の状態遷移行列と報酬行列を変更します。既定では、これらの行列にはゼロが格納されています。MDP モデルと MDP オブジェクトのプロパティの作成の詳細については、createMDP
を参照してください。
MDP の状態遷移行列と報酬行列を指定します。たとえば、以下のコマンドのようにします。
最初の 2 行は、アクション
1
("up") を実行することによる状態 1 から状態 2 への遷移と、この遷移に対する +3 の報酬を指定する。次の 2 行は、アクション
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;
MDP の終了状態として状態 "s7"
と状態 "s8"
を指定します。
MDP.TerminalStates = ["s7";"s8"];
このプロセス モデルの強化学習 MDP 環境を作成します。
env = rlMDPEnv(MDP);
エージェントの初期状態が常に状態 1 になるように指定するには、エージェントの初期状態を返すリセット関数を指定します。この関数は、各学習エピソードとシミュレーションの開始時に呼び出されます。初期状態を 1 に設定する無名関数ハンドルを作成します。
env.ResetFcn = @() 1;
再現性をもたせるために、乱数発生器のシードを固定します。
rng(0)
Q 学習エージェントの作成
Q 学習エージェントを作成するには、まず MDP 環境からの観測仕様とアクション仕様を使用して Q テーブルを作成します。この表現の学習率を 1
に設定します。
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); qTable = rlTable(obsInfo, actInfo); qFunction = rlQValueFunction(qTable, obsInfo, actInfo); qOptions = rlOptimizerOptions(LearnRate=1);
次に、このテーブル表現を使用して Q 学習エージェントを作成し、ε-greedy 探索を構成します。Q 学習エージェントの作成の詳細については、rlQAgent
およびrlQAgentOptions
を参照してください。
agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
agentOpts.CriticOptimizerOptions = qOptions;
qAgent = rlQAgent(qFunction,agentOpts); %#ok<NASGU>
Q 学習エージェントの学習
エージェントに学習させるには、まず、学習オプションを指定します。この例では、次のオプションを使用します。
最大 500 個のエピソードについて学習 (各エピソードは最大 50 タイム ステップ持続)。
連続する 30 個を超えるエピソードで 10 を超える平均累積報酬をエージェントが受け取ったときに学習を停止。
詳細については、rlTrainingOptions
を参照してください。
trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;
関数 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 学習の結果の検証
学習結果を検証するには、関数sim
を使用して、学習環境でエージェントをシミュレーションします。エージェントが最適なパスを見つけることに成功し、累積報酬は 13
になります。
Data = sim(qAgent,env); cumulativeReward = sum(Data.Reward)
cumulativeReward = 13
割引係数が 1
に設定されているため、学習済みエージェントの Q テーブルの値は、環境の割引されていない収益と一致します。
QTable = getLearnableParameters(getCritic(qAgent)); QTable{1}
ans = 8x2 single matrix
12.9914 6.4122
0.4115 9.9948
9.8946 8.7794
10.8234 -4.2250
0.8819 8.9975
4.3494 3.3191
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