ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

浅いニューラル ネットワークによるデータのあてはめ

ニューラル ネットワークは、関数近似に適しています。実際、非常に単純なニューラル ネットワークで実質的にどのような関数にもあてはめられることが証明されています。

たとえば、診療所から得られたデータがあるとします。13 個の解剖学的測定値を使用して、人の体脂肪率を予測するネットワークを設計する必要があります。合計で 252 人分の標本があり、各標本には 13 項目のデータと、それに関連付けられた体脂肪率があります。

この問題は 2 つの方法で解くことができます。

通常、はじめに GUI を使用し、次に GUI を使用してコマンド ライン スクリプトを自動的に生成することをお勧めします。どちらの方法を使用する場合にも、まずデータセットを選択することによって問題を定義します。それぞれの GUI から多くの標本データセットにアクセスし、これらを使用してツールボックスの機能を試すことができます (浅いニューラル ネットワーク用の標本データセットを参照してください)。特定の問題を解く必要がある場合、独自のデータをワークスペースに読み込むことができます。次の節では、データ形式について説明します。

問題の定義

ツールボックスに対して近似問題を定義するには、一連の Q 個の入力ベクトルを行列の列として配置します。次に、別の Q 個のターゲット ベクトル (各入力ベクトルの正しい出力ベクトル) を 2 番目の行列に配置します (静的データおよび時系列データのデータ書式設定の詳細は、Data Structures を参照してください)。たとえば、Boolean AND ゲートの近似問題は、2 要素入力ベクトルと 1 要素ターゲット ベクトルの 4 つのセットを使用して次のように定義できます。

inputs = [0 1 0 1; 0 0 1 1];
targets = [0 0 0 1];

次の節では、Neural Network Fitting アプリ nftool を使用して、データセットに合うようにネットワークに学習させる方法を説明します。この例では、ツールボックスに用意されている体脂肪のデータセットを使用します。

Neural Network Fitting アプリの使用

  1. 次のコマンドを使用して、ニューラル ネットワーク起動 GUI を開きます。

    nnstart
    

  2. [Fitting app] をクリックして Neural Network Fitting アプリを開きます (nftool コマンドを使うこともできます)。

  3. [Next] をクリックし、続行します。

  4. [Select Data] ウィンドウで [Load Example Data Set] をクリックします。[Fitting Data Set Chooser] ウィンドウが開きます。

    メモ

    MATLAB® ワークスペースからデータを読み込む必要がある場合、[Select Data] ウィンドウの [Inputs] および [Targets] オプションを使用します。

  5. [Chemical] を選択し、[Import] をクリックします。[Select Data] ウィンドウに戻ります。

  6. [Next] をクリックします。次の図に示す [Validation and Test Data] ウィンドウが表示されます。

    検証データセットおよびテスト データセットはそれぞれ元のデータの 15% に設定します。

    これらの設定を使用すると、入力ベクトルおよびターゲット ベクトルが次のように 3 つのセットにランダムに分割されます

    • 70% は学習に使用。

    • 15% は、ネットワークが汎化されていることを検証し、過適合の発生前に学習を停止するために使用。

    • 最後の 15% は、ネットワークの汎化の、完全に独立したテストとして使用。

    (データ分割プロセスの詳細は、データの分割を参照してください)。

  7. [Next] をクリックします。

    関数近似に使用される標準的なネットワークは、隠れ層にシグモイド伝達関数、出力層に線形伝達関数を使用した 2 層フィードフォワード ネットワークです。隠れニューロンの既定の数は、10 に設定されています。ネットワークの学習性能が低い場合、後でこの数を増やしてもかまいません。

  8. [Next] をクリックします。

  9. 学習アルゴリズムを選択し、[Train] をクリックします。レーベンバーグ・マルカート法 (trainlm) は、ほとんどの問題に対して推奨されます。一方で、ノイズを含む問題や小規模な問題の場合は、ベイズ正則化 (trainbr) を使用することで、かかる時間は長くなりますがより良い解が得られます。ただし、大規模な問題の場合には、スケーリング共役勾配法 (trainscg) を使用することをお勧めします。この方法では、他の 2 つのアルゴリズムで使用されるヤコビアン計算よりメモリ効率の高い勾配計算が使用されるためです。この例では、既定のレーベンバーグ・マルカート法を使用します。

    学習は、6 回の反復の間に検証誤差が減少しなくなるまで続行します (検証の停止)。

  10. [Plots] で、[Regression] をクリックします。これは、ネットワーク性能を検証するために使用されます。

    次の回帰プロットでは、学習セット、検証セット、およびテスト セットのターゲットに対するネットワーク出力が表示されます。完全にあてはまる場合、データが 45° の線に沿っており、ネットワーク出力がターゲットと等しくなるはずです。この問題では、すべてのデータセットについて適正にあてはめられており、それぞれの場合の R 値が 0.93 以上になっています。より正確な結果が必要な場合、nftool[Retrain] をクリックして、ネットワークの再学習を行います。これによってネットワークの初期の重みとバイアスが変更されるため、再学習後に改善されたネットワークが生成される可能性があります。次のペインには、その他のオプションが表示されます。

  1. 誤差ヒストグラムを表示して、ネットワーク性能に関する追加の検証を取得します。[Plots] ペインで、[Error Histogram] をクリックします。

    棒グラフの青色の部分は学習データ、緑色の部分は検証データ、赤色の部分はテスト データを表します。ヒストグラムから、外れ値、すなわち大部分のデータと比べて近似の精度が著しく低いデータ点を確認できます。この場合、ほとんどの誤差が -5 ~ 5 の範囲内になっている一方で、誤差が 17 の学習点、および誤差が 12 および 13 の検証点があることがわかります。これらの外れ値は、テスト回帰プロットにも見られます。最初の値は、ターゲットが 50、出力が約 33 の点に対応します。外れ値を確認して、データに誤りがないか、またはこれらのデータ点が残りのデータセットと異なっていないかを判断することをお勧めします。外れ値が有効なデータ点であるにもかかわらず、残りのデータとは異なっている場合、ネットワークはこれらの点に対して外挿を行います。外れ値点のように見えるデータをさらに収集し、ネットワークの再学習を行う必要があります。

  2. Neural Network Fitting アプリで [Next] をクリックし、ネットワークを評価します。

    この時点で、新しいデータに対してネットワークをテストできます。

    元のデータまたは新しいデータでのネットワーク性能に満足できない場合、次のいずれかを行うことができます。

    • 再度、学習を行う。

    • ニューロンの数を増やす。

    • より大規模な学習データセットを取得する。

    学習セットでの性能は良好であるにもかかわらず、テスト セットでの性能が著しく低い場合には、過適合を示しているため、ニューロンの数を減らすことによって結果を改善できます。学習の性能が低い場合、ニューロンの数を増やしてみてください。

  3. ネットワーク性能に満足できたら、[Next] をクリックします。

  4. このパネルを使用して、MATLAB 関数または Simulink® ブロック線図を生成し、ニューラル ネットワークのシミュレーションを行います。生成されたコードまたはブロック線図を使用して、ニューラル ネットワークが入力から出力を計算する方法について理解を深めたり、MATLAB Compiler™ ツールおよびその他の MATLAB コード生成ツールを使用してネットワークを配布したりできます。

  5. この画面のボタンを使用して、スクリプトを生成するか、または結果を保存します。

    • [Simple Script] または [Advanced Script] をクリックして、コマンド ラインから前のすべてのステップを再現するために使用できる MATLAB コードを作成します。MATLAB コードの作成は、ツールボックスのコマンド ライン機能を使用して学習プロセスをカスタマイズする方法を学ぶ必要がある場合に便利です。コマンド ライン関数の使用では、生成されるスクリプトについてさらに詳しく説明します。

    • ネットワークを net という名前でワークスペースに保存することもできます。追加のテストを実行する、または新しい入力の処理に使用することができます。

  6. MATLAB コードを作成して結果を保存したら、[Finish] をクリックします。

コマンド ライン関数の使用

ツールボックスのコマンド ライン関数の使用方法を学ぶ最も簡単な方法は、GUI からスクリプトを生成し、これらのスクリプトを変更してネットワークの学習をカスタマイズすることです。例として、前の節のステップ 14 で作成した簡単なスクリプトを見てみましょう。

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by NFTOOL
%
% This script assumes these variables are defined:
%
%   houseInputs - input data.
%   houseTargets - target data.
 
inputs = houseInputs;
targets = houseTargets;
 
% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize);

% Set up 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,inputs,targets);
 
% Test the Network
outputs = net(inputs);
errors = gsubtract(outputs,targets);
performance = perform(net,targets,outputs)
 
% View the Network
view(net)
 
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotfit(targets,outputs)
% figure, plotregression(targets,outputs)
% figure, ploterrhist(errors)

スクリプトを保存し、コマンド ラインから実行して、前の GUI セッションの結果を再現します。スクリプトを編集して、学習プロセスをカスタマイズすることもできます。この場合、スクリプトの各ステップに従います。

  1. スクリプトは、入力ベクトルおよびターゲット ベクトルがワークスペースに読み込み済みであると仮定しています。データが読み込まれていない場合、次のように読み込むことができます。

    load bodyfat_dataset
    inputs = bodyfatInputs;
    targets = bodyfatTargets;
    

    このデータセットは、ツールボックスに含まれる標本データセットの 1 つです (浅いニューラル ネットワーク用の標本データセットを参照してください)。help nndatasets コマンドを入力することによって、使用可能なすべてのデータセットの一覧を表示できます。load コマンドを使用すると、独自の変数名を使用して、これらのデータセットから変数を読み込むこともできます。たとえば、次のコマンド

    [inputs,targets] = bodyfat_dataset;
    

    は、体脂肪の入力が配列 inputs に読み込まれ、体脂肪のターゲットが配列 targets に読み込まれます。

  2. ネットワークを作成します。関数近似 (または回帰) 問題用の既定のネットワーク fitnet は、隠れ層に既定の正接シグモイド伝達関数、出力層に線形伝達関数を使用したフィードフォワード ネットワークです。前の節で、1 つの隠れ層に 10 個 (任意) のニューロンを割り当てています。各入力ベクトルにはターゲット値が 1 つだけ関連付けられているため、ネットワークの出力ニューロンは 1 個になります。

    hiddenLayerSize = 10;
    net = fitnet(hiddenLayerSize);
    

    メモ

    ニューロンの数を増やすと、必要な計算量が多くなります。数が多すぎる場合にはデータへの過適合が生じる可能性が高くなりますが、より複雑な問題をそのネットワークで解けるようになります。層の数を増やすと、必要な計算量が多くなりますが、複雑な問題をそのネットワークでより効率的に解けるようになる可能性があります。複数の隠れ層を使用するには、隠れ層のサイズを fitnet コマンドの配列の要素として入力します。

  3. データの分割を設定します。

    net.divideParam.trainRatio = 70/100;
    net.divideParam.valRatio = 15/100;
    net.divideParam.testRatio = 15/100;
    

    これらの設定では、入力ベクトルおよびターゲット ベクトルはランダムに分割されます。70% は学習、15% は検証、および 15% はテストに使用されます (データ分割プロセスの詳細は、データの分割を参照してください)。

  4. ネットワークに学習をさせます。ネットワークの学習には、既定のレーベンバーグ・マルカート法アルゴリズム (trainlm) を使用します。レーベンバーグ・マルカート法によって目的どおりの正確な結果を生成できない問題の場合にはネットワーク学習関数をベイズ正則化 (trainbr) に、あるいは、データが大規模な問題の場合にはネットワーク学習関数をスケーリング共役勾配法 (trainscg) に設定することを検討してください。

    net.trainFcn = 'trainbr';
    net.trainFcn = 'trainscg';

    ネットワークの学習を行うには、次のように入力します。

    [net, tr] = train(net, inputs, targets);
    

    学習中は、次の学習ウィンドウが開きます。このウィンドウには学習の進行状況が表示されます。[Stop Training] をクリックして、任意の時点で学習を中断できます。

    この学習は、6 回の反復の間に検証誤差が増加したときに停止しています。停止は 20 回目の反復で発生しています。学習ウィンドウで [Performance] をクリックすると、次の図に示すように、学習誤差、検証誤差、およびテスト誤差のプロットが表示されます。次の点を考慮すると、この例の結果は妥当であると言えます。

    • 最終的な平均二乗誤差が小さい。

    • テスト セットの誤差と検証セットの誤差の特性が似ている。

    • (検証性能が最良である) 14 回目の反復までに重大な過適合が発生していない。

  5. ネットワークをテストします。ネットワークの学習が終わったら、これを使用してネットワークの出力を計算できます。次のコードでは、ネットワークの出力、誤差、および全体的な性能が計算されます。

    outputs = net(inputs);
    errors = gsubtract(targets, outputs);
    performance = perform(net, targets, outputs)
    
    performance =
    
       19.3193
    
    

    学習記録にあるテスト インデックスを使用することで、テスト セットのみでネットワーク性能を計算することも可能です (学習記録の詳細は、学習後の浅いニューラル ネットワークの性能分析を参照してください)。

    tInd = tr.testInd;
    tstOutputs = net(inputs(:, tInd));
    tstPerform = perform(net, targets(tInd), tstOutputs)
    
    tstPerform =
    
       53.7680
    
    
  6. ネットワーク応答の解析を実行します。学習ウィンドウで [Regression] をクリックすると、ネットワーク出力と対応するターゲット間の線形回帰を実行できます。

    次の図には結果が表示されています。

    出力は、学習、テスト、および検証のターゲットにとてもうまく追従しています。R 値は、応答全体で 0.96 を上回っています。より正確な結果が必要な場合、次のいずれかの方法を試してください。

    • init を使用してネットワークの初期の重みとバイアスを新しい値にリセットし、再度学習を行う (重みの初期化 (init) を参照)。

    • 隠れニューロンの数を増やす。

    • 学習ベクトルの数を増やす。

    • より関連性の高い情報がある場合、入力値の数を増やす。

    • 別の学習アルゴリズムを試す (学習アルゴリズムを参照)。

    この場合、ネットワーク応答は満足のいくものであるため、ネットワークを新しい入力に使用できます。

  7. ネットワーク図を表示します。

    view(net)
    

コマンド ライン操作に慣れるため、次のタスクを試してみましょう。

  • 学習中にプロット ウィンドウ (回帰プロットなど) を開き、アニメーションを見る。

  • plotfitplotregressionplottrainstateplotperform などの関数を使用して、コマンド ラインからプロットする (これらの関数の使用の詳細は、それぞれのリファレンス ページを参照してください)。

また、コマンド ラインから学習を行う場合、その他のオプションについては高度なスクリプトを参照してください。

ニューラル ネットワークでは、学習を行うたびに異なる解が得られる可能性がありますが、これは初期の重みとバイアスの値が異なり、データの学習セット、検証セット、テスト セットへの分割が異なるためです。このため、別のニューラル ネットワークが同じ問題について学習した場合、入力が同じでも出力が異なる場合があります。ニューラル ネットワークで高い精度が得られるようにするためには、何度か再学習を行います。

高い精度が必要な場合は、初期解を改善するための手法が他にいくつかあります。詳細は、浅いニューラル ネットワークの汎化の改善と過適合の回避を参照してください。