Main Content

並列計算を使用した車線維持支援用 DQN エージェントの学習

この例では、並列学習を使用して、車線維持支援 (LKA) 用の深層 Q 学習ネットワーク (DQN) の学習を Simulink® で実行する方法を説明します。並列学習を使用しないでエージェントに学習させる方法を説明する例については、Train DQN Agent for Lane Keeping Assist (Reinforcement Learning Toolbox)を参照してください。

DQN エージェントの詳細については、Deep Q-Network (DQN) Agents (Reinforcement Learning Toolbox)を参照してください。MATLAB® で DQN エージェントに学習させる例については、Train DQN Agent to Balance Cart-Pole System (Reinforcement Learning Toolbox)を参照してください。

DQN の並列学習の概要

DQN エージェントでは、各ワーカーがエージェントと環境のコピーを使用して新しい経験を生成します。ワーカーは、"N" ステップごとに、ホスト エージェントに経験を送信します。ホスト エージェントは次のようにパラメーターを更新します。

  • 非同期学習の場合、ホスト エージェントは、すべてのワーカーから経験が送信されるのを待たずに、受信した経験から学習し、経験を提供したワーカーに更新後のパラメーターを返信します。その後、ワーカーは更新されたパラメーターを使用して、その環境からの経験の生成を続行します。

  • 同期学習の場合、ホスト エージェントは、すべてのワーカーから経験が送信されるのを待ってから、それらの経験から学習します。その後、ホストは更新されたパラメーターをすべてのワーカーに同時に送信します。次に、すべてのワーカーが更新されたパラメーターを使用して、経験の生成を続行します。

自車の Simulink モデル

この例では、自車の車両運動に関する単純な自転車モデルを強化学習の環境として使用します。学習の目標は、フロント ステアリング角度を調整することにより、車線のセンターラインに沿って自車を走行させ続けることです。この例では、Train DQN Agent for Lane Keeping Assist (Reinforcement Learning Toolbox)と同じ車両モデルを使用します。

m = 1575;   % total vehicle mass (kg)
Iz = 2875;  % yaw moment of inertia (mNs^2)
lf = 1.2;   % longitudinal distance from center of gravity to front tires (m)
lr = 1.6;   % longitudinal 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)
Vx = 15;    % longitudinal velocity (m/s)

サンプル時間 Ts とシミュレーション期間 T を秒単位で定義します。

Ts = 0.1;
T = 15;

LKA システムの出力は、自車のフロント ステアリング角度です。自車の物理的なステアリング範囲をシミュレートするために、ステアリング角度を [–0.5,0.5] rad の範囲に制限します。

u_min = -0.5;
u_max = 0.5;

道路の曲率は定数 0.001 (m-1) で定義されます。横方向の偏差の初期値は 0.2 m、相対ヨー角の初期値は –0.1 rad です。

rho = 0.001;
e1_initial = 0.2;
e2_initial = -0.1;

モデルを開きます。

mdl = 'rlLKAMdl';
open_system(mdl)
agentblk = [mdl '/RL Agent'];

このモデルの場合、次のようにします。

  • エージェントから環境へのステアリング角度アクション信号は、-15 ~ 15 度とする。

  • 環境からの観測値は、横方向の偏差 e1、相対ヨー角 e2、これらの微分 e˙1 および e˙2、これらの積分 e1 および e2 とする。

  • シミュレーションは、横方向の偏差が |e1|>1. となったときに終了する。

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

rt=-(10e12+5e22+2u2+5e˙12+5e˙22)

ここで、u は前のタイム ステップ t-1 からの制御入力です。

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

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

観測の情報を定義します。

observationInfo = rlNumericSpec([6 1],'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1));
observationInfo.Name = 'observations';
observationInfo.Description = 'information on lateral deviation and relative yaw angle';

アクションの情報を定義します。

actionInfo = rlFiniteSetSpec((-15:15)*pi/180);
actionInfo.Name = 'steering';

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

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

このインターフェイスは、-15 ~ 15 度にある 31 のステアリング角度のいずれかをエージェントが適用できる、離散行動空間をもちます。観測値は、横方向の偏差、相対ヨー角、これらの時間微分、これらの時間積分から成る 6 次元のベクトルです。

横方向の偏差と相対ヨー角の初期条件を定義するために、無名関数ハンドルを使用して環境のリセット関数 localResetFcn を指定します。これは、この例の最後で定義されており、横方向の偏差と相対ヨー角の初期値をランダム化します。

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

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

rng(0)

DQN エージェントの作成

DQN エージェントは、一般により効率的な、多出力 Q 値クリティック近似器を使用できます。多出力近似器は、観測値を入力として、状態アクション値を出力としてもちます。各出力要素は、観測値入力で示された状態に対応する離散アクションの実行で得られると予想される累積長期報酬を表します。

クリティックを作成するには、まず、1 つの入力 (観測された 6 次元の状態) と 31 個の要素をから成る 1 つの出力ベクトル (-15 度~ 15 度の範囲で等間隔に配置されたステアリング角度) をもつ深層ニューラル ネットワークを作成します。深層ニューラル ネットワークの値関数表現の作成の詳細については、Create Policies and Value Functions (Reinforcement Learning Toolbox)を参照してください。

nI = observationInfo.Dimension(1);  % number of inputs (6)
nL = 120;                           % number of neurons
nO = numel(actionInfo.Elements);    % number of outputs (31)

dnn = [
    featureInputLayer(nI,'Normalization','none','Name','state')
    fullyConnectedLayer(nL,'Name','fc1')
    reluLayer('Name','relu1')
    fullyConnectedLayer(nL,'Name','fc2')
    reluLayer('Name','relu2')
    fullyConnectedLayer(nO,'Name','fc3')];
dnn = dlnetwork(dnn);

ネットワーク構成を表示します。

figure
plot(layerGraph(dnn))

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

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

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

critic = rlVectorQValueFunction(dnn,observationInfo,actionInfo);

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

agentOpts = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'UseDoubleDQN',true,...
    'CriticOptimizerOptions',criticOptions,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',256);

agentOpts.EpsilonGreedyExploration.EpsilonDecay = 1e-4;

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

agent = rlDQNAgent(critic,agentOpts);

学習オプション

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

  • 最大 10000 個のエピソードについて、それぞれ学習を実行 (各エピソードは最大 ceil(T/Ts) タイム ステップ持続)。

  • Episode Manager のダイアログ ボックスにのみ学習の進行状況を表示 (Plots オプションと Verbose オプションをそれぞれ設定)。

  • エピソードの報酬が -1 に達したときに学習を停止。

  • 累積報酬が 100 を超える各エピソードについてエージェントのコピーを保存。

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

maxepisodes = 10000;
maxsteps = ceil(T/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes, ...
    'MaxStepsPerEpisode',maxsteps, ...
    'Verbose',false,...
    'Plots','none',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue', -1,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',100);

並列学習のオプション

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

  • UseParallel オプションを true に設定。

  • ParallelizationOptions.Mode オプションを "async" に設定し、エージェントの学習を並列で非同期に実行。

trainOpts.UseParallel = true;
trainOpts.ParallelizationOptions.Mode = "async";

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

エージェントの学習

関数 train (Reinforcement Learning Toolbox) を使用して、エージェントに学習させます。エージェントの学習は計算量が多いプロセスのため、完了するのに数分かかります。この例の実行時間を節約するために、doTrainingfalse に設定して事前学習済みのエージェントを読み込みます。エージェントに学習させるには、doTrainingtrue に設定します。並列学習にはランダム性が存在するため、通常、次のプロットとは異なる学習結果が得られます。このプロットは、4 つのワーカーを使用して学習させた結果を示しています。

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load('SimulinkLKADQNParallel.mat','agent')
end

DQN エージェントのシミュレーション

学習済みエージェントの性能を検証するには、次の 2 つの行のコメントを解除し、環境内でこのエージェントをシミュレートします。エージェントのシミュレーションの詳細については、rlSimulationOptions (Reinforcement Learning Toolbox) および sim (Reinforcement Learning Toolbox) を参照してください。

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

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

e1_initial = -0.4;
e2_initial = 0.2;
sim(mdl)

次に示すように、横方向の誤差 (中央プロット) と相対ヨー角 (下部プロット) はいずれも 0 に近づきます。車両はセンターラインから外れた位置 (-0.4 m)、およびヨー角の誤差が 0 でない状態 (0.2 rad) から出発します。LKA によって、2.5 秒後に自車がセンターラインに沿って走行するようになります。ステアリング角度 (上部プロット) は、2 秒後にコントローラーが定常状態に達することを示しています。

ローカル関数

function in = localResetFcn(in)
% reset
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % random value for lateral deviation
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); % random value for relative yaw angle
end

参考

(Reinforcement Learning Toolbox)

関連するトピック