メインコンテンツ

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

rlDDPGAgent

深層決定論的方策勾配 (DDPG) 強化学習エージェント

説明

深層決定論的方策勾配 (DDPG) アルゴリズムは、連続行動空間をもつ環境向けの Off-Policy actor-critic 手法です。DDPG エージェントは、決定論的方策を学習すると同時に、Q 値関数クリティックを使用して最適な方策の値を推定します。ターゲット アクターおよびターゲット クリティックに加え、経験バッファーを備えています。DDPG エージェントは、オフライン学習 (環境なしで保存されたデータからの学習) をサポートします。

詳細については、深層決定論的方策勾配 (DDPG) エージェントを参照してください。さまざまな種類の強化学習エージェントの詳細については、強化学習エージェントを参照してください。

作成

説明

観測仕様とアクション仕様からのエージェントの作成

agent = rlDDPGAgent(observationInfo,actionInfo) は、既定の初期化オプションを使用して、指定された観測仕様とアクション仕様をもつ環境用の深層決定論的方策勾配エージェントを作成します。エージェント内のアクターとクリティックは、観測仕様 observationInfo とアクション仕様 actionInfo から構築された既定の深層ニューラル ネットワークを使用します。agentObservationInfo プロパティと ActionInfo プロパティは、それぞれ observationInfo 入力引数と actionInfo 入力引数に設定されます。

agent = rlDDPGAgent(observationInfo,actionInfo,initOpts) は、指定された観測仕様とアクション仕様をもつ環境用の深層決定論的方策勾配エージェントを作成します。エージェントは、initOpts オブジェクトで指定されたオプションを使用して構成された既定のネットワークを使用します。初期化オプションの詳細については、rlAgentInitializationOptions を参照してください。

アクターとクリティックからのエージェントの作成

agent = rlDDPGAgent(actor,critic,agentOptions) は、既定の DDPG エージェント オプションを使用して、指定されたアクターとクリティックをもつ DDPG エージェントを作成します。

エージェント オプションの指定

agent = rlDDPGAgent(___,agentOptions) は、DDPG エージェントを作成し、AgentOptions プロパティを agentOptions 入力引数に設定します。この構文は、前の構文にある任意の入力引数の後に使用します。

入力引数

すべて展開する

エージェント初期化オプション。rlAgentInitializationOptions オブジェクトとして指定します。

アクター。rlContinuousDeterministicActor として指定します。アクターの作成の詳細については、Create Policies and Value Functionsを参照してください。

クリティック。rlQValueFunction オブジェクトとして指定します。クリティックの作成の詳細については、Create Policies and Value Functionsを参照してください。

プロパティ

すべて展開する

観測仕様。rlFiniteSetSpec オブジェクトまたは rlNumericSpec オブジェクト、あるいはそれらのオブジェクトが混在する配列として指定します。配列内の各要素は、その次元、データ型、名前などの環境観測チャネルのプロパティを定義します。

アクターまたはクリティックを指定してエージェントを作成すると、ObservationInfo の値は、アクター オブジェクトおよびクリティック オブジェクトで指定された値と同じになります。既定のエージェントを作成すると、エージェント コンストラクター関数によって ObservationInfo プロパティが入力引数 observationInfo に設定されます。

getObservationInfo を使用して、既存の環境、関数近似器、またはエージェントから observationInfo を抽出できます。rlFiniteSetSpec または rlNumericSpec を使用して仕様を手動で構築することもできます。

例: [rlNumericSpec([2 1]) rlFiniteSetSpec([3,5,7])]

アクション仕様。rlNumericSpec オブジェクトとして指定します。このオブジェクトは、環境アクション チャネルのプロパティ (サイズ、データ型、名前など) を定義します。

メモ

このエージェントでは、1 つのアクション チャネルのみが許可されます。

アクターとクリティックを指定してエージェントを作成すると、ActionInfo の値は、アクター オブジェクトおよびクリティック オブジェクトで指定された値と同じになります。既定のエージェントを作成すると、エージェント コンストラクター関数によって ActionInfo プロパティが入力引数 ActionInfo に設定されます。

getActionInfo を使用して、既存の環境、関数近似器、またはエージェントから actionInfo を抽出できます。rlNumericSpec を使用して仕様を手動で構築することもできます。

例: rlNumericSpec([2 1])

エージェントのオプション。rlDDPGAgentOptions オブジェクトとして指定します。

再帰型ニューラル ネットワークを使用する既定のアクターとクリティックをもつ DDPG エージェントを作成する場合、AgentOptions.SequenceLength の既定値は 32 になります。

経験バッファー。次のリプレイ メモリ オブジェクトのいずれかとして指定します。

メモ

再帰型ニューラル ネットワークを使用するエージェントは、rlReplayMemory バッファーと rlHindsightReplayMemory バッファーのみをサポートします。

学習が実行されている間、エージェントはそれぞれの経験 (SARS'D) をバッファーに保存します。ここで、以下となります。

  • S は環境の現在の観測値です。

  • A はエージェントによって実行されるアクションです。

  • R はアクション A を実行したことに対する報酬です。

  • S' はアクション A を実行した後の次の観測値です。

  • D はアクション A を実行した後の is-done 信号です。

次に、エージェントはバッファーから経験のミニバッチをサンプリングし、これらのミニバッチを使用してアクターとクリティックの関数近似器を更新します。

シミュレーション中または展開後のアクション選択時に探索方策を使用するオプション。logical 値として指定します。

  • true — エージェントを sim 関数および generatePolicyFunction 関数で使用するときに、基本のエージェント探索方策を使用するには、この値を指定します。具体的には、この場合にエージェントは rlAdditiveNoisePolicy オブジェクトを使用します。アクションの選択にはランダムな要素があるため、エージェントは行動空間と観測空間を探索します。

  • false — エージェントを sim 関数および generatePolicyFunction 関数で使用するときに、エージェントが基本のエージェント貪欲方策 (最大尤度をもつアクション) を使用するように強制するには、この値を指定します。具体的には、この場合にエージェントは rlDeterministicActorPolicy 方策を使用します。アクションの選択は貪欲であるため、方策は決定論的に動作し、エージェントはアクションおよび観測空間を探索しません。

メモ

このオプションはシミュレーションと展開にのみ影響し、学習には影響しません。train 関数を使用してエージェントに学習させる場合、エージェントはこのプロパティの値に関係なく常に学習用の探索方策を使用します。

エージェントのサンプル時間。正のスカラーまたは -1 として指定します。

MATLAB® 環境内では、環境が進むたびにエージェントが実行されるため、SampleTime はエージェントの実行タイミングに影響しません。SampleTime-1 に設定されている場合、MATLAB 環境では、返される出力経験内の連続する要素間の時間間隔は 1 に等しいと見なされます。

Simulink® 環境内では、エージェント オブジェクトを使用する RL Agent ブロックがシミュレーション時間の SampleTime 秒ごとに実行されます。SampleTime-1 に設定されている場合、ブロックは入力信号からサンプル時間を継承します。ブロックがイベント駆動型サブシステムの子である場合は、SampleTime-1 に設定します。

ブロックがイベント駆動型サブシステムの子でない場合は、SampleTime を正のスカラーに設定します。これにより、モデルのバリエーションによって入力信号のサンプル時間が変化した場合でも、ブロックが常に適切な間隔で実行されるようになります。SampleTime が正のスカラーの場合、この値は、環境の種類に関係なく、sim または train によって返される出力経験内の連続する要素間の時間間隔でもあります。

Simulink 環境で SampleTime-1 に設定されている場合、返される出力経験内の連続する要素間の時間間隔は、RL Agent ブロックの実行をトリガーするイベントのタイミングを反映します。

このプロパティは、エージェントとエージェント内のエージェント オプション オブジェクトとの間で共有されます。エージェント オプション オブジェクトでこのプロパティを変更すると、エージェントでも変更されます。その逆も同様です。

例: SampleTime=-1

オブジェクト関数

trainTrain reinforcement learning agents within a specified environment
simSimulate trained reinforcement learning agents within specified environment
getActionObtain action from agent, actor, or policy object given environment observations
getActor強化学習エージェントからのアクターの抽出
setActorSet actor of reinforcement learning agent
getCritic強化学習エージェントからのクリティックの抽出
setCriticSet critic of reinforcement learning agent
generatePolicyFunctionGenerate MATLAB function that evaluates policy of an agent or policy object

すべて折りたたむ

連続行動空間をもつ環境を作成し、その観測仕様とアクション仕様を取得します。この例では、Compare DDPG Agent to LQR Controllerの例で使用されている環境を読み込みます。環境からの観測値は、質量の位置と速度を含むベクトルです。アクションは、質量に適用される力を表すスカラーであり、-2 ~ 2 ニュートンの範囲で連続的に変化します。

env = rlPredefinedEnv("DoubleIntegrator-Continuous");

観測仕様とアクション仕様を取得します。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

エージェント作成関数は、アクター ネットワークとクリティック ネットワークをランダムに初期化します。乱数発生器のシード値を固定して、セクションの再現性を確保します。

rng(0)

環境の観測仕様とアクション仕様から方策勾配エージェントを作成します。

agent = rlDDPGAgent(obsInfo,actInfo)
agent = 
  rlDDPGAgent with properties:

        ExperienceBuffer: [1×1 rl.replay.rlReplayMemory]
            AgentOptions: [1×1 rl.option.rlDDPGAgentOptions]
    UseExplorationPolicy: 0
         ObservationInfo: [1×1 rl.util.rlNumericSpec]
              ActionInfo: [1×1 rl.util.rlNumericSpec]
              SampleTime: 1

エージェントを確認するには、getAction を使用してランダムな観測値からアクションを返します。

getAction(agent,{rand(obsInfo(1).Dimension)})
ans = 1×1 cell array
    {[0.0182]}

これで、環境内でエージェントのテストと学習ができるようになりました。また、getActorgetCriticを使用してアクターとクリティックをそれぞれ抽出することも、getModelを使用してアクターまたはクリティックから近似器モデル (既定では深層ニューラル ネットワーク) を抽出することもできます。

連続行動空間をもつ環境を作成し、その観測仕様とアクション仕様を取得します。この例では、振子の振り上げと平衡化のための、イメージ観測を使用した DDPG エージェントの学習の例で使用されている環境を読み込みます。この環境には、50×50 のグレースケール イメージとスカラー (振子の角速度) から成る 2 つの観測値があります。アクションは、-2 ~ 2 Nm の範囲のトルクを表すスカラーです。

env = rlPredefinedEnv("SimplePendulumWithImage-Continuous");

観測仕様とアクション仕様を取得します。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

エージェント初期化オプション オブジェクトを作成し、ネットワーク内の各隠れ全結合層に 128 個のニューロン (既定の数 256 ではなく) が必要であることを指定します。

initOpts = rlAgentInitializationOptions(NumHiddenUnit=128);

エージェント作成関数は、アクター ネットワークとクリティック ネットワークをランダムに初期化します。乱数発生器のシード値を固定することで再現性を確保できます。

rng(0)

環境の観測仕様とアクション仕様から DDPG エージェントを作成します。

agent = rlDDPGAgent(obsInfo,actInfo,initOpts);

エージェントのアクターおよびクリティックの両方から深層ニューラル ネットワークを抽出します。

actorNet = getModel(getActor(agent));
criticNet = getModel(getCritic(agent));

それぞれの隠れ全結合層に 128 個のニューロンがあることを検証するには、MATLAB® コマンド ウィンドウに層を表示します。

criticNet.Layers

または、analyzeNetworkを使用して構造体を対話的に可視化します。

analyzeNetwork(criticNet)

アクター ネットワークとクリティック ネットワークをプロットします。

plot(actorNet)

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

plot(criticNet)

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

エージェントを確認するには、getAction を使用してランダムな観測値からアクションを返します。

getAction(agent,{rand(obsInfo(1).Dimension),rand(obsInfo(2).Dimension)})
ans = 1×1 cell array
    {[-0.0364]}

これで、環境内でエージェントのテストと学習ができるようになりました。

連続行動空間をもつ環境を作成し、その観測仕様とアクション仕様を取得します。この例では、Compare DDPG Agent to LQR Controllerの例で使用されている環境を読み込みます。環境からの観測値は、質量の位置と速度を含むベクトルです。アクションは、-2 ~ 2 ニュートンまで連続的に変化する力を表すスカラーです。

env = rlPredefinedEnv("DoubleIntegrator-Continuous");

環境の観測仕様オブジェクトとアクション仕様オブジェクトを取得します。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

アクター ネットワークとクリティック ネットワークはランダムに初期化されます。乱数発生器のシード値を固定して、セクションの再現性を確保します。

rng(0)

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

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

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

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

% Define observation and action paths
obsPath = featureInputLayer(prod(obsInfo.Dimension),Name="obsInLyr");
actPath = featureInputLayer(prod(actInfo.Dimension),Name="actInLyr");

% Define common path: concatenate along first dimension.
commonPath = [
    concatenationLayer(1,2,Name="concat")
    fullyConnectedLayer(50)
    reluLayer
    fullyConnectedLayer(1)
    ];

dlnetwork オブジェクトを組み立て、層を追加します。

criticNet = dlnetwork;
criticNet = addLayers(criticNet, obsPath);
criticNet = addLayers(criticNet, actPath);
criticNet = addLayers(criticNet, commonPath);

パスを接続します。

criticNet = connectLayers(criticNet,"obsInLyr","concat/in1");
criticNet = connectLayers(criticNet,"actInLyr","concat/in2");

ネットワークをプロットします。

plot(criticNet)

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

ネットワークを初期化します。

criticNet = initialize(criticNet);

重みの数を表示します。

summary(criticNet)
   Initialized: true

   Number of learnables: 251

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

criticNet、環境の観測仕様とアクション仕様、および環境の観測チャネルとアクション チャネルに接続されるネットワーク入力層の名前を使用して、クリティック近似器オブジェクトを作成します。詳細については、rlQValueFunctionを参照してください。

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

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

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

-0.4260

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

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

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

actorNet = [
    featureInputLayer(prod(obsInfo.Dimension))
    fullyConnectedLayer(16)
    tanhLayer
    fullyConnectedLayer(16)
    tanhLayer
    fullyConnectedLayer(prod(actInfo.Dimension))
    ];

dlnetwork オブジェクトに変換します。

actorNet = dlnetwork(actorNet);

ネットワークを初期化します。

actorNet = initialize(actorNet);

重みの数を表示します。

summary(actorNet)
   Initialized: true

   Number of learnables: 337

   Inputs:
      1   'input'   2 features

actorNet および観測仕様とアクション仕様を使用して、アクターを作成します。連続決定論的アクターの詳細については、rlContinuousDeterministicActorを参照してください。

actor = rlContinuousDeterministicActor(actorNet,obsInfo,actInfo);

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

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

アクターとクリティックを使用して DDPG エージェントを作成します。

agent = rlDDPGAgent(actor,critic)
agent = 
  rlDDPGAgent with properties:

        ExperienceBuffer: [1×1 rl.replay.rlReplayMemory]
            AgentOptions: [1×1 rl.option.rlDDPGAgentOptions]
    UseExplorationPolicy: 0
         ObservationInfo: [1×1 rl.util.rlNumericSpec]
              ActionInfo: [1×1 rl.util.rlNumericSpec]
              SampleTime: 1

アクターとクリティックの学習オプションを含むエージェント オプションを指定します。

agent.AgentOptions.SampleTime=env.Ts;
agent.AgentOptions.TargetSmoothFactor=1e-3;
agent.AgentOptions.ExperienceBufferLength=1e6;
agent.AgentOptions.DiscountFactor=0.99;
agent.AgentOptions.MiniBatchSize=32;

agent.AgentOptions.CriticOptimizerOptions.LearnRate=5e-3;
agent.AgentOptions.CriticOptimizerOptions.GradientThreshold=1;

agent.AgentOptions.ActorOptimizerOptions.LearnRate=1e-4;
agent.AgentOptions.ActorOptimizerOptions.GradientThreshold=1;

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

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

これで、環境内でエージェントに学習させることができるようになりました。

この例では、Compare DDPG Agent to LQR Controllerの例で使用されている環境を読み込みます。環境からの観測値は、質量の位置と速度を含むベクトルです。アクションは、-2 ~ 2 ニュートンまで連続的に変化する力を表すスカラーです。

env = rlPredefinedEnv("DoubleIntegrator-Continuous");

観測仕様オブジェクトとアクション仕様オブジェクトを取得します。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

DDPG エージェントは、パラメーター化された Q 値関数近似器を使用して方策の価値を推定します。

クリティック内でパラメーター化された Q 値関数をモデル化するには、2 つの入力層と 1 つの出力層 (スカラー値を返す) をもつ再帰型ニューラル ネットワークを使用します。

各ネットワーク パスを layer オブジェクトの配列として定義します。再帰型ニューラル ネットワークを作成するには、入力層として sequenceInputLayer を使用し、他のネットワーク層の 1 つとして lstmLayer を含めます。

% Define observation and action paths
obsPath = sequenceInputLayer(prod(obsInfo.Dimension),Name="netOin");
actPath = sequenceInputLayer(prod(actInfo.Dimension),Name="netAin");

% Define common path: concatenate along first dimension
commonPath = [
    concatenationLayer(1,2,Name="cat")
    lstmLayer(50)
    reluLayer
    fullyConnectedLayer(1)
    ];

dlnetwork オブジェクトを作成し、層を追加します。

criticNet = dlnetwork();
criticNet = addLayers(criticNet, obsPath);
criticNet = addLayers(criticNet, actPath);
criticNet = addLayers(criticNet, commonPath);

層を接続します。

criticNet = connectLayers(criticNet,"netOin","cat/in1");
criticNet = connectLayers(criticNet,"netAin","cat/in2");

ネットワークをプロットします。

plot(criticNet)

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

ネットワークを初期化し、重みの数を表示します。

criticNet = initialize(criticNet);
summary(criticNet)
   Initialized: true

   Number of learnables: 10.8k

   Inputs:
      1   'netOin'   Sequence input with 2 dimensions
      2   'netAin'   Sequence input with 1 dimensions

criticNet、環境の観測仕様とアクション仕様、および環境の観測チャネルとアクション チャネルに接続されるネットワーク入力層の名前を使用して、クリティック近似器オブジェクトを作成します。詳細については、rlQValueFunctionを参照してください。

critic = rlQValueFunction(criticNet,obsInfo,actInfo,...
    ObservationInputNames="netOin",ActionInputNames="netAin");

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

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

-0.0074

DDPG エージェントは、方策を近似するために連続決定論的アクターを使用します。クリティックは再帰型ネットワークをもつため、アクターにも再帰型ネットワークを使用しなければなりません。

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

actorNet = [
    sequenceInputLayer(prod(obsInfo.Dimension))
    lstmLayer(10)
    reluLayer
    fullyConnectedLayer(prod(actInfo.Dimension)) 
    ];

dlnetwork オブジェクトに変換し、ネットワークを初期化し、重みの数を表示します。

actorNet = dlnetwork(actorNet);
actorNet = initialize(actorNet);
summary(actorNet)
   Initialized: true

   Number of learnables: 531

   Inputs:
      1   'sequenceinput'   Sequence input with 2 dimensions

actorNet および観測仕様とアクション仕様を使用して、アクターを作成します。連続決定論的アクターの詳細については、rlContinuousDeterministicActorを参照してください。

actor = rlContinuousDeterministicActor(actorNet,obsInfo,actInfo);

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

getAction(actor,{rand(obsInfo.Dimension)})
ans = 1×1 cell array
    {[0.0246]}

クリティックの学習オプションをいくつか指定します。

criticOpts = rlOptimizerOptions( ...
    LearnRate=5e-3,GradientThreshold=1);

アクターの学習オプションをいくつか指定します。

actorOpts = rlOptimizerOptions( ...
    LearnRate=1e-4,GradientThreshold=1);

エージェント オプションを指定します。DDPG エージェントを再帰型ニューラル ネットワークで使用するには、1 より大きい SequenceLength を指定しなければなりません。

agentOpts = rlDDPGAgentOptions(...
    SampleTime=env.Ts,...
    TargetSmoothFactor=1e-3,...
    ExperienceBufferLength=1e6,...
    DiscountFactor=0.99,...
    SequenceLength=20,...
    MiniBatchSize=32, ...
    CriticOptimizerOptions=criticOpts, ...
    ActorOptimizerOptions=actorOpts);

アクターとクリティックを使用して DDPG エージェントを作成します。

agent = rlDDPGAgent(actor,critic,agentOpts)
agent = 
  rlDDPGAgent with properties:

        ExperienceBuffer: [1×1 rl.replay.rlReplayMemory]
            AgentOptions: [1×1 rl.option.rlDDPGAgentOptions]
    UseExplorationPolicy: 0
         ObservationInfo: [1×1 rl.util.rlNumericSpec]
              ActionInfo: [1×1 rl.util.rlNumericSpec]
              SampleTime: 0.1000

エージェントをチェックするには、ランダムな観測値からアクションを返します。

getAction(agent,{rand(obsInfo.Dimension)})
ans = 1×1 cell array
    {[0.0158]}

連続する観測値を使用してエージェントを評価するには、シーケンス長 (時間) 次元を使用します。たとえば、9 つの観測値のシーケンスに対するアクションを取得します。

[action,state] = getAction(agent, ...
    {rand([obsInfo.Dimension 1 9])});

観測値の 7 番目の要素に対応するアクションを表示します。

action = action{1};
action(1,1,1,7)
ans = 
0.0780

これで、環境内でエージェントのテストと学習ができるようになりました。

バージョン履歴

R2019a で導入