このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
カートポール システムの振り上げと平衡化のための DDPG エージェントの学習
この例では、Simscape™ Multibody™ でモデル化されたカートポール システムの振り上げと平衡化を行うように、深層決定論的方策勾配 (DDPG) エージェントに学習させる方法を説明します。
DDPG エージェントの詳細については、深層決定論的方策勾配 (DDPG) エージェントを参照してください。MATLAB® で DDPG エージェントに学習させる方法の例については、Compare DDPG Agent to LQR Controllerを参照してください。
サンプル コードには、さまざまな段階で乱数の計算が含まれる場合があります。サンプル コード内のさまざまなセクションの先頭にある乱数ストリームを固定すると、実行するたびにセクション内の乱数シーケンスが維持されるため、結果が再現される可能性が高くなります。詳細については、Results Reproducibilityを参照してください。
再現性のための乱数ストリームの固定
サンプル コードには、さまざまな段階で乱数の計算が含まれる場合があります。乱数ストリームを固定すると、コードを実行するたびに乱数のシーケンスが維持されるため、結果が再現される可能性が高くなります。この例では、さまざまな場所で乱数ストリームを固定します。シード 0
で乱数ストリームを固定し、メルセンヌ・ツイスター乱数アルゴリズムを使用します。乱数生成に使用されるシード制御の詳細については、rng
を参照してください。
previousRngState = rng(0,"twister");
出力 previousRngState
は、ストリームの前の状態に関する情報が格納された構造体です。例の最後で、状態を復元します。
カートポール Simscape モデル
この例の強化学習環境は、摩擦のないトラックに沿って移動するカート上の非駆動ジョイントに取り付けられたポールです。学習の目標は、最小限の制御操作を使用してポールを直立させることです。
モデルを開きます。
mdl = "rlCartPoleSimscapeModel";
open_system(mdl)
カートポール システムは、Simscape Multibody を使用してモデル化されています。
このモデルでは、次のようにします。
直立するポールの角度を
0
ラジアン、振子が鉛直下向きになっている位置をpi
ラジアンとします。エージェントから環境への力 (右向きが正) のアクション信号は -15 ~ 15 N とします。
環境からの観測値は、カートの位置と速度、およびポールの角度の正弦、余弦、微分とします。
カートが元の位置から 3.5 m を超えて移動した場合、エピソードの終了とします。
各タイム ステップで与えられる報酬 は次のとおりとする。
ここで、以下となります。
はポールの直立位置からの変位角 (反時計回りが正)。
はカートの中心位置からの位置変位 (右方向が正)。
は前のタイム ステップからの制御量。
は、カートが範囲外に出たかどうかを示すフラグ (1 または 0)。
このモデルの詳細については、Load Predefined Control System Environmentsを参照してください。
環境オブジェクトの作成
ポールの事前定義済み環境オブジェクトを作成します。
env = rlPredefinedEnv("CartPoleSimscapeModel-Continuous")
env = SimulinkEnvWithAgent with properties: Model : rlCartPoleSimscapeModel AgentBlock : rlCartPoleSimscapeModel/RL Agent ResetFcn : [] UseFastRestart : on
環境には、エージェントがカートに水平方向の力 (-15 ~ 15 N) を加えることができる連続行動空間があります。
環境オブジェクトから観測情報とアクション情報を取得します。
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env);
エージェントのサンプル時間 Ts
とシミュレーション時間 Tf
を秒単位で指定します。
Ts = 0.02; Tf = 25;
DDPG エージェントの作成
この例では、DDPG エージェントを作成してその学習を行います。このエージェントは以下を使用します。
方策の値を推定するための Q 値関数クリティック。このクリティックは、現在の観測値とアクションを入力として取り、単一のスカラーを出力として返します (状態からのアクションが与えられた割引累積長期報酬の推定値は、現在の観測値に対応し、その後の方策に従います)。
連続決定論的アクターによって学習される、連続行動空間上の決定論的方策。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。
アクター関数とクリティック関数は、ニューラル ネットワーク表現を使用して近似されます。エージェント初期化オブジェクトを作成し、隠れ層のサイズを 200 としてネットワークを初期化します。
initOpts = rlAgentInitializationOptions(NumHiddenUnit=200);
rlDDPGAgentOptions
を使用し、学習のハイパーパラメーターを構成します。
アクターとクリティックの学習率を 5e-3 として指定します。学習率が大きいと、大幅な更新が発生し、動作の逸脱につながる可能性がありますが、値が低いと、最適な点に到達するまでに多くの更新が必要になる可能性があります。
勾配しきい値を 1 に指定します。勾配をクリップすると学習の安定性が向上します。
経験バッファー容量を 1e5 に指定します。容量が大きいほど、多様な経験のセットを保存できます。
ターゲット クリティック ネットワークを更新するために、平滑化係数を 5e-3 に指定します。
エージェントのサンプル時間を
Ts
として指定します。学習エポックごとに最大 200 個のミニ バッチで学習します。
criticOptions = rlOptimizerOptions( ... LearnRate=5e-03, ... GradientThreshold=1); actorOptions = rlOptimizerOptions( ... LearnRate=5e-03, ... GradientThreshold=1); agentOptions = rlDDPGAgentOptions(... SampleTime=Ts,... ActorOptimizerOptions=actorOptions,... CriticOptimizerOptions=criticOptions,... ExperienceBufferLength=1e5,... TargetSmoothFactor=5e-3,... MaxMiniBatchPerEpoch=200);
あるいは、最初にエージェントを作成して、そのオプション オブジェクトにアクセスし、ドット表記を使用してオプションを変更することもできます。
この例の DDPG エージェントは、探索にオルンシュタイン・ウーレンベック (OU) ノイズ モデルを使用します。ドット表記を使用して次のノイズ オプションを指定します。
の平均アトラクションの値を指定します。平均アトラクションの値が大きいほど、ノイズの値は平均に近くなります。
学習中の探索を改善するために、標準偏差値 を指定します。
agentOptions.NoiseOptions.StandardDeviation = 1.0/sqrt(Ts); agentOptions.NoiseOptions.MeanAttractionConstant = 0.1/Ts;
再現性のために乱数ストリームを固定します。
rng(0,"twister");
次に、入力仕様とエージェント オプション オブジェクトを使用してエージェントを作成します。詳細については、rlDDPGAgent
を参照してください。
agent = rlDDPGAgent(obsInfo,actInfo,initOpts,agentOptions);
エージェントの学習
エージェントに学習させるには、まず、学習オプションを指定します。この例では、次のオプションを使用します。
最大 2000 個のエピソードについて、各学習エピソードを実行 (各エピソードの持続時間は最大
ceil(Tf/Ts)
タイム ステップ)。[強化学習の学習モニター] ダイアログ ボックスに学習の進行状況を表示し (
Plots
オプションを設定)、コマンド ラインの表示を無効化 (Verbose
オプションをfalse
に設定)。10 回の学習エピソードごとに 1 回のシミュレーションを実行して、貪欲方策のパフォーマンスを評価。
貪欲方策の評価が -390 を超えたときに学習を停止。この時点で、エージェントは最小限の制御操作でポールを直立位置で素早く平衡化できます。
学習オプションの詳細については、rlTrainingOptions
およびrlEvaluator
を参照してください。
% training options maxepisodes = 2000; maxsteps = ceil(Tf/Ts); trainingOptions = rlTrainingOptions(... MaxEpisodes=maxepisodes,... MaxStepsPerEpisode=maxsteps,... ScoreAveragingWindowLength=5,... Verbose=false,... Plots="training-progress",... StopTrainingCriteria="EvaluationStatistic",... StopTrainingValue=-390); % agent evaluation evl = rlEvaluator(NumEpisodes=1,EvaluationFrequency=10);
再現性のために乱数ストリームを固定します。
rng(0,"twister");
関数 train
を使用して、エージェントに学習させます。このエージェント プロセスの学習には大量の計算が必要であり、完了するまでに数時間かかります。この例の実行時間を節約するために、doTraining
を false
に設定して事前学習済みのエージェントを読み込みます。エージェントに学習させるには、doTraining
を true
に設定します。
doTraining =false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions,Evaluator=evl); else % Load the pretrained agent for the example. load("SimscapeCartPoleDDPG.mat","agent") end
学習の進行状況のスナップショットを下の図に示します。学習プロセスはランダムであるため、結果は異なる可能性があります。
DDPG エージェントのシミュレーション
再現性のために乱数ストリームを固定します。
rng(0,"twister");
学習済みエージェントの性能を検証するには、カートポール環境内でエージェントをシミュレーションします。エージェントのシミュレーションの詳細については、rlSimulationOptions
および sim
を参照してください。
simOptions = rlSimulationOptions(MaxSteps=500); experience = sim(env,agent,simOptions);
previousRngState
に保存されている情報を使用して、乱数ストリームを復元します。
rng(previousRngState);
参考
アプリ
関数
train
|sim
|rlSimulinkEnv
オブジェクト
rlDDPGAgent
|rlDDPGAgentOptions
|rlQValueFunction
|rlContinuousDeterministicActor
|rlTrainingOptions
|rlSimulationOptions
|rlOptimizerOptions