経路追従制御用の DDPG エージェントの学習
この例では、経路追従制御 (PFC) 用の深層決定論的方策勾配 (DDPG) エージェントの学習を Simulink® で実行する方法を説明します。DDPG エージェントの詳細については、深層決定論的方策勾配 (DDPG) エージェントを参照してください。
再現性を高めるための乱数シード発生器の固定
サンプル コードには、さまざまな段階で乱数の計算が含まれる場合があります。サンプル コード内のさまざまなセクションの先頭にある乱数ストリームを固定すると、実行するたびにセクション内の乱数シーケンスが維持されるため、結果が再現される可能性が高くなります。詳細については、Results Reproducibilityを参照してください。
シード 0 で乱数ストリームを固定し、メルセンヌ・ツイスター乱数アルゴリズムを使用します。乱数生成に使用されるシード制御の詳細については、rngを参照してください。
previousRngState = rng(0,"twister");出力 previousRngState は、ストリームの前の状態に関する情報が格納された構造体です。例の最後で、状態を復元します。
Simulink モデル
この例では、自車については単純な自転車モデル、先行車両については単純な縦方向のモデルを強化学習の環境として使用します。この学習の目的は、縦方向の加速と減速を制御して先行車両との安全な距離を維持しつつ、自車を設定速度で走行させること、およびフロント ステアリング角度を制御して車線のセンターラインに沿って自車を走行させ続けることです。PFC の詳細については、Path Following Control System (Model Predictive Control Toolbox)を参照してください。自車の車両運動は、次のパラメーターで指定します。
m = 1600; % total vehicle mass (kg) Iz = 2875; % yaw moment of inertia (mNs^2) lf = 1.4; % long. distance from center of gravity to front tires (m) lr = 1.6; % long. distance from center of gravity to rear tires (m) Cf = 19000; % cornering stiffness of front tires (N/rad) Cr = 33000; % cornering stiffness of rear tires (N/rad) tau = 0.5; % longitudinal time constant
2 台の車両の初期位置と初期速度を指定します。
x0_lead = 50; % initial position for lead car (m) v0_lead = 24; % initial velocity for lead car (m/s) x0_ego = 10; % initial position for ego car (m) v0_ego = 18; % initial velocity for ego car (m/s)
停止時の既定の間隔 (m)、時間ギャップ (s)、および運転手が設定した速度 (m/s) を指定します。
D_default = 10; t_gap = 1.4; v_set = 28;
車両運動の物理的な制約をシミュレートするため、加速度を [–3,2] (m/s^2) の範囲に制限し、ステアリング角度を [–0.2618,0.2618] (rad) の範囲 (-15 ~ 15 度) に制限します。
amin_ego = -3; amax_ego = 2; umin_ego = -0.2618; % +15 deg umax_ego = 0.2618; % -15 deg
道路の曲率は定数 0.001 () で定義されます。横方向の偏差の初期値を 0.2 m とし、相対ヨー角の初期値を -0.1 rad とします。
rho = 0.001; e1_initial = 0.2; e2_initial = -0.1;
サンプル時間 Ts とシミュレーション期間 Tf を秒単位で定義します。
Ts = 0.1; Tf = 60;
モデルを開きます。
mdl = "rlPFCMdl"; open_system(mdl) agentblk = mdl + "/RL Agent";

このモデルでは、次のようにします。
アクション信号は、加速度のアクションとステアリング角度のアクションで構成される。加速度のアクション信号は、-3 ~ 2 (m/s^2) の値を取る。ステアリングのアクション信号は、-15 度 (-0.2618 rad) ~ 15 度 (0.2618 rad) の値を取る。
自車の基準速度 を次のように定義する。相対距離が安全距離未満の場合、自車は先行車両の速度と運転手が設定した速度の最小値に追従する。この方法により、自車は先行車両からある程度の距離を維持する。相対距離が安全距離より大きい場合、自車は運転手が設定した速度に追従する。この例では、安全距離は自車の縦方向の速度 の線形関数、つまり、 として定義される。安全距離によって、自車の追従速度が決まる。
環境からの観測値には、縦方向の測定値、つまり、速度誤差 、その積分 、および自車の縦方向の速度 が含まれる。また、この観測値には、横方向の測定値、つまり、横方向の偏差 、相対ヨー角 、これらの微分 および 、これらの積分 および が含まれる。
シミュレーションは、横方向の偏差が となるか、縦方向の速度が となるか、先行車両と自車との相対距離が となったときに終了する。
各タイム ステップ で与えられる報酬 は次のとおりとする。
ここで、 は前のタイム ステップ からのステアリングの入力、 は前のタイム ステップからの加速度の入力です。この 3 つの論理値は次のようになります。
(シミュレーションが終了した場合)、 (それ以外の場合)
(横方向の誤差が の場合)、 (それ以外の場合)
(速度の誤差が の場合)、 (それ以外の場合)
報酬に含まれるこの 3 つの論理項は、横方向の誤差と速度の誤差の両方を小さくするようエージェントに促す一方、シミュレーションが早期に終了した場合はエージェントにペナルティを課します。
環境オブジェクトの作成
Simulink モデル用の環境オブジェクトを作成します。
観測値の仕様を作成します。
obsInfo = rlNumericSpec([9 1], ... LowerLimit=-inf*ones(9,1), ... UpperLimit=inf*ones(9,1)); obsInfo.Name = "observations";
アクションの仕様を作成します。
actInfo = rlNumericSpec([2 1], ... LowerLimit=[-3;-0.2618], ... UpperLimit=[2;0.2618]); actInfo.Name = "accel;steer";
環境オブジェクトを作成します。
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
初期条件を定義するには、無名関数ハンドルを使用して環境リセット関数を指定します。例の終わりに定義されているリセット関数 localResetFcn は、先行車両の初期位置、横方向の偏差、相対ヨー角をランダム化します。
env.ResetFcn = @localResetFcn;
カスタム ネットワークを使用した DDPG エージェントの作成
DDPG エージェントは、パラメーター化された Q 値関数近似器を使用して方策の価値を推定します。Q 値関数クリティックは、現在の観測値とアクションを入力として取り、単一のスカラーを出力として返します (状態からのアクションが与えられた割引累積長期報酬の推定値は、現在の観測値に対応し、その後の方策に従います)。
パラメーター化された Q 値関数をクリティック内でモデル化するには、2 つの入力層 (そのうち 1 つは obsInfo で指定された観測チャネル用で、もう 1 つは actInfo で指定されたアクション チャネル用) と 1 つの出力層 (これはスカラー値を返します) をもつニューラル ネットワークを使用します。prod(obsInfo.Dimension) および prod(actInfo.Dimension) は、行ベクトル、列ベクトル、行列のいずれによって構成されているかにかかわらず、それぞれ観測値と行動空間の次元の数を返すことに注意してください。
ネットワークを作成すると、ネットワークの初期パラメーターがランダムな値で初期化されます。エージェントが常に同じパラメーター値で初期化されるように、乱数ストリームを固定します。
rng(0,"twister");各ネットワーク パスを layer オブジェクトの配列として定義し、各パスの入力層と出力層に名前を割り当てます。これらの名前を使用すると、パスを接続してから、ネットワークの入力層と出力層に適切な環境チャネルを明示的に関連付けることができます。
% Number of neurons L = 100; % Main path mainPath = [ featureInputLayer(prod(obsInfo.Dimension),Name="obsInLyr") fullyConnectedLayer(L) reluLayer fullyConnectedLayer(L) additionLayer(2,Name="add") reluLayer fullyConnectedLayer(L) reluLayer fullyConnectedLayer(1,Name="QValLyr") ]; % Action path actionPath = [ featureInputLayer(prod(actInfo.Dimension),Name="actInLyr") fullyConnectedLayer(L,Name="actOutLyr") ];
dlnetwork オブジェクトを組み立てます。
criticNet = dlnetwork(); criticNet = addLayers(criticNet,mainPath); criticNet = addLayers(criticNet,actionPath); criticNet = connectLayers(criticNet,"actOutLyr","add/in2");
dlnetwork オブジェクトを初期化し、重みの数を表示します。
criticNet = initialize(criticNet); summary(criticNet)
Initialized: true
Number of learnables: 21.6k
Inputs:
1 'obsInLyr' 9 features
2 'actInLyr' 2 features
クリティック ネットワークの構成を表示します。
plot(criticNet)

指定したニューラル ネットワーク、および環境のアクション仕様と観測仕様を使用して、クリティックを作成します。追加の引数として、観測チャネルとアクション チャネルに接続するネットワーク層の名前も渡します。詳細については、rlQValueFunctionを参照してください。
critic = rlQValueFunction(criticNet,obsInfo,actInfo,... ObservationInputNames="obsInLyr",ActionInputNames="actInLyr");
DDPG エージェントは、連続行動空間において、パラメーター化された決定論的方策を使用します。この方策は、連続決定論的アクターによって学習されます。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。
パラメーター化された方策をアクター内でモデル化するには、1 つの入力層 (これは、obsInfo で指定された、環境観測チャネルのコンテンツを受け取ります) と 1 つの出力層 (これは、actInfo で指定された、環境アクション チャネルへのアクションを返します) をもつニューラル ネットワークを使用します。
ネットワークを layer オブジェクトの配列として定義します。
actorNet = [
featureInputLayer(prod(obsInfo.Dimension))
fullyConnectedLayer(L)
reluLayer
fullyConnectedLayer(L)
reluLayer
fullyConnectedLayer(L)
reluLayer
fullyConnectedLayer(2)
tanhLayer
scalingLayer(Scale=[2.5;0.2618],Offset=[-0.5;0])
];dlnetwork オブジェクトに変換し、ネットワークを初期化し、重みの数を表示します。
actorNet = dlnetwork(actorNet); actorNet = initialize(actorNet); summary(actorNet)
Initialized: true
Number of learnables: 21.4k
Inputs:
1 'input' 9 features
クリティックと同様にアクターを作成します。詳細については、rlContinuousDeterministicActorを参照してください。
actor = rlContinuousDeterministicActor(actorNet,obsInfo,actInfo);
rlOptimizerOptionsを使用して、クリティックとアクターの学習オプションを指定します。
アクターとクリティックでそれぞれ 1e-4 と 1e-3 の学習率を使用します。学習率を小さくすると学習を安定させることができますが、学習時間が長くなります。
勾配しきい値 1 を使用して勾配をクリップします。これにより、勾配の値が大きくなって学習が不安定になるのを防ぐことができます。
学習プロセスをさらに安定させるには、L2 正則化係数 1e-4 を使用します。
criticOptions = rlOptimizerOptions( ... LearnRate=1e-3, ... GradientThreshold=1, ... L2RegularizationFactor=1e-4); actorOptions = rlOptimizerOptions( ... LearnRate=1e-4, ... GradientThreshold=1, ... L2RegularizationFactor=1e-4);
rlDDPGAgentOptionsを使用して DDPG エージェントのオプションを指定します。
経験バッファーの長さ
1e6を指定します。バッファーが大きいほど、多様な経験のセットを保存できます。2 つのアクションの初期標準偏差として
[0.6;0.1]、標準偏差の減衰率として1e-5を指定します。減衰により、学習の開始時には探索が容易になり、学習の終了時には利用が容易になります。エージェントに同じ時間
Tsを指定します。
agentOptions = rlDDPGAgentOptions(... SampleTime=Ts,... ActorOptimizerOptions=actorOptions,... CriticOptimizerOptions=criticOptions,... ExperienceBufferLength=1e6); agentOptions.NoiseOptions.StandardDeviation = [0.6;0.1]; agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;
アクター、クリティック、およびエージェントのオプションを使用して、DDPG エージェントを作成します。詳細については、rlDDPGAgentを参照してください。
agent = rlDDPGAgent(actor,critic,agentOptions);
エージェントの学習
エージェントに学習させるには、まず、学習オプションを指定します。この例では、次のオプションを使用します。
最大
10000個のエピソードについて、各学習エピソードを実行 (各エピソードの持続時間は最大maxstepsタイム ステップ)。[強化学習の学習モニター] ダイアログ ボックスに学習の進行状況を表示 (
VerboseオプションおよびPlotsオプションを設定)。50回の学習エピソードごとに貪欲方策の性能を評価し、5 回のシミュレーションの累積報酬を平均化。評価スコアが
1600のときに学習を停止。
学習オプションの詳細については、rlTrainingOptionsを参照してください。
maxepisodes = 1e4; maxsteps = ceil(Tf/Ts); trainingOpts = rlTrainingOptions(... MaxEpisodes=maxepisodes,... MaxStepsPerEpisode=maxsteps,... Verbose=false,... Plots="training-progress",... StopTrainingCriteria="EvaluationStatistic",... StopTrainingValue=1600); % agent evaluator evl = rlEvaluator(EvaluationFrequency=50, NumEpisodes=5);
再現性のために乱数ストリームを固定します。
rng(0,"twister");関数 train を使用して、エージェントに学習させます。学習は計算量が多いプロセスのため、完了するのに数分かかります。この例の実行時間を節約するために、doTraining を false に設定して事前学習済みのエージェントを読み込みます。エージェントに学習させるには、doTraining を true に設定します。
doTraining =false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts,Evaluator=evl); else % Load a pretrained agent for the example. load("SimulinkPFCDDPG.mat","agent") end

DDPG エージェントのシミュレーション
再現性のために乱数ストリームを固定します。
rng(0,"twister");確定的な初期条件を使用して学習済みエージェントのデモを実行するには、このモデルを Simulink でシミュレートします。ランダムな初期条件を使用して学習済みエージェントの性能を検証するには、userSpecifiedConditions を false に設定します。
userSpecifiedConditions =true; if userSpecifiedConditions e1_initial = -0.4; e2_initial = 0.1; x0_lead = 80; sim(mdl); else simOptions = rlSimulationOptions(MaxSteps=maxsteps); experience = sim(env,agent,simOptions); end




エージェントのシミュレーションの詳細については、rlSimulationOptions および sim を参照してください。
これらのプロットは、先行車両が自車の 70 (m) 先にあるときのシミュレーション結果を示します。
最初の 35 秒間は、相対距離が安全距離より大きいため (右下のプロット)、自車は設定速度に追従します (右上のプロット)。加速して設定速度に到達するために、加速度はほとんどが非負です (左上のプロット)。
35 ~ 42 秒では、相対距離が安全距離より概ね小さいため (右下のプロット)、自車は先行車両の速度と設定速度のうち最小値に追従します。先行車両の速度が設定速度より小さいため (右上のプロット)、先行車両の速度に追従するように、加速度はゼロ以外になります (左上のプロット)。
42 ~ 58 秒では、自車は設定速度に追従し (右上のプロット)、加速度は 0 のままです (左上のプロット)。
58 ~ 60 秒では、相対距離が安全距離より小さくなるため (右下のプロット)、自車は減速して先行車両の速度に追従します。
左下のプロットは、横方向の偏差を示します。このプロットに示されているように、1 秒以内に横方向の偏差が大きく減少しています。横方向の偏差は 0.05 m 未満を維持しています。
previousRngState に保存されている情報を使用して、乱数ストリームを復元します。
rng(previousRngState);
環境リセット関数
function in = localResetFcn(in) % random value for initial position of lead car in = setVariable(in,"x0_lead",40+randi(60,1,1)); % random value for lateral deviation in = setVariable(in,"e1_initial", 0.5*(-1+2*rand)); % random value for relative yaw angle in = setVariable(in,"e2_initial", 0.1*(-1+2*rand)); end
参考
関数
train|sim|rlSimulinkEnv
オブジェクト
ブロック
トピック
- 車線維持支援用 DQN エージェントの学習
- Train Multiple Agents for Path Following Control
- Train Hybrid SAC Agent for Path-Following Control
- Lane Following Using Nonlinear Model Predictive Control (Model Predictive Control Toolbox)
- Lane Following Control with Sensor Fusion and Lane Detection (Automated Driving Toolbox)
- Create Policies and Value Functions
- 深層決定論的方策勾配 (DDPG) エージェント
- Train Reinforcement Learning Agents

