浅層ニューラル ネットワークによるデータの当てはめ
ニューラル ネットワークは、関数近似に適しています。実際、非常に単純なニューラル ネットワークはどの実質的な関数にも当てはまることが証明されています。
たとえば、診療所から得られたデータがあるとします。13 個の解剖学的測定値を使用して、人の体脂肪率を予測するネットワークを設計する必要があります。合計で 252 人分の標本があり、各標本には 13 項目のデータと、それに関連付けられた体脂肪率があります。
この問題は 2 つの方法で解くことができます。
ニューラル ネット フィッティング アプリを使用したデータへの当てはめの説明に従って、ニューラル ネット フィッティング アプリを使用。
コマンド ライン関数を使用したデータへの当てはめの説明に従って、コマンド ライン関数を使用。
通常、はじめにアプリを使用し、次にアプリを使用してコマンド ライン スクリプトを自動的に生成することをお勧めします。どちらの方法を使用する場合にも、まずデータ セットを選択することによって問題を定義します。それぞれのニューラル ネットワーク アプリから多くのサンプル データ セットにアクセスし、これらを使用してツールボックスを試すことができます (浅層ニューラル ネットワーク用のサンプル データ セットを参照してください)。特定の問題を解く必要がある場合、独自のデータをワークスペースに読み込むことができます。次の節では、データ形式について説明します。
ヒント
深層学習ニューラル ネットワークを対話的に構築して可視化するには、ディープ ネットワーク デザイナー アプリを使用します。詳細については、ディープ ネットワーク デザイナー入門を参照してください。
問題の定義
ツールボックスに対して近似 (回帰) 問題を定義するには、一連の入力ベクトル (予測子) を行列の列として配置します。次に、一連の応答 (各入力ベクトルの正しい出力ベクトル) を 2 番目の行列に配置します。たとえば、それぞれ 2 つの入力の特徴と 1 つの応答をもつ 4 つの観測値の回帰問題は、次のように定義できます。
predictors = [0 1 0 1; 0 0 1 1]; responses = [0 0 0 1];
次の節では、ニューラル ネット フィッティング アプリを使用して、データ セットに当てはまるようにネットワークに学習させる方法を説明します。この例では、ツールボックスに用意されているサンプル データ セットを使用します。
ニューラル ネット フィッティング アプリを使用したデータへの当てはめ
この例では、"ニューラル ネット フィッティング" アプリを使用して、データに当てはまるように浅層ニューラル ネットワークに学習させる方法を説明します。
nftool
を使用して、"ニューラル ネット フィッティング" アプリを開きます。
nftool
データの選択
"ニューラル ネット フィッティング" アプリには、ニューラル ネットワークの学習を始めるのに役立つサンプル データが用意されています。
サンプルの体脂肪データをインポートするには、[インポート]、[体脂肪データ セットのインポート] を選択します。このデータ セットを使用して、さまざまな測定値に基づいて人の体脂肪を推定するように、ニューラル ネットワークに学習させることができます。ファイルまたはワークスペースから自分のデータをインポートする場合は、予測子と応答、および観測値が行と列のどちらで与えられるかを指定しなければなりません。
インポートしたデータに関する情報は、[モデルの概要] に表示されます。このデータ セットには、それぞれ 13 個の特徴をもつ 252 個の観測値が含まれています。応答には、各観測値に対する体脂肪率が含まれています。
データを学習セット、検証セット、テスト セットに分割します。既定の設定はそのままにします。データを以下のように分割します。
学習用に 70% を使用。
ネットワークが汎化されていることを検証し、過適合の発生前に学習を停止するために 15% を使用。
ネットワークの汎化の独立したテスト用に 15% を使用。
データ分割の詳細については、ニューラル ネットワークの最適な学習のためのデータの分割を参照してください。
ネットワークの作成
このネットワークは、隠れ層にシグモイド伝達関数、出力層に線形伝達関数を使用した 2 層フィードフォワード ネットワークです。[層のサイズ] の値は、隠れニューロンの数を定義します。既定の層のサイズ (10) はそのままにします。ネットワーク アーキテクチャは [ネットワーク] ペインで確認できます。入力データが反映されるように、ネットワークのプロットが更新されます。この例のデータには、13 個の入力 (特徴) と 1 つの出力が含まれています。
ネットワークの学習
ネットワークの学習を行うには、[学習]、[レーベンバーグ・マルカート法を用いた学習] を選択します。これは既定の学習アルゴリズムで、[学習] をクリックした場合と同じです。
レーベンバーグ・マルカート法 (trainlm
) による学習は、ほとんどの問題に対して推奨されます。ノイズを含む問題や小規模な問題の場合は、ベイズ正則化 (trainbr
) を使用することで、かかる時間は長くなりますが、より良い解が得られます。大規模な問題の場合には、スケーリング共役勾配法 (trainscg
) を使用することをお勧めします。この方法では、他の 2 つのアルゴリズムで使用されるヤコビアン計算よりメモリ効率の高い勾配計算が使用されるためです。
[学習] ペインで学習の進行状況を確認できます。いずれかの停止条件が満たされるまで学習が続行されます。この例では、6 回の連続する検証の反復において、検証誤差が常に前回の最小検証誤差以上となるまで ("検証基準に適合" するまで) 学習が続行されます。
結果の解析
[モデルの概要] に、学習アルゴリズムの情報および各データ セットに対する学習結果が表示されます。
プロットを生成すると、結果をさらに詳しく解析できます。線形回帰をプロットするには、[プロット] セクションで [回帰] をクリックします。回帰プロットでは、学習セット、検証セット、およびテスト セットの応答 (ターゲット) に関するネットワーク予測 (出力) が表示されます。
完全に当てはまる場合、データが 45 度の線に沿って分布し、ネットワーク出力が応答と等しくなるはずです。この問題では、すべてのデータ セットについて適正に当てはめられています。より正確な結果を得る必要がある場合は、[学習] を再度クリックしてネットワークに再学習させることができます。学習を行うたびにネットワークの初期の重みとバイアスが変更されるため、再学習後に改善されたネットワークが生成される可能性があります。
誤差ヒストグラムを表示して、ネットワーク性能に関する追加の検証を取得します。[プロット] セクションで [誤差ヒストグラム] をクリックします。
棒グラフの青色の部分は学習データ、緑色の部分は検証データ、赤色の部分はテスト データを表します。ヒストグラムでは、外れ値、すなわち大部分のデータと比べて近似の精度が著しく低いデータ点を確認できます。外れ値を確認して、データが不適切でないか、またはこれらのデータ点が残りのデータ セットと異なっていないかを判断することをお勧めします。外れ値が有効なデータ点であるにもかかわらず、残りのデータとは異なっている場合、ネットワークはこれらの点に対して外挿を行います。外れ値点のように見えるデータをさらに収集し、ネットワークの再学習を行う必要があります。
ネットワーク性能に満足できない場合、次のいずれかを行うことができます。
ネットワークに再度学習させる。
隠れニューロンの数を増やす。
より大規模な学習データ セットを使用する。
学習セットでの性能は良好であるにもかかわらず、テスト セットでの性能が低い場合は、モデルが過適合となっている可能性があります。ニューロンの数を減らすことによって過適合を軽減できます。
追加のテスト セットでネットワーク性能を評価することもできます。ネットワークを評価するための追加のテスト データを読み込むには、[テスト] セクションで [テスト] をクリックします。[モデルの概要] に、追加のテスト結果が表示されます。プロットを生成して追加のテスト データの結果を解析することもできます。
コードの生成
[コード生成]、[単純な学習スクリプトを生成] を選択して MATLAB コードを作成することにより、コマンド ラインで以前に実行したステップを再現できます。MATLAB コードの作成は、ツールボックスのコマンド ライン機能を使用して学習プロセスをカスタマイズする方法を学ぶ必要がある場合に便利です。コマンド ライン関数を使用したデータへの当てはめでは、生成されるスクリプトについてさらに詳しく説明します。
ネットワークのエクスポート
学習済みネットワークをワークスペースまたは Simulink® にエクスポートできます。MATLAB Compiler™ ツールなどの MATLAB コード生成ツールを使用してネットワークを展開することもできます。学習済みネットワークとその結果をエクスポートするには、[モデルのエクスポート]、[ワークスペースにエクスポート] を選択します。
コマンド ライン関数を使用したデータへの当てはめ
ツールボックスのコマンド ライン機能の使用方法を学ぶ最も簡単な方法は、アプリからスクリプトを生成し、これらのスクリプトを変更してネットワークの学習をカスタマイズすることです。例として、前の節で ニューラル ネット フィッティング アプリを使用して作成した簡単なスクリプトを見てみましょう。
% Solve an Input-Output Fitting problem with a Neural Network % Script generated by Neural Fitting app % Created 15-Mar-2021 10:48:13 % % This script assumes these variables are defined: % % bodyfatInputs - input data. % bodyfatTargets - target data. x = bodyfatInputs; t = bodyfatTargets; % Choose a Training Function % For a list of all training functions type: help nntrain % 'trainlm' is usually fastest. % 'trainbr' takes longer but may be better for challenging problems. % 'trainscg' uses less memory. Suitable in low memory situations. trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation. % Create a Fitting Network hiddenLayerSize = 10; net = fitnet(hiddenLayerSize,trainFcn); % Setup Division of Data for Training, Validation, Testing net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Train the Network [net,tr] = train(net,x,t); % Test the Network y = net(x); e = gsubtract(t,y); performance = perform(net,t,y) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, ploterrhist(e) %figure, plotregression(t,y) %figure, plotfit(net,x,t)
スクリプトを保存してコマンド ラインから実行すると、前の学習セッションの結果を再現できます。スクリプトを編集して、学習プロセスをカスタマイズすることもできます。この場合、スクリプトの各ステップに従います。
データの選択
このスクリプトは、予測子ベクトルと応答ベクトルがワークスペースに読み込み済みであると仮定しています。データが読み込まれていない場合、次のように読み込むことができます。
load bodyfat_dataset
このコマンドは、予測子 bodyfatInputs
と応答 bodyfatTargets
をワークスペースに読み込みます。
このデータ セットは、ツールボックスに含まれるサンプル データ セットの 1 つです。使用可能なデータ セットの詳細については、浅層ニューラル ネットワーク用のサンプル データ セットを参照してください。help nndatasets
コマンドを入力することによって、使用可能なすべてのデータ セットの一覧を表示することもできます。独自の変数名を使用して、これらのデータ セットから変数を読み込むことができます。たとえば、次のコマンド
[x,t] = bodyfat_dataset;
は、体脂肪の予測子を配列 x
に読み込み、体脂肪の応答を配列 t
に読み込みます。
学習アルゴリズムの選択
学習アルゴリズムを選択します。ネットワークの学習には、既定のレーベンバーグ・マルカート法アルゴリズム (trainlm
) を使用します。
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
レーベンバーグ・マルカート法によって目的どおりの正確な結果を生成できない問題の場合にはネットワーク学習関数をベイズ正則化 (trainbr
) に、あるいは、データが大規模な問題の場合にはネットワーク学習関数をスケーリング共役勾配法 (trainscg
) に設定することを検討してください。
net.trainFcn = 'trainbr'; net.trainFcn = 'trainscg';
ネットワークの作成
ネットワークを作成します。関数近似 (または回帰) 問題用の既定のネットワーク fitnet
は、隠れ層に既定の正接シグモイド伝達関数、出力層に線形伝達関数を使用したフィードフォワード ネットワークです。このネットワークには、10 個のニューロンがある 1 つの隠れ層があります (既定)。各入力ベクトルには応答値が 1 つだけ関連付けられているため、ネットワークの出力ニューロンは 1 個になります。
hiddenLayerSize = 10; net = fitnet(hiddenLayerSize,trainFcn);
メモ
ニューロンの数を増やすと、必要な計算量が多くなります。数が多すぎる場合にはデータへの過適合が生じる可能性が高くなりますが、より複雑な問題をそのネットワークで解けるようになります。層の数を増やすと、必要な計算量が多くなりますが、複雑な問題をそのネットワークでより効率的に解けるようになる可能性があります。複数の隠れ層を使用するには、隠れ層のサイズを fitnet
コマンドの配列の要素として入力します。
データの分割
データの分割を設定します。
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
これらの設定では、予測子ベクトルおよび応答ベクトルはランダムに分割されます。70% は学習、15% は検証、および 15% はテストに使用されます。データ分割プロセスの詳細については、ニューラル ネットワークの最適な学習のためのデータの分割を参照してください。
ネットワークの学習
ネットワークに学習をさせます。
[net,tr] = train(net,x,t);
学習中は、学習の進行状況を示すウィンドウが開きます。停止ボタン をクリックすると、任意の時点で学習を中断できます。
学習は、6 回の連続した検証の反復において、検証誤差が常に前回の最小検証誤差以上となったときに終了しました。学習ウィンドウで [パフォーマンス] をクリックすると、次の図に示すように、学習誤差、検証誤差、およびテスト誤差のプロットが表示されます。次の点を考慮すると、この例の結果は妥当であると言えます。
最終的な平均二乗誤差が小さい。
テスト セットの誤差と検証セットの誤差の特性が似ている。
(検証性能が最良である) エポック 13 までに著しい過適合が発生していない。
ネットワークのテスト
ネットワークをテストします。ネットワークの学習が終わったら、これを使用してネットワークの出力を計算できます。次のコードでは、ネットワークの出力、誤差、および全体的な性能が計算されます。
y = net(x); e = gsubtract(t,y); performance = perform(net,t,y)
performance = 16.2815
学習記録にあるテスト インデックスを使用することで、テスト セットのみでネットワーク性能を計算することも可能です。詳細については、学習後の浅層ニューラル ネットワークの性能分析を参照してください。
tInd = tr.testInd; tstOutputs = net(x(:,tInd)); tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform = 20.1698
ネットワークの表示
ネットワーク図を表示します。
view(net)
結果の解析
結果を解析します。ネットワーク予測 (出力) とそれに対応する応答 (ターゲット) との間の線形回帰を実行するには、学習ウィンドウで [回帰] をクリックします。
出力は、学習セット、テスト セット、および検証セットの応答にうまく追従しています。R 値は、データ セット全体で 0.87 を上回っています。より正確な結果が必要な場合、次のいずれかの方法を試してください。
この場合、ネットワーク応答は満足のいくものであるため、ネットワークを新しいデータに使用できます。
次のステップ
コマンド ライン操作に慣れるため、次のタスクを試してみましょう。
学習中にプロット ウィンドウ (回帰プロットなど) を開き、アニメーションを見る。
plotfit
、plotregression
、plottrainstate
、plotperform
などの関数を使用して、コマンド ラインからプロットする
また、コマンド ラインから学習を行う場合、その他のオプションについては高度なスクリプトを参照してください。
ニューラル ネットワークでは、学習を行うたびに異なる解が得られる可能性がありますが、これは初期の重みとバイアスの値がランダムであり、学習セット、検証セット、テスト セットへのデータの分割が異なるためです。このため、別のニューラル ネットワークが同じ問題について学習した場合、入力が同じでも出力が異なる場合があります。ニューラル ネットワークで高い精度が得られるようにするためには、何度か再学習を行います。
高い精度が必要な場合は、初期解を改善するための手法が他にいくつかあります。詳細については、浅層ニューラル ネットワークの汎化の改善と過適合の回避を参照してください。
参考
ニューラル ネット フィッティング | ニューラル ネット時系列 | ニューラル ネット パターン認識 | ニューラル ネット クラスタリング | ディープ ネットワーク デザイナー | trainlm
| fitnet