このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
アダプティブ クルーズ コントロール用の DDPG エージェントの学習
この例では、アダプティブ クルーズ コントロール (ACC) 用の深層決定論的方策勾配 (DDPG) エージェントの学習を Simulink® で実行する方法を説明します。DDPG エージェントの詳細については、深層決定論的方策勾配 (DDPG) エージェントを参照してください。
Simulink モデル
この例では、自車と先行車両に関する単純な縦方向のダイナミクスを強化学習の環境として使用します。学習の目標は、縦方向の加速と減速を制御して、先行車両との安全な距離を維持しつつ、自車を設定速度で走行させることです。この例では、Adaptive Cruise Control System Using Model Predictive Control (Model Predictive Control Toolbox)の例と同じ車両モデルを使用します。
2 台の車両の初期位置と初期速度を指定します。
x0_lead = 50; % initial position for lead car (m) v0_lead = 25; % initial velocity for lead car (m/s) x0_ego = 10; % initial position for ego car (m) v0_ego = 20; % initial velocity for ego car (m/s)
停止時の既定の間隔 (m)、時間ギャップ (s)、および運転手が設定した速度 (m/s) を指定します。
D_default = 10; t_gap = 1.4; v_set = 30;
車両運動の物理的な制約をシミュレートするため、加速度を [–3,2]
m/s^2 の範囲に制限します。
amin_ego = -3; amax_ego = 2;
サンプル時間 Ts
とシミュレーション期間 Tf
を秒単位で定義します。
Ts = 0.1; Tf = 60;
モデルを開きます。
mdl = "rlACCMdl"; open_system(mdl) agentblk = mdl + "/RL Agent";
このモデルの場合、次のようにします。
エージェントから環境への加速アクション信号は、-3 ~ 2 m/s^2 とする。
自車の基準速度 を次のように定義する。相対距離が安全距離未満の場合、自車は先行車両の速度と運転手が設定した速度の最小値に追従する。この方法により、自車は先行車両からある程度の距離を維持する。相対距離が安全距離より大きい場合、自車は運転手が設定した速度に追従する。この例では、安全距離は自車の縦方向の速度 の線形関数、つまり、 として定義される。安全距離によって、自車の基準追従速度が決まる。
環境からの観測値は、速度誤差 、その積分 、および自車の縦方向の速度 とする。
シミュレーションは、自車の縦方向の速度が 0 未満となるか、先行車両と自車の相対距離が 0 未満となったときに終了する。
各タイム ステップ で与えられる報酬 は次のとおりとする。
ここで、 は前のタイム ステップからの制御入力です。速度誤差が の場合は論理値を とし、そうでない場合は とします。
環境インターフェイスの作成
モデルの強化学習環境のインターフェイスを作成します。
観測値の仕様を作成します。
obsInfo = rlNumericSpec([3 1], ... LowerLimit=-inf*ones(3,1), ... UpperLimit=inf*ones(3,1)); obsInfo.Name = "observations"; obsInfo.Description = ... "velocity error and ego velocity";
アクションの仕様を作成します。
actInfo = rlNumericSpec([1 1], ... LowerLimit=-3,UpperLimit=2); actInfo.Name = "acceleration";
環境インターフェイスを作成します。
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
先行車両の位置の初期条件を定義するために、無名関数ハンドルを使用して環境のリセット関数を指定します。例の終わりに定義されているリセット関数 localResetFcn
は、先行車両の初期位置をランダム化します。
env.ResetFcn = @(in)localResetFcn(in);
再現性をもたせるために、乱数発生器のシードを固定します。
rng("default")
DDPG エージェントの作成
DDPG エージェントは、パラメーター化された Q 値関数クリティックを使用して方策の価値を推定します。Q 値関数は、現在の観測値とアクションを入力として取り、単一のスカラーを出力として返します (状態からのアクションが与えられた割引累積長期報酬の推定値は、現在の観測値に対応し、その後の方策に従います)。
パラメーター化された Q 値関数をクリティック内でモデル化するには、2 つの入力層 (そのうち 1 つは obsInfo
で指定された観測チャネル用で、もう 1 つは actInfo
で指定されたアクション チャネル用) と 1 つの出力層 (これはスカラー値を返します) をもつニューラル ネットワークを使用します。
各ネットワーク パスを layer オブジェクトの配列として定義します。prod(obsInfo.Dimension)
および prod(actInfo.Dimension)
を使用して、観測値と行動空間の次元の数を返します。
各パスの入力層と出力層に名前を割り当てます。これらの名前を使用すると、パスを接続してから、ネットワークの入力層と出力層に適切な環境チャネルを明示的に関連付けることができます。
L = 48; % number of neurons % 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");
ネットワークをプロットします。
plot(criticNet)
% Initialize the network and display the number of weights
criticNet = initialize(criticNet)
criticNet = dlnetwork with properties: Layers: [11x1 nnet.cnn.layer.Layer] Connections: [10x2 table] Learnables: [10x3 table] State: [0x3 table] InputNames: {'obsInLyr' 'actInLyr'} OutputNames: {'QValLyr'} Initialized: 1 View summary with summary.
summary(criticNet)
Initialized: true Number of learnables: 5k Inputs: 1 'obsInLyr' 3 features 2 'actInLyr' 1 features
criticNet
、環境の観測仕様とアクション仕様、および環境の観測チャネルとアクション チャネルに接続するネットワーク入力層の名前を使用して、クリティック近似器オブジェクトを作成します。詳細については、rlQValueFunction
を参照してください。
critic = rlQValueFunction(criticNet,obsInfo,actInfo,... ObservationInputNames="obsInLyr",ActionInputNames="actInLyr");
DDPG エージェントは、連続行動空間において、パラメーター化された決定論的方策を使用します。この方策は、連続決定論的アクターによって学習されます。このアクターは、現在の観測値を入力として取り、観測値の決定論的関数であるアクションを出力として返します。
パラメーター化された方策をアクター内でモデル化するには、1 つの入力層 (これは、obsInfo
で指定された、環境観測チャネルのコンテンツを受け取ります) と 1 つの出力層 (これは、actInfo
で指定された、環境アクション チャネルへのアクションを返します) をもつニューラル ネットワークを使用します。
ネットワークを layer オブジェクトの配列として定義します。tanhLayer
およびそれに続く scalingLayer
を使用して、ネットワークの出力をアクション範囲にスケーリングします。
actorNet = [ featureInputLayer(prod(obsInfo.Dimension)) fullyConnectedLayer(L) reluLayer fullyConnectedLayer(L) reluLayer fullyConnectedLayer(L) reluLayer fullyConnectedLayer(prod(actInfo.Dimension)) tanhLayer scalingLayer(Scale=2.5,Bias=-0.5) ];
dlnetwork
オブジェクトに変換します。
actorNet = dlnetwork(actorNet);
ネットワークを初期化し、重みの数を表示します。
actorNet = initialize(actorNet); summary(actorNet)
Initialized: true Number of learnables: 4.9k Inputs: 1 'input' 3 features
actorNet
、および観測仕様とアクション仕様を使用して、アクターを作成します。連続決定論的アクターの詳細については、rlContinuousDeterministicActor
を参照してください。
actor = rlContinuousDeterministicActor(actorNet, ...
obsInfo,actInfo);
rlOptimizerOptions
を使用して、クリティックとアクターの学習オプションを指定します。
criticOptions = rlOptimizerOptions( ... LearnRate=1e-3, ... GradientThreshold=1, ... L2RegularizationFactor=1e-4); actorOptions = rlOptimizerOptions( ... LearnRate=1e-4, ... GradientThreshold=1, ... L2RegularizationFactor=1e-4);
rlDDPGAgentOptions
を使用して、DDPG エージェントのオプション (アクターとクリティックの学習オプションなど) を指定します。
agentOptions = rlDDPGAgentOptions(... SampleTime=Ts,... ActorOptimizerOptions=actorOptions,... CriticOptimizerOptions=criticOptions,... ExperienceBufferLength=1e6);
ドット表記を使用してエージェントのオプションを設定または変更することもできます。
agentOptions.NoiseOptions.Variance = 0.6; agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;
または、最初にエージェントを作成してから、ドット表記を使用してそのオプション オブジェクトにアクセスしてオプションを変更することもできます。
指定したアクター表現、クリティック表現、およびエージェントのオプションを使用して DDPG エージェントを作成します。詳細については、rlDDPGAgent
を参照してください。
agent = rlDDPGAgent(actor,critic,agentOptions);
エージェントの学習
エージェントに学習させるには、まず、学習オプションを指定します。この例では、次のオプションを使用します。
最大
5000
個のエピソードについて、各エピソードの学習を実行 (各エピソードは最大 600 タイム ステップ持続)。Episode Manager のダイアログ ボックスに学習の進行状況を表示。
260 を超えるエピソード報酬をエージェントが受け取ったときに学習を停止。
詳細については、rlTrainingOptions
を参照してください。
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainingOpts = rlTrainingOptions(... MaxEpisodes=maxepisodes,... MaxStepsPerEpisode=maxsteps,... Verbose=false,... Plots="training-progress",... StopTrainingCriteria="EpisodeReward",... StopTrainingValue=260);
関数 train
を使用して、エージェントに学習させます。学習は計算量が多いプロセスのため、完了するのに数分かかります。この例の実行時間を節約するために、doTraining
を false
に設定して事前学習済みのエージェントを読み込みます。エージェントに学習させるには、doTraining
を true
に設定します。
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load a pretrained agent for the example. load("SimulinkACCDDPG.mat","agent") end
DDPG エージェントのシミュレーション
学習済みエージェントの性能を検証するには、以下のコマンドを使用して Simulink 環境内でこのエージェントをシミュレートします。エージェントのシミュレーションの詳細については、rlSimulationOptions
および sim
を参照してください。
simOptions = rlSimulationOptions(MaxSteps=maxsteps); experience = sim(env,agent,simOptions);
確定的な初期条件を使用して学習済みエージェントのデモを実行するには、このモデルを Simulink でシミュレートします。
x0_lead = 80; sim(mdl)
以下のプロットは、先行車両が自車の 70 (m) 先にあるときのシミュレーション結果を示します。
最初の 35 秒間は、相対距離が安全距離より大きいため (下部プロット)、自車は設定速度に追従します (中央プロット)。加速して設定速度に到達するために、最初の加速度は正の値です (上部プロット)。
35 ~ 48 秒では、相対距離が安全距離より小さいため (下部プロット)、自車は先行車両の速度と設定速度のうち最小値に追従します。減速して先行車両の速度に追従するために、35 秒~約 37 秒の間に加速度が負になります (上部プロット)。その後、自車は、相対距離が安全な距離とみなせるかどうかに応じて、先行車両の速度と設定速度のうち小さいほうに追従し (または設定速度に追従し)、加速度を調整します。
Simulink モデルを閉じます。
bdclose(mdl)
リセット関数
function in = localResetFcn(in) % Reset the initial position of the lead car. in = setVariable(in,"x0_lead",40+randi(60,1,1)); end
参考
関数
train
|sim
|rlSimulinkEnv
オブジェクト
rlDDPGAgent
|rlDDPGAgentOptions
|rlQValueFunction
|rlContinuousDeterministicActor
|rlTrainingOptions
|rlSimulationOptions
|rlOptimizerOptions
ブロック
関連する例
- Train Multiple Agents for Path Following Control
- 経路追従制御用の DDPG エージェントの学習
- Train DQN Agent for Lane Keeping Assist
- Adaptive Cruise Control System Using Model Predictive Control (Model Predictive Control Toolbox)