76

層の数と層ごとのニューロンの数を計算する方法を探しています。入力として、入力ベクトルのサイズ、出力ベクトルのサイズ、およびトレーニング セットのサイズしかありません。

通常、最適なネットは、さまざまなネット トポロジを試して、エラーが最も少ないものを選択することによって決定されます。残念ながら私にはそれができません。

4

3 に答える 3

103

これは本当に難しい問題です。

ネットワークの内部構造が多ければ多いほど、そのネットワークは複雑なソリューションをより適切に表現できます。一方、内部構造が多すぎると速度が低下し、トレーニングが発散したり、過剰適合につながる可能性があります。これにより、ネットワークが新しいデータにうまく一般化できなくなります。

人々は伝統的に、いくつかの異なる方法でこの問題に取り組んできました。

  1. さまざまな構成を試して、何が最適かを確認してください。 トレーニング セットを 2 つの部分 (トレーニング用と評価用) に分割し、さまざまなアプローチをトレーニングして評価することができます。残念ながら、あなたの場合、この実験的アプローチは利用できないようです。

  2. 経験則を使用してください。 多くの人が、何が最も効果的かについて多くの推測を思いつきました。隠れ層のニューロン数に関しては、(たとえば) (a) 入力層と出力層のサイズの間にあるべき、(b) (入力 + 出力) * 2/3 に近い値に設定する、または(c) 入力レイヤーのサイズの 2 倍を超えることはありません。

    経験則の問題は、問題がどの程度「難しい」か、トレーニング セットとテスト セットのサイズなど、重要な情報が常に考慮されているとは限らないことです。したがって、これらのルールはよく使用されます。 「試してみて、何が最善かを見てみましょう」アプローチの大まかな出発点として。

  3. ネットワーク構成を動的に調整するアルゴリズムを使用します。カスケード相関 のようなアルゴリズムは、最小限のネットワークから開始し、トレーニング中に隠しノードを追加します。これにより、実験のセットアップが少し簡単になり、(理論的には) パフォーマンスが向上します (不適切な数の隠しノードを誤って使用することがなくなるため)。

このテーマについては多くの研究が行われているため、本当に興味がある場合は、読むべきものがたくさんあります。特に、この要約の引用を確認してください。

于 2010-07-27T16:30:25.277 に答える
44

実際には、これは難しくありません (何十もの MLP をコーディングしてトレーニングしたことに基づいています)。

教科書的な意味では、アーキテクチャを「正しく」するのは難しいです。つまり、アーキテクチャをさらに最適化してもパフォーマンス (解像度) が向上しないようにネットワーク アーキテクチャを調整するのは難しい、と私は同意します。しかし、その程度の最適化が必要になるのはまれなケースだけです。

実際には、仕様で要求されるニューラル ネットワークからの予測精度を満たすか、それを超えるために、ネットワーク アーキテクチャに多くの時間を費やす必要はほとんどありません。これが正しい理由は 3 つあります。

  • ネットワーク アーキテクチャを指定するために必要な パラメータのほとんどは、データ モデル (入力ベクトル内の特徴の数、目的の応答変数が数値かカテゴリか、後者の場合は一意のクラス ラベルの数) を決定すると固定されます。あなたが選んだ);

  • 実際に調整可能な残りのいくつかのアーキテクチャ パラメータは、ほぼ常に (私の経験では 100% の時間) 、これらの固定アーキテクチャ パラメータによって大きく制約されています。つまり、これらのパラメータの値は、最大値と最小値によって厳密に制限されています。と

  • トレーニングを開始する前に最適なアーキテクチャを決定する必要はありません。実際、トレーニング中にネットワーク アーキテクチャをプログラムで調整するための小さなモジュールをニューラル ネットワーク コードに含めることは非常に一般的です (重み値がゼロに近づいているノードを削除することにより、通常は「剪定」)

ここに画像の説明を入力

上の表によると、ニューラル ネットワークのアーキテクチャは 6 つのパラメーター (内部グリッドの 6 つのセル) によって完全に指定されます。それらのうちの 2 つ (入力層と出力層の層の種類の数) は常に 1 つです。ニューラル ネットワークには 1 つの入力層と 1 つの出力層があります。NN には、少なくとも 1 つの入力層と 1 つの出力層が必要です。それ以上でもそれ以下でもありません。次に、これらの 2 つの層のそれぞれを構成するノードの数は、入力ベクトルのサイズによって固定されます。つまり、入力層のノードの数は、入力ベクトルの長さに等しくなります (実際には、ほとんどの場合、もう 1 つのニューロンがバイアス ノードとして入力層に追加されます)。

同様に、出力層のサイズは応答変数 (数値応答変数の場合は単一ノード) によって固定され、(softmax が使用されていると仮定すると、応答変数がクラス ラベルの場合、出力層のノード数は単純に一意の数に等しくなります。クラス ラベル)。

これにより、任意の裁量があるパラメータが2 つだけ残ります。それは、隠れ層の数と、それらの各層を構成するノードの数です。

隠しレイヤーの数

データが線形分離可能である場合 (NN のコーディングを開始するまでには、このことはよくわかっています)、隠れ層はまったく必要ありません。(実際にそうである場合、この問題には NN を使用しません。より単純な線形分類器を選択してください)。これらのうちの最初のもの -- 隠れ層の数 -- は、ほぼ常に 1 です。この推定の背後には多くの経験的重みがあります。実際には、単一の隠れ層では解決できない問題が、別の隠れ層を追加することで解決できることはほとんどありません。同様に、追加の隠れ層を追加することによるパフォーマンスの違いについてもコンセンサスがあります。大多数の問題には、1 つの隠れ層で十分です。

あなたの質問では、何らかの理由で試行錯誤しても最適なネットワーク アーキテクチャを見つけることができないと述べました。NN 構成を (試行錯誤を使用せずに) 調整する別の方法は、「プルーニング」です。'。この手法の要点は、ネットワークから削除されてもネットワーク パフォーマンス (つまり、データの解決) に顕著な影響を与えないノードを特定することにより、トレーニング中にネットワークからノードを削除することです。(正式なプルーニング手法を使用しなくても、トレーニング後に重み行列を調べることで、どのノードが重要でないかを大まかに把握できます。ゼロに非常に近い重みを探します。プルーニング中に削除されることがよくあります。)明らかに、トレーニング中にプルーニング アルゴリズムを使用する場合は、過剰な (つまり、「プルーニング可能な」) ノードを持つ可能性が高いネットワーク構成から始めます。つまり、ネットワーク アーキテクチャを決定するときに、刈り込みステップを追加すると、より多くのニューロンの側でエラーが発生します。

別の言い方をすれば、トレーニング中にネットワークにプルーニング アルゴリズムを適用することで、アプリオリな理論よりもはるかに最適化されたネットワーク構成に近づけることができます。

隠れ層を構成するノードの数

しかし、隠れ層を構成するノードの数はどうでしょうか? ただし、この値は多かれ少なかれ制約を受けていません。つまり、入力レイヤーのサイズより小さくても大きくてもかまいません。それ以上に、おそらくご存じのとおり、NN の隠れ層構成の問題については山ほどのコメントがあります (そのコメントの優れた要約については、有名なNN FAQを参照してください)。経験的に導き出された多くの経験則がありますが、これらの中で最も一般的に依存しているのは、入力層と出力層の間にある隠れ層のサイズです。ジェフ・ヒートン、『Introduction to Neural Networks in Java 』の著者」は、リンク先のページに記載されている、さらにいくつかを提供しています。同様に、アプリケーション指向のニューラル ネットワークの文献をスキャンすると、ほぼ確実に、隠れ層のサイズが通常は入力層と出力層のサイズの間にあることがわかります。しかし中間というのは中間という意味ではありません. 実際には, 隠れ層のサイズを入力ベクトルのサイズに近づけたほうがよい. その理由は, 隠れ層が小さすぎると, ネットワークが収束しにくくなる可能性があるからです.初期構成では、より大きなサイズで誤ります.より大きな隠れ層は、より小さな隠れ層と比較して、ネットワークにより多くの容量を与え、それが収束するのに役立ちます.実際、この正当化は、より大きな隠れ層サイズを推奨するためによく使用されます(より多くのノード)入力層--つまり、迅速な収束を促進する初期アーキテクチャから始めます。その後、「余分な」ノードを削除できます(非常に低い重み値を持つ隠れ層のノードを識別し、それらをあなたのリファクタリングされたネットワーク)。

于 2010-07-27T21:10:06.007 に答える
0

私は、ノードが 1 つしかない隠れ層が 1 つしかない商用ソフトウェアに MLP を使用しました。入力ノードと出力ノードが固定されているため、隠れ層の数を変更して、達成された一般化を操作するだけで済みました。隠れ層の数を変更することによって、1 つの隠れ層と 1 つのノードだけで達成していたことに大きな違いはありませんでした。1 つのノードで 1 つの非表示レイヤーを使用しただけです。それは非常にうまく機能し、計算の削減も私のソフトウェア前提では非常に魅力的でした。

于 2014-09-10T14:11:57.457 に答える