Main Content

アダプティブ クルーズ コントロール用の DDPG エージェントの学習

この例では、アダプティブ クルーズ コントロール (ACC) 用の深層決定方策勾配 (DDPG) エージェントの学習を Simulink® で実行する方法を説明します。DDPG エージェントの詳細については、Deep Deterministic Policy Gradient (DDPG) Agents (Reinforcement Learning Toolbox)を参照してください。

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 とする。

  • 自車の基準速度 Vref を次のように定義する。相対距離が安全距離未満の場合、自車は先行車両の速度と運転手が設定した速度の最小値に追従する。この方法により、自車は先行車両からある程度の距離を維持する。相対距離が安全距離より大きい場合、自車は運転手が設定した速度に追従する。この例では、安全距離は自車の前後方向の速度 V の線形関数、つまり、tgap*V+Ddefault として定義される。安全距離によって、自車の基準追従速度が決まる。

  • 環境からの観測値は、速度誤差 e=Vref-Vego、その積分 e、および自車の前後方向の速度 V とする。

  • シミュレーションは、自車の前後方向の速度が 0 未満となるか、先行車両と自車の相対距離が 0 未満となったときに終了する。

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

rt=-(0.1et2+ut-12)+Mt

ここで、ut-1 は前のタイム ステップからの制御入力です。速度誤差が et2<=0.25 の場合は論理値を Mt=1 とし、そうでない場合は Mt=0 とします。

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

モデルの強化学習環境のインターフェイスを作成します。

観測値の仕様を作成します。

observationInfo = rlNumericSpec([3 1],'LowerLimit',-inf*ones(3,1),'UpperLimit',inf*ones(3,1));
observationInfo.Name = 'observations';
observationInfo.Description = 'information on velocity error and ego velocity';

アクションの仕様を作成します。

actionInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2);
actionInfo.Name = 'acceleration';

環境インターフェイスを作成します。

env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

先行車両の位置の初期条件を定義するために、無名関数ハンドルを使用して環境のリセット関数を指定します。例の終わりに定義されているリセット関数 localResetFcn は、先行車両の初期位置をランダム化します。

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

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

rng('default')

DDPG エージェントの作成

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

L = 48; % number of neurons
statePath = [
    featureInputLayer(3,'Normalization','none','Name','observation')
    fullyConnectedLayer(L,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(L,'Name','fc2')
    additionLayer(2,'Name','add')
    reluLayer('Name','relu2')
    fullyConnectedLayer(L,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')];

actionPath = [
    featureInputLayer(1,'Normalization','none','Name','action')
    fullyConnectedLayer(L, 'Name', 'fc5')];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, actionPath);
    
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
criticNetwork = dlnetwork(criticNetwork);

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

plot(layerGraph(criticNetwork))

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

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

criticOptions = rlOptimizerOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);

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

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

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

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

actorNetwork = [
    featureInputLayer(3,'Normalization','none','Name','observation')
    fullyConnectedLayer(L,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(L,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(L,'Name','fc3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(1,'Name','fc4')
    tanhLayer('Name','tanh1')
    scalingLayer('Name','ActorScaling1','Scale',2.5,'Bias',-0.5)];
actorNetwork = dlnetwork(actorNetwork);

actorOptions = rlOptimizerOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
actor = rlContinuousDeterministicActor(actorNetwork,observationInfo,actionInfo);

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

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'ActorOptimizerOptions',actorOptions,...
    'CriticOptimizerOptions',criticOptions,...
    'ExperienceBufferLength',1e6);
agentOptions.NoiseOptions.Variance = 0.6;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;

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

agent = rlDDPGAgent(actor,critic,agentOptions);

エージェントの学習

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

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

  • Episode Manager のダイアログ ボックスに学習の進行状況を表示。

  • 260 を超えるエピソード報酬をエージェントが受け取ったときに学習を停止。

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

maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',260);

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

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 (Reinforcement Learning Toolbox) および sim (Reinforcement Learning Toolbox) を参照してください。

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

確定的な初期条件を使用して学習済みエージェントのデモを実行するには、このモデルを Simulink でシミュレートします。

x0_lead = 80;
sim(mdl)

以下のプロットは、先行車両が自車の 70 (m) 先にあるときのシミュレーション結果を示します。

  • 最初の 28 秒間は、相対距離が安全距離より大きいため (下部プロット)、自車は設定速度に追従します (中央プロット)。加速して設定速度に到達するために、加速度は正の値です (上部プロット)。

  • 28 ~ 60 秒では、相対距離が安全距離より小さいため (下部プロット)、自車は先行車両の速度と設定速度のうち最小値に追従します。28 ~ 36 秒では、先行車両の速度は設定速度より小さくなります (中央プロット)。減速して先行車両の速度に追従するために、加速度は負の値です (上部プロット)。36 ~ 60 秒では、基準速度に厳密に追従するため、自車は加速度を調整します (中央プロット)。この間、43 ~ 52 秒では自車が設定速度に追従し、36 ~ 43 秒と 52 ~ 60 秒では先行車両の速度に追従します。

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

参考

(Reinforcement Learning Toolbox)

関連するトピック