Main Content

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

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

この例では、Simulink® でモデル化された飛行ロボット用の軌跡を生成するために、深層決定方策勾配 (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 とする (ロボットが東を向く)。

  • 各アクチュエータの推力は、-11 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 ブロックのある統合されたモデルを自動生成します。

integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);

アクションと観測値

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

この環境の観測信号は observation=[xyx˙y˙sin(θ )cos(θ)θ ˙]T です。

numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';

この環境のアクション信号は action=[TRTL]T です。

numAct = prod(actionInfo.Dimension);
actionInfo.LowerLimit = -ones(numAct,1);
actionInfo.UpperLimit =  ones(numAct,1);
actionInfo.Name = 'thrusts';

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

統合されたモデルを使用して、飛行ロボットの環境インターフェイスを作成します。

env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);

リセット関数

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

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

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

rng(0)

DDPG エージェントの作成

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

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

observationPath = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];
actionPath = [
    featureInputLayer(numAct,'Normalization','none','Name','action')
    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);

rlOptimizerOptions を使用して、クリティックのオプションを指定します。

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

指定したニューラル ネットワークとオプションを使用して、クリティック表現を作成します。また、クリティックのアクションと観測値の仕様も指定しなければなりません。詳細については、rlQValueFunction (Reinforcement Learning Toolbox)を参照してください。

critic = rlQValueFunction(criticNetwork,observationInfo,actionInfo,...
    'ObservationInputNames','observation','ActionInputNames','action');

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

クリティックと同様にアクターを作成します。詳細については、rlContinuousDeterministicActor (Reinforcement Learning Toolbox)を参照してください。

actorNetwork = [
    featureInputLayer(numObs,'Normalization','none','Name','observation')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numAct,'Name','fc4')
    tanhLayer('Name','tanh1')];
actorNetwork = dlnetwork(actorNetwork);

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

actor = rlContinuousDeterministicActor(actorNetwork,observationInfo,actionInfo);

DDPG エージェントを作成するには、まず、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)

関連するトピック