Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB スクリプトによる規範モデル コントローラーの作成

ここまで、このトピックでは、いくつかの具体的な動的ネットワーク アーキテクチャの学習手順について説明してきました。ただし、ツールボックスで作成できる "どの" ネットワークも、ネットワークのコンポーネントが微分可能である限り、浅層の多層ニューラル ネットワークと逆伝播学習で説明した学習関数を使用して学習させることができます。この節では、カスタム アーキテクチャを作成して学習させる方法の例を示します。使用するカスタム アーキテクチャは、Simulink によるモデル規範形ニューラル コントローラーの設計で詳しく説明されているモデル規範形適応制御 (MRAC) システムです。

Simulink によるモデル規範形ニューラル コントローラーの設計からわかるように、モデル規範形制御アーキテクチャには 2 つのサブネットワークがあります。一方のサブネットワークは、制御対象のプラントのモデルです。他方のサブネットワークはコントローラーです。まず、プラント モデル サブネットワークになる NARX ネットワークに学習させます。この例では、Simulink によるモデル規範形ニューラル コントローラーの設計で説明されているように、ロボット アームを使用してプラントを表します。次のコードは、ロボット アームから収集されたデータを読み込み、NARX ネットワークを作成して学習させます。この簡単な問題の場合、データを前処理する必要がなく、すべてのデータを学習に使用できるため、データ分割は不要です。

[u,y] = robotarm_dataset;
d1 = [1:2];
d2 = [1:2];
S1 = 5;
narx_net = narxnet(d1,d2,S1);
narx_net.divideFcn = '';
narx_net.inputs{1}.processFcns = {};
narx_net.inputs{2}.processFcns = {};
narx_net.outputs{2}.processFcns = {};
narx_net.trainParam.min_grad = 1e-10;
[p,Pi,Ai,t] = preparets(narx_net,u,{},y);
narx_net = train(narx_net,p,t,Pi);
narx_net_closed = closeloop(narx_net);
view(narx_net_closed)

結果として得られるネットワークが図に示されます。

NARX プラント モデルに学習させたら、MRAC システム全体を作成し、その中に NARX モデルを挿入できます。フィードフォワード ネットワークから始めて、フィードバック結合を追加します。また、プラント モデル サブネットワークは既に学習済みのため、学習をオフにします。学習の次の段階は、コントローラー サブネットワークのみの学習です。

mrac_net = feedforwardnet([S1 1 S1]);
mrac_net.layerConnect = [0 1 0 1;1 0 0 0;0 1 0 1;0 0 1 0];
mrac_net.outputs{4}.feedbackMode = 'closed';
mrac_net.layers{2}.transferFcn = 'purelin';
mrac_net.layerWeights{3,4}.delays = 1:2;
mrac_net.layerWeights{3,2}.delays = 1:2;
mrac_net.layerWeights{3,2}.learn = 0;
mrac_net.layerWeights{3,4}.learn = 0;
mrac_net.layerWeights{4,3}.learn = 0;
mrac_net.biases{3}.learn = 0;
mrac_net.biases{4}.learn = 0;

次のコードは、この例の問題には必要のないデータ分割と前処理をオフにします。また、特定の層に必要な遅延を設定し、ネットワークに名前を付けます。

mrac_net.divideFcn = '';
mrac_net.inputs{1}.processFcns = {};
mrac_net.outputs{4}.processFcns = {};
mrac_net.name = 'Model Reference Adaptive Control Network';
mrac_net.layerWeights{1,2}.delays = 1:2;
mrac_net.layerWeights{1,4}.delays = 1:2;
mrac_net.inputWeights{1}.delays = 1:2;

ネットワークを構成するには、標本学習データがいくつか必要です。次のコードは、学習データを読み込んでプロットし、ネットワークを構成します。

[refin,refout] = refmodel_dataset;
ind = 1:length(refin);
plot(ind,cell2mat(refin),ind,cell2mat(refout))
mrac_net = configure(mrac_net,refin,refout);

閉ループ MRAC システムが、このデータの生成に使用した規範モデルと同じように応答する必要があります (規範モデルの説明については、Model Reference Controller ブロックの使用を参照してください)。

ここで、学習済みのプラント モデル ネットワークから MRAC システムの適切な場所に重みを挿入します。

mrac_net.LW{3,2} = narx_net_closed.IW{1};
mrac_net.LW{3,4} = narx_net_closed.LW{1,2};
mrac_net.b{3} = narx_net_closed.b{1};
mrac_net.LW{4,3} = narx_net_closed.LW{2,1};
mrac_net.b{4} = narx_net_closed.b{2};

コントローラー ネットワークの出力重みは 0 に設定できます。これにより、プラントの初期入力が 0 になります。

mrac_net.LW{2,1} = zeros(size(mrac_net.LW{2,1}));
mrac_net.b{2} = 0;

プロットおよびネットワークに必要な学習関数を関連付けることもできます。

mrac_net.plotFcns = {'plotperform','plottrainstate',...
    'ploterrhist','plotregression','plotresponse'};
mrac_net.trainFcn = 'trainlm';

最終的な MRAC ネットワークは、次のコマンドを使用して表示できます。

view(mrac_net)

層 3 および層 4 (出力) はプラント モデル サブネットワークを構成します。層 1 および層 2 はコントローラーを構成します。

次に、学習データを準備し、ネットワークに学習させます。

[x_tot,xi_tot,ai_tot,t_tot] = ...
    preparets(mrac_net,refin,{},refout);
mrac_net.trainParam.epochs = 50;
mrac_net.trainParam.min_grad = 1e-10;
[mrac_net,tr] = train(mrac_net,x_tot,t_tot,xi_tot,ai_tot);

メモ:

ここでは、学習関数 trainlm を使用していますが、浅層の多層ニューラル ネットワークと逆伝播学習で説明されている、どの学習関数も同様に使用できます。ツールボックスで作成できるネットワークは、それらのどの学習関数を使用しても学習させることができます。唯一の制限は、ネットワークのすべての部分が微分可能でなければならないという点です。

MRAC システムの学習は、NARX プラント モデルの学習よりもはるかに時間がかかることがわかります。これは、ネットワークが再帰型であり、動的な逆伝播を使用しなければならないためです。これについては、ツールボックス ソフトウェアによって自動的に決定されるため、ユーザーが介入する必要はありません。動的な逆伝播には複数の実装があり ([DeHa07] を参照)、選択されたネットワーク アーキテクチャと学習アルゴリズムに対して最も効率的な実装が自動的に決定されます。

ネットワークの学習が終わったら、テスト入力を MRAC ネットワークに適用して動作をテストできます。次のコードは、ランダムな高さと幅をもつ一連のステップであるテスト データ セットを作成し、学習済みの MRAC ネットワークに適用します。

numBuildings = 10;
numDataPoints = 100;

buildingHeights = (rand(numBuildings,1)*2) - 1;
skylineData = zeros(1,numBuildings*numDataPoints);

for i = 1:numBuildings
    startIndex = (i - 1)*numDataPoints + 1;
    endIndex = i*numDataPoints;
    skylineData(startIndex:endIndex) = buildingHeights(i);
end

testin = skylineData;
testinseq = con2seq(testin);
testoutseq = mrac_net(testinseq);
testout = cell2mat(testoutseq);
figure
plot([testin' testout'])

図からわかるように、プラント モデル出力は規範入力に従い、入力シーケンスが学習データの入力シーケンスと異なる場合でも、正しい臨界減衰応答が現れます。定常状態応答は各ステップで不完全ですが、これは、学習セットを大きくし、おそらくはさらに隠れニューロンを増やすと改善される可能性があります。

この例は、独自のカスタム動的ネットワークを作成し、標準のツールボックス学習関数を変更せずに使用して、ネットワークの学習が可能なことを示すのが目的でした。ツールボックスで作成できるすべてのネットワークは、ネットワークの各コンポーネントの確定的に微分される限り、標準的な学習関数によって学習させることができます。

再帰型ネットワークは、フィードフォワード ネットワークよりも学習させるのが一般的に難しいことを覚えておいてください。こうした学習上の困難な問題に関する説明については、[HDH09] を参照してください。