Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

振子の振り上げと平衡化のための、イメージ観測を使用した DDPG エージェントの学習

この例では、MATLAB® でモデル化されたイメージ観測を使用して、振子の振り上げと平衡化を行うように深層決定方策勾配 (DDPG) エージェントに学習させる方法を説明します。

DDPG エージェントの詳細については、Deep Deterministic Policy Gradient (DDPG) Agents (Reinforcement Learning Toolbox)を参照してください。

イメージ MATLAB 環境を使用した単純な振子

この例では、初期状態で下向きにぶら下がっている摩擦がない単純な振子を、強化学習の環境として使用します。学習の目標は、最小限の制御操作を使用して、振子が倒れず直立した状態を維持することです。

この環境では、次のようにします。

  • 振子が平衡になって直立している位置を 0 ラジアンとし、下向きにぶら下がっている位置を pi ラジアンとする。

  • エージェントから環境へのトルク アクション信号は、–2 ~ 2 N m とする。

  • 環境からの観測値は、振子の質量の位置および振子の角速度を表すイメージとする。

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

rt=-(θt2+0.1θt˙2+0.001ut-12)

ここで、以下となります。

  • θt は直立位置からの変位角。

  • θt˙ は変位角の微分。

  • ut-1 は前のタイム ステップからの制御量。

このモデルの詳細については、Load Predefined Control System Environments (Reinforcement Learning Toolbox)を参照してください。

環境インターフェイスの作成

振子用の事前定義された環境インターフェイスを作成します。

env = rlPredefinedEnv('SimplePendulumWithImage-Continuous')
env = 
  SimplePendlumWithImageContinuousAction with properties:

             Mass: 1
        RodLength: 1
       RodInertia: 0
          Gravity: 9.8100
     DampingRatio: 0
    MaximumTorque: 2
               Ts: 0.0500
            State: [2x1 double]
                Q: [2x2 double]
                R: 1.0000e-03

このインターフェイスは、エージェントが –2 ~ 2 N m のトルクを適用できる、連続したアクション空間をもちます。

環境インターフェイスから観測値とアクションの仕様を取得します。

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

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

rng(0)

DDPG エージェントの作成

DDPG エージェントは、観測値とアクションを所与として、クリティック価値関数表現を使用して長期報酬を近似します。クリティックを作成するには、まず 3 つの入力 (イメージ、角速度、アクション) と 1 つの出力をもつ深層畳み込みニューラル ネットワーク (CNN) を作成します。表現の作成の詳細については、Create Policies and Value Functions (Reinforcement Learning Toolbox)を参照してください。

hiddenLayerSize1 = 400;
hiddenLayerSize2 = 300;

imgPath = [
    imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
    convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
    reluLayer('Name','relu1')
    fullyConnectedLayer(2,'Name','fc1')
    concatenationLayer(3,2,'Name','cat1')
    fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')
    ];
dthetaPath = [
    imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
    fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
    ];
actPath =[
    imageInputLayer(actInfo(1).Dimension,'Normalization','none','Name','action')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc6','BiasLearnRateFactor',0,'Bias',zeros(hiddenLayerSize2,1))
    ];

criticNetwork = layerGraph(imgPath);
criticNetwork = addLayers(criticNetwork,dthetaPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = connectLayers(criticNetwork,'fc5','cat1/in2');
criticNetwork = connectLayers(criticNetwork,'fc6','add/in2');

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

figure
plot(criticNetwork)

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

rlRepresentationOptions (Reinforcement Learning Toolbox) を使用して、クリティック表現のオプションを指定します。

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

GPU を使用してクリティック CNN の学習を高速化するため、次の行のコメントを解除します。サポートされている GPU の詳細については、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。

% criticOptions.UseDevice = 'gpu';

指定したニューラル ネットワークとオプションを使用して、クリティック表現を作成します。また、クリティックのアクションと観測値の情報も指定しなければなりません (これらは環境インターフェイスから取得します)。詳細については、rlQValueRepresentation (Reinforcement Learning Toolbox)を参照してください。

critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
    'Observation',{'pendImage','angularRate'},'Action',{'action'},criticOptions);

DDPG エージェントは、観測値が与えられると、どのアクションを実行するかをアクター表現を使用して決定します。アクターを作成するには、まず 2 つの入力 (イメージおよび角速度) と 1 つの出力 (アクション) をもつ深層畳み込みニューラル ネットワーク (CNN) を作成します。

クリティックと同様の方法でアクターを作成します。

imgPath = [
    imageInputLayer(obsInfo(1).Dimension,'Normalization','none','Name',obsInfo(1).Name)
    convolution2dLayer(10,2,'Name','conv1','Stride',5,'Padding',0)
    reluLayer('Name','relu1')
    fullyConnectedLayer(2,'Name','fc1')
    concatenationLayer(3,2,'Name','cat1')
    fullyConnectedLayer(hiddenLayerSize1,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize2,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')
    tanhLayer('Name','tanh1')
    scalingLayer('Name','scale1','Scale',max(actInfo.UpperLimit))
    ];
dthetaPath = [
    imageInputLayer(obsInfo(2).Dimension,'Normalization','none','Name',obsInfo(2).Name)
    fullyConnectedLayer(1,'Name','fc5','BiasLearnRateFactor',0,'Bias',0)
    ];

actorNetwork = layerGraph(imgPath);
actorNetwork = addLayers(actorNetwork,dthetaPath);
actorNetwork = connectLayers(actorNetwork,'fc5','cat1/in2');

actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);

GPU を使用してアクター CNN の学習速度を上げるため、次の行のコメントを解除します。

% actorOptions.UseDevice = 'gpu';

指定したニューラル ネットワークとオプションを使用して、アクター表現を作成します。詳細については、rlDeterministicActorRepresentation (Reinforcement Learning Toolbox)を参照してください。

actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'pendImage','angularRate'},'Action',{'scale1'},actorOptions);

アクター ネットワークの構成を表示します。

figure
plot(actorNetwork)

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

DDPG エージェントを作成するには、まず、rlDDPGAgentOptions (Reinforcement Learning Toolbox) を使用して DDPG エージェントのオプションを指定します。

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',env.Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',128);
agentOptions.NoiseOptions.Variance = 0.6;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;

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

agent = rlDDPGAgent(actor,critic,agentOptions);

エージェントの学習

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

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

  • Episode Manager のダイアログ ボックスに学習の進行状況を表示 (Plots オプションを設定)。

  • 連続する 10 個を超えるエピソードについて、-740 を超える移動平均累積報酬をエージェントが受け取ったときに学習を停止。この時点で、エージェントは最小限の制御操作を使用して、振子を直立位置で素早く平衡化できるようになります。

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

maxepisodes = 5000;
maxsteps = 400;
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-740);

学習中またはシミュレーション中に、関数 plot を使用して振子を可視化できます。

plot(env)

Figure Simple Pendulum Visualizer contains 2 axes objects. Axes object 1 contains 2 objects of type line, rectangle. Axes object 2 contains an object of type image.

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

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

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

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

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

Figure Simple Pendulum Visualizer contains 2 axes objects. Axes object 1 contains 2 objects of type line, rectangle. Axes object 2 contains an object of type image.

参考

(Reinforcement Learning Toolbox)

関連するトピック