Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Simulink 環境の作成とエージェントの学習

この例では、watertank Simulink® モデル内の PI コントローラーを、強化学習用の深層決定方策勾配 (DDPG) エージェントに変換する方法を説明します。MATLAB® で DDPG エージェントに学習させる例については、Compare DDPG Agent to LQR Controller (Reinforcement Learning Toolbox)を参照してください。

貯水槽モデル

この例の元のモデルは貯水槽モデルです。目的はタンク内の水位を制御することです。貯水槽モデルの詳細については、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 です。このモデルおよび変更内容の詳細については、Create Custom Simulink Environments (Reinforcement Learning Toolbox)を参照してください。

open_system("rlwatertank")

環境の作成

次の定義を含む環境モデルを作成します。

  • エージェントが環境を操作するのに使用するアクションと観測値の信号。詳細は、rlNumericSpec (Reinforcement Learning Toolbox)rlFiniteSetSpec (Reinforcement Learning Toolbox)を参照してください。

  • エージェントがその成功度を測定するのに使用する報酬信号。詳細については、Define Reward and Observation Signals in Custom Environments (Reinforcement Learning Toolbox)を参照してください。

観測値の仕様 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")
    ];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,obsPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork, ...
    "obsPathOutLyr","add/in1");
criticNetwork = connectLayers(criticNetwork, ...
    "actPathOutLyr","add/in2");

クリティック ネットワークの構成を表示します。

figure
plot(criticNetwork)

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

ネットワークを dlnetwork オブジェクトに変換し、そのプロパティを要約します。

criticNetwork = dlnetwork(criticNetwork);
summary(criticNetwork)
   Initialized: true

   Number of learnables: 1.5k

   Inputs:
      1   'obsInLyr'   3 features
      2   'actInLyr'   1 features

指定した深層ニューラル ネットワークと環境仕様オブジェクトを使用して、クリティック近似器オブジェクトを作成します。ネットワークの入力を観測値とアクションのチャネルに関連付ける場合は、それらの入力に名前を付けます。

critic = rlQValueFunction(criticNetwork, ...
    obsInfo,actInfo, ...
    ObservationInputNames="obsInLyr", ...
    ActionInputNames="actInLyr");

Q 値関数オブジェクトの詳細については、rlQValueFunction (Reinforcement Learning Toolbox)を参照してください。

観測値とアクションのランダムな入力を使用して、クリティックをチェックします。

getValue(critic, ...
    {rand(obsInfo.Dimension)}, ...
    {rand(actInfo.Dimension)})
ans = single
    -0.1631

クリティックの作成の詳細については、Create Policies and Value Functions (Reinforcement Learning Toolbox)を参照してください。

アクターの作成

DDPG エージェントは、連続行動空間において、パラメーター化された決定論的方策を使用します。この方策は、連続決定論的アクターによって学習されます。

連続決定論的アクターは、連続行動空間に関するパラメーター化された決定論的方策を実装します。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。

パラメーター化された方策をアクター内でモデル化するには、1 つの入力層 (これは、obsInfo で指定された、環境観測チャネルのコンテンツを受け取ります) と 1 つの出力層 (これは、actInfo で指定された、環境アクション チャネルへのアクションを返します) をもつニューラル ネットワークを使用します。

ネットワークを layer オブジェクトの配列として定義します。

actorNetwork = [
    featureInputLayer(obsInfo.Dimension(1))
    fullyConnectedLayer(3)
    tanhLayer
    fullyConnectedLayer(actInfo.Dimension(1))
    ];

ネットワークを dlnetwork オブジェクトに変換し、そのプロパティを要約します。

actorNetwork = dlnetwork(actorNetwork);
summary(actorNetwork)
   Initialized: true

   Number of learnables: 16

   Inputs:
      1   'input'   3 features

指定した深層ニューラル ネットワークと環境仕様オブジェクトを使用して、アクター近似器オブジェクトを作成します。ネットワークの入力を観測値のチャネルに関連付ける場合は、その入力に名前を付けます。

actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);

詳細については、rlContinuousDeterministicActor (Reinforcement Learning Toolbox)を参照してください。

観測値のランダムな入力を使用して、アクターをチェックします。

getAction(actor,{rand(obsInfo.Dimension)})
ans = 1x1 cell array
    {[-0.3408]}

クリティックの作成の詳細については、Create Policies and Value Functions (Reinforcement Learning Toolbox)を参照してください。

DDPG エージェントの作成

指定したアクター近似器オブジェクトとクリティック近似器オブジェクトを使用して、DDPG エージェントを作成します。

agent = rlDDPGAgent(actor,critic);

詳細については、rlDDPGAgent (Reinforcement Learning Toolbox)を参照してください。

ドット表記を使用して、エージェント、アクター、クリティックのオプションを指定します。

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 (Reinforcement Learning Toolbox)オブジェクトを使用してエージェントのオプションを指定することもできます。

観測値のランダムな入力を使用して、エージェントをチェックします。

getAction(agent,{rand(obsInfo.Dimension)})
ans = 1x1 cell array
    {[-0.7926]}

エージェントの学習

エージェントに学習させるには、まず、学習オプションを指定します。この例では、次のオプションを使用します。

  • 各学習を最大 5000 個のエピソードに対して実行。各エピソードを最大 ceil(Tf/Ts) (つまり 200) タイム ステップ持続するよう指定。

  • Episode Manager のダイアログ ボックスに学習の進行状況を表示 (Plots オプションを設定) し、コマンド ラインの表示を無効化 (Verbose オプションを false に設定)。

  • 連続する 20 個を超えるエピソードで 800 を超える平均累積報酬をエージェントが受け取ったときに学習を停止。この時点で、エージェントはタンクの水位を制御できます。

詳細については、rlTrainingOptions (Reinforcement Learning Toolbox)を参照してください。

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

関数 train (Reinforcement Learning Toolbox) を使用して、エージェントに学習させます。学習は計算量が多いプロセスのため、完了するのに数分かかります。この例の実行時間を節約するために、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

学習済みエージェントの検証

シミュレーションを実行し、学習済みエージェントをモデルに対して検証します。リセット関数によって参照値がランダムに変わるため、乱数発生器のシードを固定してシミュレーションに再現性をもたせます。

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

参考

(Reinforcement Learning Toolbox)

関連するトピック