Main Content

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

滑走ロボットを制御するための DDPG エージェントの学習

この例では、Simulink® でモデル化された、2 次元平面上を摩擦なしで滑走するロボット用の軌跡を生成するために、深層決定方策勾配 (DDPG) エージェントに学習させる方法を説明します。DDPG エージェントの詳細については、Deep Deterministic Policy Gradient (DDPG) Agents (Reinforcement Learning Toolbox)を参照してください。

飛行ロボット モデル

この例の強化学習環境は、半径 15 m のリング上のランダムな位置を初期状態とする滑走ロボットです。ロボットの向きもランダム化されます。ロボットには、その推進と操縦に使用される 2 つの推進機が本体側面に取り付けられています。学習の目標は、ロボットをその初期状態から原点まで駆動して東を向かせることです。

モデルを開きます。

mdl = "rlFlyingRobotEnv";
open_system(mdl)

モデルの初期状態の変数を設定します。

theta0 = 0;
x0 = -15;
y0 = 0;

サンプル時間 Ts とシミュレーション期間 Tf を定義します。

Ts = 0.4;
Tf = 30;

このモデルの場合、次のようにします。

  • 目標の向きは 0 rad とする (ロボットが東を向く)。

  • 各アクチュエータの推力は、-1 ~ 1 N の範囲に制限する

  • 環境からの観測値は、ロボットの位置、向き (向きの正弦と余弦)、速度、および角速度とする。

  • 各タイム ステップで与えられる報酬 rt は次のとおりとする。

r1=10((xt2+yt2+θt2)<0.5)

r2=-100(|xt|20|||yt|20)

r3=-(0.2(Rt-1+Lt-1)2+0.3(Rt-1-Lt-1)2+0.03xt2+0.03yt2+0.02θt2)

rt=r1+r2+r3

ここで、

  • xt は、x 軸上のロボットの位置。

  • yt は、y 軸上のロボットの位置。

  • θ t は、ロボットの向き。

  • Lt-1 は、左の推進機からの制御操作。

  • Rt-1 は、右の推進機からの制御操作。

  • r1 は、ロボットが目標に近づいた時の報酬。

  • r2 は、ロボットが x 方向または y 方向に 20 m を超えて移動したときのペナルティ。シミュレーションは r2<0 となったときに終了。

  • r3 は、目標からの距離と制御操作に課される QR のペナルティ。

統合されたモデルの作成

FlyingRobotEnv モデル用のエージェントに学習させるには、関数 createIntegratedEnv を使用して、学習用に準備された RL Agent ブロックを含む Simulink モデルを自動生成します。

integratedMdl = "IntegratedFlyingRobot";
[~,agentBlk,obsInfo,actInfo] = ...
    createIntegratedEnv(mdl,integratedMdl);

アクションと観測値

環境オブジェクトを作成する前に、観測値とアクションの仕様の名前を指定し、推進アクションの範囲を -1 ~ 1 に制限します。

この環境の観測ベクトルは [xyx˙y˙sin(θ )cos(θ)θ ˙]T です。環境の観測チャネルに名前を割り当てます。

obsInfo.Name = "observations";

この環境のアクション ベクトルは [TRTL]T です。環境のアクション チャネルに、名前および上限と下限を割り当てます。

actInfo.Name = "thrusts";
actInfo.LowerLimit = -ones(prod(actInfo.Dimension),1);
actInfo.UpperLimit =  ones(prod(actInfo.Dimension),1);

prod(obsInfo.Dimension) および prod(actInfo.Dimension) は、行ベクトル、列ベクトル、行列のいずれによって構成されているかにかかわらず、それぞれ観測値と行動空間の次元の数を返すことに注意してください。

環境オブジェクトの作成

統合された Simulink モデルを使用して環境オブジェクトを作成します。

env = rlSimulinkEnv( ...
    integratedMdl, ...
    agentBlk, ...
    obsInfo, ...
    actInfo);

リセット関数

半径 15 m のリングに沿ってロボットの初期の位置をランダム化し、初期の向きもランダム化する、カスタムのリセット関数を作成します。リセット関数の詳細については、flyingRobotResetFcn を参照してください。

env.ResetFcn = @(in) flyingRobotResetFcn(in);

再現性をもたせるために、乱数発生器のシードを固定します。

rng(0)

DDPG エージェントの作成

DDPG エージェントは、パラメーター化された Q 値関数近似器を使用して方策の価値を推定します。Q 値関数クリティックは、現在の観測値とアクションを入力として取り、単一のスカラーを出力として返します (状態からのアクションが与えられた割引累積長期報酬の推定値は、現在の観測値に対応し、その後の方策に従います)。

パラメーター化された Q 値関数をクリティック内でモデル化するには、2 つの入力層 (そのうち 1 つは obsInfo で指定された観測チャネル用で、もう 1 つは actInfo で指定されたアクション チャネル用) と 1 つの出力層 (これはスカラー値を返します) をもつニューラル ネットワークを使用します。

各ネットワーク パスを layer オブジェクトの配列として定義します。各パスの入力層と出力層に名前を割り当てます。これらの名前を使用すると、パスを接続してから、ネットワークの入力層と出力層に適切な環境チャネルを明示的に関連付けることができます。

% Specify the number of outputs for the hidden layers.
hiddenLayerSize = 100; 

% Define observation path layers
observationPath = [
    featureInputLayer( ...
        prod(obsInfo.Dimension),Name="obsInLyr")
    fullyConnectedLayer(hiddenLayerSize)
    reluLayer
    fullyConnectedLayer(hiddenLayerSize)
    additionLayer(2,Name="add")
    reluLayer
    fullyConnectedLayer(hiddenLayerSize)
    reluLayer
    fullyConnectedLayer(1,Name="fc4")
    ];

% Define action path layers
actionPath = [
    featureInputLayer( ...
        prod(actInfo.Dimension), ...
        Name="actInLyr")
    fullyConnectedLayer(hiddenLayerSize,Name="fc5")
    ];

% Create the layer graph.
criticNetwork = layerGraph(observationPath);
criticNetwork = addLayers(criticNetwork,actionPath);

% Connect actionPath to observationPath.
criticNetwork = connectLayers(criticNetwork,"fc5","add/in2");

% Create dlnetwork from layer graph
criticNetwork = dlnetwork(criticNetwork);

% Display the number of parameters
summary(criticNetwork)
   Initialized: true

   Number of learnables: 21.4k

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

criticNetwork、環境仕様、および観測チャネルとアクション チャネルに接続するネットワーク入力層の名前を使用して、クリティックを作成します。詳細については、rlQValueFunction (Reinforcement Learning Toolbox)を参照してください。

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

DDPG エージェントは、連続行動空間において、パラメーター化された決定論的方策を使用します。この方策は、連続決定論的アクターによって学習されます。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。

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

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

actorNetwork = [
    featureInputLayer(prod(obsInfo.Dimension))
    fullyConnectedLayer(hiddenLayerSize)
    reluLayer
    fullyConnectedLayer(hiddenLayerSize)
    reluLayer
    fullyConnectedLayer(hiddenLayerSize)
    reluLayer
    fullyConnectedLayer(prod(actInfo.Dimension))
    tanhLayer
    ];

layer オブジェクトの配列を dlnetwork オブジェクトに変換し、パラメーターの数を表示します。

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

   Number of learnables: 21.2k

   Inputs:
      1   'input'   7 features

actorNetwork、およびアクション チャネルと観測チャネルの仕様を使用して、アクターを定義します。詳細については、rlContinuousDeterministicActor (Reinforcement Learning Toolbox)を参照してください。

actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);

rlOptimizerOptions (Reinforcement Learning Toolbox)を使用して、クリティックとアクターのオプションを指定します。

criticOptions = rlOptimizerOptions(LearnRate=1e-03,GradientThreshold=1);
actorOptions = rlOptimizerOptions(LearnRate=1e-04,GradientThreshold=1);

rlDDPGAgentOptions (Reinforcement Learning Toolbox)を使用して、DDPG エージェントのオプション (アクターとクリティックの学習オプションなど) を指定します。

agentOptions = rlDDPGAgentOptions(...
    SampleTime=Ts,...
    ActorOptimizerOptions=actorOptions,...
    CriticOptimizerOptions=criticOptions,...
    ExperienceBufferLength=1e6 ,...
    MiniBatchSize=256);
agentOptions.NoiseOptions.Variance = 1e-1;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;

次に、アクター、クリティック、およびエージェントのオプションを使用して、エージェントを作成します。詳細については、rlDDPGAgent (Reinforcement Learning Toolbox)を参照してください。

agent = rlDDPGAgent(actor,critic,agentOptions);

または、最初にエージェントを作成してから、ドット表記を使用してそのオプション オブジェクトにアクセスしてオプションを変更することもできます。

エージェントの学習

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

  • 最大 20000 個のエピソードについて、それぞれ学習を実行 (各エピソードは最大 ceil(Tf/Ts) タイム ステップ持続)。

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

  • 連続する 10 個を超えるエピソードで 415 を超える平均累積報酬をエージェントが受け取ったときに学習を停止。この時点で、エージェントは滑走ロボットを目標位置に駆動できる。

  • 累積報酬が 415 を超える各エピソードについてエージェントのコピーを保存。

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

maxepisodes = 20000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    MaxEpisodes=maxepisodes,...
    MaxStepsPerEpisode=maxsteps,...
    StopOnError="on",...
    Verbose=false,...
    Plots="training-progress",...
    StopTrainingCriteria="AverageReward",...
    StopTrainingValue=415,...
    ScoreAveragingWindowLength=10,...
    SaveAgentCriteria="EpisodeReward",...
    SaveAgentValue=415); 

関数 train (Reinforcement Learning Toolbox) を使用して、エージェントに学習させます。学習は計算量が多いプロセスのため、完了するのに数時間かかります。この例の実行時間を節約するために、doTrainingfalse に設定して事前学習済みのエージェントを読み込みます。エージェントに学習させるには、doTrainingtrue に設定します。

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainingOptions);
else
    % Load the pretrained agent for the example.
    load("FlyingRobotDDPG.mat","agent")
end

DDPG エージェントのシミュレーション

学習済みエージェントの性能を検証するには、環境内でこのエージェントをシミュレートします。エージェントのシミュレーションの詳細については、rlSimulationOptions (Reinforcement Learning Toolbox) および sim (Reinforcement Learning Toolbox) を参照してください。

simOptions = rlSimulationOptions(MaxSteps=maxsteps);
experience = sim(env,agent,simOptions);

Figure Flying Robot Visualizer contains an axes object. The axes object contains 3 objects of type quiver, patch, line.

参考

(Reinforcement Learning Toolbox) | (Reinforcement Learning Toolbox)

関連するトピック