Simulink環境を作成し、エージェントをトレーニングします
この例は、ウォータータンクSimulink®モデルでPIコントローラーを変換する方法を示しています。Reinforcement Learning Deep Deterministic Strategy Gradient(DDPG)エージェントを使用します。
水槽モデル
この例の元のモデルは、水タンクモデルです。目的は、水タンクの水位を制御することです。
次の変更を行って、元のモデルを変更します。
-
PIDコントローラーを削除します。
-
RLエージェントブロックを挿入します。
-
観測ベクトルを接続します[∫edteh] [\ int e \、dt \、e \、h][ ∫ed teh ]、hhでhは水タンクの高さe = r − he = r − he=R -時間と$ R $はリファレンスの高さがあります。
-
報酬報酬= 10(∣e∣ <0.1)− 1(∣e∣≥0.1)− 100(h≤0∣∣h≥20)10(| e | <0.1)-1(| e | \ geq 0.1 )-100(h \ leq0 || h \ geq20)1 0 (∣ e ∣<0 。1 )−1 (∣ e ∣≥0 。1 )−1 0 0 (h≤0 ∣ ∣ h≥2 0 )。
-
次の条件でシミュレーションが停止するように終了信号を設定しますh≤0h≤0h≤0またはh≥20h≥20h≥2 0。
open_system('rlwatertank')
環境インターフェースの作成
環境モデルの作成には、以下の定義が含まれます。
-
エージェントが環境と対話するために使用するアクションと観測信号。
-
エージェントは報酬シグナルを使用して成功を測定します。
obsInfo = rlNumericSpec([3 1],...
'LowerLimit',[-inf -inf 0 ]',...
'UpperLimit',[ inf inf inf]');
obsInfo.Name = 'observations';
obsInfo.Description = 'integrated error, error, and measured height';
numObservations = obsInfo.Dimension(1);
actInfo = rlNumericSpec([1 1]);
actInfo.Name = 'flow';
numActions = actInfo.Dimension(1);
環境インターフェイスオブジェクトを構築します。
env = rlSimulinkEnv('rlwatertank','rlwatertank/RL Agent',...
obsInfo,actInfo);
モデルの参照値をランダム化するカスタムリセット機能を設定します。
env.ResetFcn = @(in)localResetFcn(in);
シミュレーション時間Tfとエージェントサンプリング時間Tsを秒単位で指定します。
Ts = 1.0;
Tf = 200;
ランダムジェネレータシードを修正して、再現性を向上させます。
rng(0)
DDPGエージェントを作成する
観察と操作が与えられると、DDPGエージェントはレビューア値関数を使用しておおよその長期的な報酬を表現します。コメント投稿者を作成するには、最初に、2つの入力、つまり観測とアクション、および1つの出力を持つディープニューラルネットワークを作成する必要があります。ディープニューラルネットワークの値関数表現の作成の詳細については、「戦略と値関数表現の作成」を参照してください。
statePath = [
imageInputLayer([numObservations 1 1],'Normalization','none','Name','State')
fullyConnectedLayer(50,'Name','CriticStateFC1')
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(25,'Name','CriticStateFC2')];
actionPath = [
imageInputLayer([numActions 1 1],'Normalization','none','Name','Action')
fullyConnectedLayer(25,'Name','CriticActionFC1')];
commonPath = [
additionLayer(2,'Name','add')
reluLayer('Name','CriticCommonRelu')
fullyConnectedLayer(1,'Name','CriticOutput')];
criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,commonPath);
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');
コメント投稿者のネットワークの構成を観察します。
figure
plot(criticNetwork)
指定されたコメンターによって表されるrlRepresentationOptionsを使用します。
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
指定されたディープニューラルネットワークとオプションを使用して、コメンター表現を作成します。また、環境インターフェースから取得できるレビュー担当者の操作と観察の仕様を指定する必要があります。
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{
'State'},'Action',{
'Action'},criticOpts);
観察結果が与えられると、DDPGエージェントは参加者の表現を使用して実行するアクションを決定します。キャラクターを作成するには、最初に1つの入力(観測)と1つの出力(アクション)を持つディープニューラルネットワークを作成する必要があります。
批評家と同様の方法でアクターを構築します。
actorNetwork = [
imageInputLayer([numObservations 1 1],'Normalization','none','Name','State')
fullyConnectedLayer(3, 'Name','actorFC')
tanhLayer('Name','actorTanh')
fullyConnectedLayer(numActions,'Name','Action')
];
actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{
'State'},'Action',{
'Action'},actorOptions);
DDPGエージェントを作成するには、最初にを使用してDDPGエージェントオプションrlDDPGAgentOptionsを指定します。
agentOpts = rlDDPGAgentOptions(...
'SampleTime',Ts,...
'TargetSmoothFactor',1e-3,...
'DiscountFactor',1.0, ...
'MiniBatchSize',64, ...
'ExperienceBufferLength',1e6);
agentOpts.NoiseOptions.Variance = 0.3;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
次に、指定された参加者表現、コメント投稿者表現、およびエージェントオプションを使用してDDPGエージェントを作成します。
agent = rlDDPGAgent(actor,critic,agentOpts);
トレーニングエージェント
エージェントをトレーニングするには、最初にトレーニングオプションを指定します。この例では、次のオプションを使用します。
-
各トレーニングは最大5000回実行されます。各エピソードが最大200回続くように指定します。
-
[プロットマネージャー]ダイアログボックスにトレーニングの進行状況を表示し([プロット]オプションを設定)、コマンドライン表示を無効にします([詳細]オプションをfalseに設定します)。
-
20回の連続エピソードでエージェントが獲得した平均累積報酬が800を超える場合は、トレーニングを停止してください。このとき、エージェントは水タンクの水位を制御できます。
maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainOpts = rlTrainingOptions(...
'MaxEpisodes',maxepisodes, ...
'MaxStepsPerEpisode',maxsteps, ...
'ScoreAveragingWindowLength',20, ...
'Verbose',false, ...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',800);
トレイン機能を使用して、エージェントをトレーニングします。トレーニングは計算量の多いプロセスであり、完了するまでに数分かかります。この例の実行時間を節約するために、doTrainingをに設定して事前トレーニング済みエージェントfalseをロードしてください。エージェントを自分でトレーニングするには、doTrainingをtrueに設定してください。
doTraining = false;
if doTraining
% Train the agent.
trainingStats = train(agent,env,trainOpts);
else
% Load the pretrained agent for the example.
load('WaterTankDDPG.mat','agent')
end
訓練を受けたエージェントを検証する
シミュレーションを通じて、学習したエージェントをモデルに対して検証します。
simOpts = rlSimulationOptions('MaxSteps',maxsteps,'StopOnError','on');
experiences = sim(env,agent,simOpts);
ローカル機能
function in = localResetFcn(in)
% randomize reference signal
blk = sprintf('rlwatertank/Desired \nWater Level');
h = 3*randn + 10;
while h <= 0 || h >= 20
h = 3*randn + 10;
end
in = setBlockParameter(in,blk,'Value',num2str(h));
% randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20
h = 3*randn + 10;
end
blk = 'rlwatertank/Water-Tank System/H';
in = setBlockParameter(in,blk,'InitialCondition',num2str(h));
end