DDPGエージェントをトレーニングして、デュアルインテグレーターシステムを制御します
この例は、MATLAB®でモデル化された2次動的システムを制御するためにDeep Deterministic Policy Gradient(DDPG)エージェントをトレーニングする方法を示しています。
DDPGエージェントの詳細については、Deep Deterministic Strategy GradientAgentを参照してください。Simulink®でDDPGエージェントをトレーニングする方法を示す例については、DDPGエージェントバランス振り子のトレーニングを参照してください。
ダブルインテグレーターのMATLAB環境
この例の強化学習環境は、ゲインのある2次のデュアルインテグレーターシステムです。トレーニングの目標は、力の入力を適用することにより、2次システムでの媒体の位置を制御することです。
この環境の場合:
- 4〜4ユニットの初期位置から開始します。
- 媒体から環境への力信号は2〜2Nです。
- 環境から観察されるのは、質量の位置と速度です。
- 質量が元の位置から5メートル以上移動した場合、またはx <0.01の場合、エピソードは終了します。
- 各ステップで提供される報酬r(t)は、r(t)の離散化です。
ここに:
-
xは品質の状態ベクトルです。
-
uは媒体に加えられる力です。
-
Qは制御性能の重みです; Q = [10 0; 01]。
-
Rは制御効果の重みです。R= 0.01。
環境インターフェースの作成
デュアルインテグレーターシステム用に事前定義された環境インターフェースを作成します。
env = rlPredefinedEnv("DoubleIntegrator-Continuous")
env.MaxForce = Inf;
インターフェイスには、エージェントが-InfからInfまでの力の値を媒体に適用できる連続アクションスペースがあります。
環境インターフェースから観察と行動の情報を取得します。
obsInfo = getObservationInfo(env);
numObservations = obsInfo.Dimension(1);
actInfo = getActionInfo(env);
numActions = numel(actInfo);
固定ランダムジェネレータシードの再現性。
rng(0)
DDPGエージェントを作成する
DDPGエージェントは、コメンター値関数表記を使用して、特定の観測と操作に基づいて長期的な報酬を推定します。コメント投稿者を作成するには、最初に2つの入力(状態とアクション)と1つの出力を持つディープニューラルネットワークを作成する必要があります。ニューラルネットワークの値関数表現の作成の詳細については、「戦略と値関数表現の作成」を参照してください。
statePath = imageInputLayer([numObservations 1 1],'Normalization','none','Name','state');
actionPath = imageInputLayer([numActions 1 1],'Normalization','none','Name','action');
commonPath = [concatenationLayer(1,2,'Name','concat')
quadraticLayer('Name','quadratic')
fullyConnectedLayer(1,'Name','StateValue','BiasLearnRateFactor',0,'Bias',0)];
criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,'state','concat/in1');
criticNetwork = connectLayers(criticNetwork,'action','concat/in2');
コメント投稿者のネットワーク構成を確認してください。
figure
plot(criticNetwork)
rlRepresentationOptionsを使用して、レビュー担当者が表すオプションを指定します。
criticOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);
指定されたニューラルネットワークとオプションを使用して、コメンター表現を作成します。また、環境インターフェースから取得したレビューアの操作および観察情報を指定する必要があります。詳細については、rlQValueRepresentationを参照してください。
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{
'state'},'Action',{
'action'},criticOpts);
DDPGエージェントは、アクター表現を使用して、(指定された観測で)実行するアクションを決定します。アクターを作成するには、最初に1つの入力(観測)と1つの出力(アクション)を持つディープニューラルネットワークを作成する必要があります。
コメント投稿者と同様の方法でアクターを作成します。
actorNetwork = [
imageInputLayer([numObservations 1 1],'Normalization','none','Name','state')
fullyConnectedLayer(numActions,'Name','action','BiasLearnRateFactor',0,'Bias',0)];
actorOpts = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{
'state'},'Action',{
'action'},actorOpts);
DDPGエージェントを作成するには、最初にrlDDPGAgentOptionsを使用してDDPGエージェントオプションを指定します。
agentOpts = rlDDPGAgentOptions(...
'SampleTime',env.Ts,...
'TargetSmoothFactor',1e-3,...
'ExperienceBufferLength',1e6,...
'DiscountFactor',0.99,...
'MiniBatchSize',32);
agentOpts.NoiseOptions.Variance = 0.3;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-6;
指定されたコメンター表現、コメンター表現、およびエージェントオプションを使用して、DDPGエージェントを作成します。詳細については、rlDDPGAgentを参照してください。
agent = rlDDPGAgent(actor,critic,agentOpts);
トレーニングエージェント
エージェントをトレーニングするには、最初にトレーニングオプションを指定します。この例では、次のオプションを使用します。
-
トレーニングセッションで最大1000エピソードを実行し、各エピソードは最大200タイムステップ続きます。
-
[プロットマネージャー]ダイアログボックスにトレーニングの進行状況を表示し([プロット]オプションを設定)、コマンドライン表示を無効にします([詳細]オプションを設定します)。
-
エージェントが受け取った移動平均累積報酬が–66を超える場合は、トレーニングを停止してください。この時点で、エージェントは最小の制御力でマスの位置を制御できます。
詳細については、rlTrainingOptionsを参照してください。
trainOpts = rlTrainingOptions(...
'MaxEpisodes', 5000, ...
'MaxStepsPerEpisode', 200, ...
'Verbose', false, ...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',-66);
描画機能を使用して、トレーニングまたはシミュレーション中にデュアルインテグレータ環境を視覚化できます。
plot(env)
トレーニング機能を使用して、エージェントをトレーニングします。このエージェントのトレーニングは、計算量の多いプロセスであり、完了するまでに多くの時間がかかります。この例の実行時間を節約するには、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('DoubleIntegDDPG.mat','agent');
end
DDPGエージェントシミュレーション
トレーニングされたエージェントのパフォーマンスを検証するには、デュアルインテグレーター環境でシミュレートします。エージェントシミュレーションの詳細については、rlSimulationOptionsおよびsimを参照してください。
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)