ニューラル ネットワーク入出力処理関数の選択
このトピックでは、典型的な多層ネットワークのワークフローの一部について説明します。詳細とその他のステップについては、浅層の多層ニューラル ネットワークと逆伝播学習を参照してください。
ネットワークの入力とターゲットに対し一定の前処理ステップを実行すると、ニューラル ネットワークの学習がより効率的になる場合があります。ここでは使用可能ないくつかの前処理ルーチンを説明します (これらのうち最も一般的なものはネットワークを作成したときに自動的に提供され、ネットワーク オブジェクトの一部になります。そのため、ネットワークが使用される場合は常に、ネットワークに入るデータは同じ方法で前処理されます)。
たとえば、多層ネットワークでは、シグモイド伝達関数が隠れ層で一般的に使用されます。これらの関数は、正味入力が 3 を超える (exp (−3) ≅ 0.05) と、実質的に飽和になります。これが学習プロセスの始めに起こると、勾配が非常に小さくなり、ネットワークの学習が非常に遅くなります。ネットワークの最初の層では、正味入力は入力と重みの積にバイアスを加算した値になります。入力が非常に大きい場合は、伝達関数の飽和を防ぐために、重みを非常に小さくしなければなりません。入力をネットワークに適用する前に正規化するのは標準的な手法です。
一般的に、正規化のステップは、データセットの入力ベクトルとターゲット ベクトルの両方に適用されます。このように、ネットワークの出力は必ず正規化された範囲に収まります。ネットワーク出力は、ネットワークを現場で使用するときに、元のターゲット データの単位に逆変換できます。
ニューラル ネットワークを、次の図で示すように、入力とネットワークの最初の層の間に前処理ブロックがあり、ネットワークの最後の層と出力の間に後処理ブロックがあるものとして考えるのが最も簡単です。
feedforwardnet
などの多層ネットワーク作成関数をはじめとするツールボックスのほとんどのネットワーク作成関数は、ネットワークの入出力に処理関数を自動的に割り当てます。これらの関数は、指定した入力値とターゲット値をネットワークの学習により適した値に変換します。
既定の入出力処理関数は、ネットワークを作成した後にネットワークのプロパティを調整することによりオーバーライドできます。
ネットワークの入力に割り当てられる処理関数の cell 配列の一覧を確認するには、次のプロパティにアクセスします。
net.inputs{1}.processFcns
ここで、インデックス 1 は、最初の入力ベクトルを表します (フィードフォワード ネットワークの入力ベクトルは 1 つだけです)。2 層ネットワークの出力から返される処理関数を表示するには、次のネットワーク プロパティにアクセスします。
net.outputs{2}.processFcns
ここで、インデックス 2 は 2 番目の層から得られる出力ベクトルを表します (フィードフォワード ネットワークでは、出力ベクトルは 1 つだけで、最後の層から得られます)。これらのプロパティを使用して、ネットワークで入出力に適用する処理関数を変更できます。ただし、通常は既定の設定で優れた性能が得られます。
一部の処理関数には、動作をカスタマイズするパラメーターがあります。ネットワーク入力の i
番目の入力処理関数のパラメーターは、次のようにアクセスまたは変更できます。
net.inputs{1}.processParams{i}
2 番目の層に関連付けられたネットワーク出力の i
番目の出力処理関数のパラメーターは、次のようにアクセスまたは変更できます。
net.outputs{2}.processParams{i}
feedforwardnet
などの多層ネットワーク作成関数の場合、既定の入力処理関数は removeconstantrows
と mapminmax
です。出力の場合も、既定の処理関数は removeconstantrows
と mapminmax
です。
次の表に、最も一般的な前処理関数と後処理関数を示します。多くの場合、前処理ステップはネットワーク オブジェクトの一部になっているため、直接使用する必要はありません。ネットワークのシミュレーションまたは学習を行うときに、前処理と後処理が自動的に実行されます。
関数 | アルゴリズム |
---|---|
範囲 [−1, 1] に収まるように入力/ターゲットを正規化 | |
ゼロ平均と単位分散を持つように入力/ターゲットを正規化 | |
入力ベクトルから主成分を抽出 | |
不明な入力を処理 | |
定数である入力/ターゲットを削除 |
不明なターゲットまたは don't care ターゲットの表現
不明なターゲットまたは "don't care" ターゲットは NaN
値で表現できます。不明なターゲット値が学習に影響を与えることは望ましくありませんが、ネットワークに複数の出力がある場合、任意のターゲット ベクトルの一部の要素は既知で、他は不明であることがあります。1 つの解決策は、部分的に不明なターゲット ベクトルと、それに関連付けられた入力ベクトルを学習セットから削除することですが、その場合は良好なターゲット値が失われます。より優れた解決策は、そのような不明なターゲットを NaN
値で表現することです。ツールボックスのすべての性能関数は、性能と性能の微分を計算する場合、そのようなターゲットを無視します。