Simulink 環境の作成とエージェントの学習
この例では、watertank
Simulink® モデル内の PI コントローラーを、強化学習用の深層決定論的方策勾配 (DDPG) エージェントに変換する方法を説明します。MATLAB® で DDPG エージェントに学習させる例については、Compare DDPG Agent to LQR Controllerを参照してください。
貯水槽モデル
この例の元のモデルは貯水槽モデルです。目的はタンク内の水位を制御することです。貯水槽モデルの詳細については、watertank Simulink モデル (Simulink Control Design)を参照してください。
元のモデルに対して次の変更を加えます。
PID Controller を削除します。
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 値関数クリティックは、現在の観測値とアクションを入力として取り、単一のスカラーを出力として返します (状態からのアクションの受け取りに関する割引累積長期報酬の推定値は、現在の観測値に対応し、その後の方策に従います)。
パラメーター化された Q 値関数をクリティック内でモデル化するには、2 つの入力層 (そのうち 1 つは obsInfo
で指定された観測チャネル用で、もう 1 つは actInfo
で指定されたアクション チャネル用) と 1 つの出力層 (これはスカラー値を返します) をもつニューラル ネットワークを使用します。
各ネットワーク パスを 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") ]; % Create the network object and add the layers criticNet = dlnetwork(); criticNet = addLayers(criticNet,obsPath); criticNet = addLayers(criticNet,actPath); criticNet = addLayers(criticNet,commonPath); % Connect the layers criticNet = connectLayers(criticNet, ... "obsPathOutLyr","add/in1"); criticNet = connectLayers(criticNet, ... "actPathOutLyr","add/in2");
クリティック ネットワークの構成を表示します。
plot(criticNet)
dlnetwork
オブジェクトを初期化し、そのプロパティを要約します。
criticNet = initialize(criticNet); summary(criticNet)
Initialized: true Number of learnables: 1.5k Inputs: 1 'obsInLyr' 3 features 2 'actInLyr' 1 features
指定した深層ニューラル ネットワークと環境仕様オブジェクトを使用して、クリティック近似器オブジェクトを作成します。ネットワークの入力を観測値とアクションのチャネルに関連付ける場合は、それらの入力に名前を付けます。
critic = rlQValueFunction(criticNet, ... 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 エージェントは、連続行動空間において、パラメーター化された決定論的方策を使用します。この方策は、連続決定論的アクターによって学習されます。
連続決定論的アクターは、連続行動空間に関するパラメーター化された決定論的方策を実装します。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。
パラメーター化された方策をアクター内でモデル化するには、1 つの入力層 (これは、obsInfo
で指定された、環境観測チャネルのコンテンツを受け取ります) と 1 つの出力層 (これは、actInfo
で指定された、環境アクション チャネルへのアクションを返します) をもつニューラル ネットワークを使用します。
ネットワークを layer オブジェクトの配列として定義します。
actorNet = [ featureInputLayer(obsInfo.Dimension(1)) fullyConnectedLayer(3) tanhLayer fullyConnectedLayer(actInfo.Dimension(1)) ];
ネットワークを dlnetwork
オブジェクトに変換し、そのプロパティを要約します。
actorNet = dlnetwork(actorNet); summary(actorNet)
Initialized: true Number of learnables: 16 Inputs: 1 'input' 3 features
指定した深層ニューラル ネットワークと環境仕様オブジェクトを使用して、アクター近似器オブジェクトを作成します。ネットワークの入力を観測値のチャネルに関連付ける場合は、その入力に名前を付けます。
actor = rlContinuousDeterministicActor(actorNet,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) タイム ステップ持続するよう指定。Episode Manager のダイアログ ボックスに学習の進行状況を表示 (
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