Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

浅いニューラル ネットワークによるパターンの分類

関数近似に加えて、ニューラル ネットワークはパターン認識にも適しています。

たとえば、細胞の大きさの均一性、細胞塊の厚さ、有糸分裂などに基づいて、腫瘍を良性または悪性に分類する必要があるとします。699 のサンプル ケースがあり、それぞれに 9 項目のデータと、良性または悪性の正しい分類があります。

関数近似の場合と同様に、この問題を解くには 2 つの方法があります。

通常、はじめに GUI を使用し、次に GUI を使用してコマンド ライン スクリプトを自動的に生成することをお勧めします。どちらの方法を使用する場合にも、まずデータセットを選択することによって問題を定義します。次の節では、データ形式について説明します。

問題の定義

パターン認識問題を定義するには、一連の Q 個の入力ベクトルを行列の列として配置します。次に、別の Q 個のターゲット ベクトルを、入力ベクトルが割り当てられているクラスを示すように配置します (静的データおよび時系列データのデータ書式設定の詳細は、Data Structures を参照してください)。

クラスが 2 つしかない場合、それぞれのスカラー ターゲット値を 0 または 1 のいずれかに設定し、対応する入力がどちらのクラスに属するかを示します。たとえば、2 つのクラスの排他的論理和の分類問題は次のように定義できます。

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

入力が N 個の異なるクラスに分類される場合、ターゲット ベクトルの要素数は N 個になります。各ターゲット ベクトルについて、1 つの要素が 1 になり、他の要素は 0 になります。たとえば、5 x 5 x 5 の立方体の頂点を 3 つのクラスに分割する分類問題は、次のように定義します。

  • 1 つのクラスに原点 (最初の入力ベクトル) が含まれる

  • 2 番目のクラスに原点から最も離れた頂点 (最後の入力ベクトル) が含まれる

  • 3 番目のクラスにその他のすべての点が含まれる

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

クラスが 2 つしかない分類問題は、どちらの形式を使用しても表すことができます。ターゲットは、1 または 0 のスカラー要素、または 1 つの要素が 1、もう 1 つの要素が 0 になる 2 要素ベクトルのいずれかで構成できます。

次の節では、Neural Network Pattern Recognition アプリ nprtool を使用して、パターンを認識するようにネットワークに学習させる方法を説明します。この例では、ツールボックスに用意されている癌のデータセットを使用します。このデータセットは、699 個の 9 要素入力ベクトルおよび 2 要素ターゲット ベクトルで構成されています。各入力ベクトルに 2 つのカテゴリ (良性または悪性) が関連付けられているため、各ターゲット ベクトルの要素の数は 2 つです。

Neural Network Pattern Recognition アプリの使用

  1. nprtool を使用して Neural Network Pattern Recognition アプリを開きます。

    nprtool

  2. [Next] をクリックし、続行します。[Select Data] ウィンドウが開きます。

  3. [Load Example Data Set] をクリックします。[Pattern Recognition Data Set Chooser] ウィンドウが開きます。

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

  5. [Next] をクリックして、[Validation and Test Data] ウィンドウを開きます。

    検証データセットおよびテスト データセットはそれぞれ元のデータの 15% に設定します。これらの設定を使用すると、入力ベクトルおよびターゲット ベクトルが次のように 3 つのセットにランダムに分割されます

    • 70% は学習に使用。

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

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

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

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

    パターン認識に使用される標準的なネットワークは、隠れ層にシグモイド伝達関数、出力層にソフトマックス伝達関数を使用した 2 層フィードフォワード ネットワークです。隠れニューロンの既定の数は、10 に設定されています。ネットワーク性能が期待どおりにならない場合、後でこの数を増やしてもかまいません。出力ニューロンの数は 2 に設定されます。これはターゲット ベクトルの要素数 (カテゴリ数) と同じです。

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

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

    学習は 55 回反復するまで続行されます。

  9. Neural Network Pattern Recognition アプリの [Plots] ペインで、[Confusion] をクリックします。

    次の図に、学習、テスト、および検証の混同行列、ならびに 3 種類を統合したデータを示します。緑色の正方形で表示されている正しい応答の数が多く、赤色の正方形で表示されている正しくない応答の数が少ないため、ネットワークの出力は非常に正確です。右下の青色の正方形は、全体の精度を示しています。

  10. 受信者動作特性 (ROC) 曲線をプロットします。Neural Network Pattern Recognition アプリの [Plots] ペインで、[Receiver Operating Characteristic] をクリックします。

    各軸の色付きの線は ROC 曲線を表します。"ROC 曲線" は、しきい値が変化する場合の、偽陽性率 (1 - 特異度) に対する真陽性率 (感度) のプロットです。テストに問題がなければ、左上隅に点が表示されます。これは、100% の感度と 100% の特異度を示します。この問題については、ネットワーク性能は非常に良好です。

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

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

    元のデータまたは新しいデータでのネットワーク性能に満足できない場合、再度学習を行うか、ニューロンの数を増やすか、またはより大規模な学習データセットを取得します。学習セットでの性能は良好であるにもかかわらず、テスト セットでの性能が著しく低い場合には、過適合を示しているため、ニューロンの数を減らすことによって結果を改善できます。

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

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

  13. [Next] をクリックします。この画面のボタンを使用して、結果を保存します。

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

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

  14. 結果を保存したら、[Finish] をクリックします。

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

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

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
%
% This script assumes these variables are defined:
%
%   cancerInputs - input data.
%   cancerTargets - target data.

inputs = cancerInputs;
targets = cancerTargets;

% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(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(targets,outputs);
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, plotconfusion(targets,outputs)
% figure, ploterrhist(errors)

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

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

    [inputs,targets] = cancer_dataset;
    
  2. ネットワークを作成します。関数近似 (または回帰) 問題の既定のネットワーク patternnet は、隠れ層に既定の正接シグモイド伝達関数、出力層にソフトマックス伝達関数を使用したフィードフォワード ネットワークです。前の節で、1 つの隠れ層に 10 個 (任意) のニューロンを割り当てています。

    • 各入力ベクトルには 2 つのターゲット値 (カテゴリ) が関連付けられているため、ネットワークの出力ニューロンは 2 個になります。

    • 各出力ニューロンは 1 つのカテゴリを表します。

    • 適切なカテゴリの入力ベクトルがネットワークに適用されている場合、対応するニューロンによって 1 が生成され、もう一方のニューロンによって 0 が出力されるはずです。

    ネットワークを作成するには、次のコマンドを入力します。

    hiddenLayerSize = 10;
    net = patternnet(hiddenLayerSize);
    

    メモ:

    パターン認識問題用のネットワーク アーキテクチャの選択は、関数近似問題と同様のガイドラインに従います。ニューロンの数を増やすと、必要な計算量が多くなります。数が多すぎる場合にはデータへの過適合が生じる可能性が高くなりますが、より複雑な問題をそのネットワークで解けるようになります。層の数を増やすと、必要な計算量が多くなりますが、複雑な問題をそのネットワークでより効率的に解けるようになる可能性があります。複数の隠れ層を使用するには、隠れ層のサイズを patternnet コマンドの配列の要素として入力します。

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

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

    これらの設定では、入力ベクトルおよびターゲット ベクトルはランダムに分割されます。70% は学習、15% は検証、および 15% はテストに使用されます

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

  4. ネットワークに学習をさせます。パターン認識ネットワークでは、学習に既定のスケーリング共役勾配法 (trainscg) アルゴリズムを使用します。ネットワークの学習を行うには、次のコマンドを入力します。

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

    学習中は、関数近似の場合と同様に、学習ウィンドウが開きます。このウィンドウには、学習の進行状況が表示されます。任意の時点で学習を中断するには、[Stop Training] をクリックします。

    この学習は、6 回の反復の間に検証誤差が増加したときに停止しています。学習の停止は、24 回目の反復で発生しています。

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

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

    学習記録にあるテスト インデックスを使用することで、テスト セットのみでネットワーク性能を計算することも可能です

    tInd = tr.testInd;
    tstOutputs = net(inputs(:,tInd));
    tstPerform = perform(net,targets(:,tInd),tstOutputs)
    
    tstPerform =
    
        0.0257
    
    
  6. ネットワーク図を表示します。

    view(net)
    

  7. 学習、検証、およびテストの性能をプロットします。

    figure, plotperform(tr)
    

  8. 関数 plotconfusion を使用して、混同行列をプロットします。学習済みの最終的なネットワークでさまざまな種類の誤差が発生していることがわかります。

    figure, plotconfusion(targets,outputs)
    

対角線上のセルは正しく分類されたケースの数、対角線外のセルは誤分類されたケースの数を示します。右下の青色のセルは、正しく分類されたケース (緑色で表示) の割合の合計と、誤分類されたケース (赤色で表示) の割合の合計を示します。結果は、認識が非常に適切に行われていることを示しています。より正確な結果が必要な場合、次のいずれかの方法を試してください。

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

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

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

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

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

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

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

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

  • plotrocplottrainstate などの関数を使用して、コマンド ラインからプロットする。

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

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

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