フィードフォワードニューラルネットワークで、レイヤーの数と各レイヤーのノードの数を選択するための標準的で受け入れられている方法はありますか?ニューラルネットワークを構築する自動化された方法に興味があります。
フィードフォワードニューラルネットワークで、レイヤーの数と各レイヤーのノードの数を選択するための標準的で受け入れられている方法はありますか?ニューラルネットワークを構築する自動化された方法に興味があります。
回答:
私はこの質問が回答されたことに気づきましたが、現存の回答が、質問の主題に一般的に関連するリンクを指すことを超えて、質問に本当に関与するとは思いません。特に、リンクはプログラムによるネットワーク構成の1つの手法を説明していますが、これはネットワーク構成の「[a]標準および一般的な方法」ではありません。
明確なルールの小さなセットに従うことにより、有能なネットワークアーキテクチャ(つまり、ニューロン層の数とタイプ、および各層を構成するニューロンの数)をプログラムで設定できます。このスキーマに従えば、これにより適切なアーキテクチャが得られますが、おそらく最適なアーキテクチャではありません。
ただし、このネットワークが初期化されると、いくつかの補助アルゴリズムを使用して、トレーニング中に構成を繰り返し調整できます。これらのファミリの1つは、一定数のトレーニングエポックの後、重みベクトルの(小さな)値に基づいてノードをプルーニングすることによって機能します。
したがって、すべてのNNには、input、hidden、およびoutputの 3つのタイプのレイヤーがあります。
したがって、NNアーキテクチャを作成するということは、各タイプのレイヤー数とこれらの各レイヤーのノード数の値を考え出すことを意味します。
入力レイヤー
シンプル-すべてのNNにそれらの1つがあります-私が知っている例外はありません。
この層を構成するニューロンの数に関しては、トレーニングデータの形状がわかれば、このパラメーターは完全かつ一意に決定されます。具体的には、そのレイヤーを構成するニューロンの数は、データ内のフィーチャ(列)の数に等しくなります。一部のNN構成では、バイアス用語にノードを1つ追加します。
出力レイヤー
入力層と同様に、すべてのNNには1つの出力層があります。サイズ(ニューロンの数)の決定は簡単です。選択したモデル構成によって完全に決定されます。
NNはマシンモードまたはリグレッションモードで実行されていますか(統計でも使用されている用語に異なる意味を割り当てるというML規則は非常に混乱しています)。マシンモード:クラスラベル(「プレミアムアカウント」/「基本アカウント」など)を返します。回帰モードは値(例、価格)を返します。
NNがリグレッサーの場合、出力層には単一のノードがあります。
NNが分類器である場合、softmaxが使用されない限り単一ノードも含まれます。その場合、出力層にはモデルのクラスラベルごとに1つのノードがあります。
隠しレイヤー
したがって、これらの少数のルールは、入力レイヤーと出力レイヤーの両方のレイヤー数とサイズ(ニューロン/レイヤー)を設定します。それは隠されたレイヤーを残します。
隠れ層はいくつありますか?データが線形に分離可能な場合(NNのコーディングを開始するまでによく知っています)、隠しレイヤーはまったく必要ありません。もちろん、データを解決するためにNNも必要ありませんが、それでも仕事はできます。
それを超えて、おそらくご存知のように、NNの隠れ層構成の問題に関する解説が山ほどあります(その解説の優れた要約については、非常に徹底的で洞察に満ちたNN FAQを参照してください)。コンセンサスが存在するこの主題内の1つの問題は、追加の隠しレイヤーを追加することによるパフォーマンスの違いです。大部分の問題には1つの隠れ層で十分です。
では、隠れ層のサイズはどうですか?ニューロンはいくつですか?経験的に導き出された経験則がいくつかありますが、最も一般的に依存されるのは、「隠れ層の最適なサイズは通常、入力層のサイズと出力層のサイズの間です」です。Javaのニューラルネットワークの紹介の著者であるジェフヒートンは、さらにいくつかを提供しています。
要するに、ほとんどの問題について、たった2つのルールを使用して非表示レイヤー構成を設定することで、おそらく適切なパフォーマンスを得ることができます(2番目の最適化ステップがなくても)。(ii)その層のニューロンの数は、入力層と出力層のニューロンの平均です。
ネットワーク構成の最適化
剪定ネットワークサイズ(レイヤーではなくノードによる)をトリミングして、計算パフォーマンスと、場合によっては解像度パフォーマンスを向上させる一連の手法について説明します。これらの手法の要点は、トレーニング中にネットワークからノードを削除することです。これらのノードは、ネットワークから削除してもネットワークのパフォーマンス(データの解像度)に顕著な影響を与えません。(正式なプルーニング手法を使用しなくても、トレーニング後にウェイトマトリックスを見ると、重要ではないノードの大まかなアイデアを得ることができます。ウェイトがゼロに非常に近いことを確認してください。多くの場合、ウェイトの両端のノードです明らかに、トレーニング中にプルーニングアルゴリズムを使用する場合は、過剰な(つまり「プルーナブル」)ノードを持つ可能性が高いネットワーク構成から始めます。つまり、
別の言い方をすれば、トレーニング中にネットワークにプルーニングアルゴリズムを適用することにより、最適なネットワーク構成にアプローチできます。単一の「事前」アルゴリズム(遺伝的アルゴリズムベースのアルゴリズムなど)でそれができるかどうかはわかりませんが、現時点では、この2段階の最適化がより一般的であることを知っています。
@dougの答えは私にとってはうまくいきました。教師付き学習の問題に役立つもう1つの経験則があります。通常、ニューロンの数を下に保つと、過剰適合を防ぐことができます。
自動化された手順では、アルファ2(モデルの2倍のトレーニングデータの自由度)で開始し、トレーニングデータセットのエラー(損失)がモデルの2テストデータセット。
N_h
(層ごとの隠れニューロンの平均数)解N_s = (N_i + N_o) * N_h ^ N_hidden_layers
です。しかし、私はまだこの式を使用しません。他の正則化アプローチを実装する予定がない場合にのみ、非常に基本的な問題(おもちゃの問題)のためです。
Javaのためのニューラルネットワーク入門 (第2版)によるジェフ・ヒートン -で自由に利用できるプレビューGoogleブックスと以前に著者のウェブサイト:
非表示レイヤーの数
隠れ層に関しては、実際に2つの決定を行う必要があります。ニューラルネットワークに実際に持つ隠れ層の数と、これらの各層にいくつのニューロンが含まれるかです。最初に、ニューラルネットワークで使用する隠れ層の数を決定する方法を調べます。
2つの隠れ層を必要とする問題はめったに発生しません。ただし、2つの隠れ層を持つニューラルネットワークは、あらゆる種類の形状の関数を表すことができます。現在、3つ以上の隠れ層を持つニューラルネットワークを使用する理論的な理由はありません。実際、多くの実際的な問題では、複数の隠れ層を使用する理由はありません。表5.1は、さまざまな隠れ層を持つニューラルネットワークアーキテクチャの機能をまとめたものです。
表5.1:隠しレイヤーの数の決定
| 隠しレイヤーの数| 結果| 0-線形の分離可能な関数または決定のみを表現できます。 1-連続マッピングを含む関数を近似できます ある有限空間から別の有限空間へ。 2-任意の精度で任意の決定境界を表すことができます 合理的な活性化関数で あらゆる精度へのマッピング。隠れニューロン層の数を決定することは、問題のほんの一部です。また、これらの各隠れ層に含まれるニューロンの数も決定する必要があります。このプロセスについては、次のセクションで説明します。
隠れ層のニューロン数
隠れ層のニューロン数を決定することは、ニューラルネットワークアーキテクチャ全体を決定する上で非常に重要な部分です。これらのレイヤーは外部環境と直接対話しませんが、最終出力に大きな影響を及ぼします。隠れ層の数とこれらの隠れ層のそれぞれのニューロンの数の両方を慎重に検討する必要があります。
隠れ層で使用するニューロンが少なすぎると、アンダーフィットと呼ばれるものが生じます。複雑なデータセットの信号を適切に検出するには、隠れ層のニューロンが少なすぎる場合にアンダーフィットが発生します。
隠れ層であまりにも多くのニューロンを使用すると、いくつかの問題が発生する可能性があります。まず、隠れ層のニューロンが多すぎると、過剰適合が発生する可能性があります。過剰適合は、ニューラルネットワークの情報処理能力が非常に大きいため、トレーニングセットに含まれる限られた量の情報では、隠れ層のすべてのニューロンをトレーニングするには不十分です。2番目の問題は、トレーニングデータが十分であっても発生する可能性があります。隠れ層のニューロンが異常に多いと、ネットワークのトレーニングにかかる時間が長くなる可能性があります。トレーニング時間は、ニューラルネットワークを適切にトレーニングすることが不可能になるまで増加する可能性があります。明らかに、隠れ層のニューロンの数が多すぎても少なすぎても、ある程度の妥協点に到達する必要があります。
次のように、隠れ層で使用するニューロンの正しい数を決定するための経験則の多くの方法があります。
- 隠れニューロンの数は、入力層のサイズと出力層のサイズの間でなければなりません。
- 隠れニューロンの数は、入力層のサイズの2/3に出力層のサイズを加えたものでなければなりません。
- 隠れニューロンの数は、入力層のサイズの2倍未満でなければなりません。
これらの3つのルールは、検討するための出発点となります。最終的に、ニューラルネットワークのアーキテクチャの選択は試行錯誤に委ねられます。しかし、試行錯誤とはどういう意味ですか?ランダムな数のレイヤーとニューロンをネットワークに投入し始めたくありません。そのためには非常に時間がかかります。第8章「ニューラルネットワークのプルーニング」では、ニューラルネットワークの最適な構造を決定するさまざまな方法について説明します。
私はまた、researchgate.netで見つけた回答から次のスニペットが好きです。
ステフェンBピーターセン・オールボー大学
[...]
ノードの数を一般化するネットワークの能力を確保するために、可能な限り低く保つ必要があります。過剰なノードがある場合、ネットワークはメモリバンクになり、トレーニングセットを完全に呼び出すことができますが、トレーニングセットの一部ではないサンプルではうまく機能しません。
私は現在、これについての実証的研究に取り組んでいます(HPC施設でのプロセッサー世紀のシミュレーションのアプローチ!)。私のアドバイスは、「大規模な」ネットワークと正則化を使用することです。正則化を使用する場合、ネットワークアーキテクチャの重要性は低くなります(キャプチャしたい基になる関数を表すのに十分な大きさであれば)が、正則化を調整する必要がありますパラメータを適切に。
アーキテクチャの選択に関する問題の1つは、それがモデルの複雑さを連続的ではなく離散的に制御するため、特に理想的な複雑さが低い場合には、やや鈍い道具になる可能性があることです。
ただし、これはすべて「無料昼食なし」の定理に従います。ほとんどの場合、正則化は効果的ですが、アーキテクチャの選択がよりうまく機能する場合が常にあり、それが当面の問題に当てはまるかどうかを調べる唯一の方法です両方のアプローチを試し、相互検証することです。
自動ニューラルネットワークビルダーを構築する場合、ラドフォードニールのハイブリッドモンテカルロ(HMC)サンプリングベースのベイジアンアプローチを使用し、単一のネットワークの重みを最適化するのではなく、大規模なネットワークを使用して重みで統合します。しかし、それは計算コストが高く、少し「黒魔術」ですが、ニール教授が達成した結果は、それが価値があることを示唆しています!
私の知る限り、レイヤーの数と各レイヤーのニューロンを自動的に選択する方法はありません。ただし、EANN(Evolutionary Artificial Neural Networks、遺伝的アルゴリズムを使用してトポロジを進化させた)など、トポロジを自動的に構築できるネットワークがあります。
いくつかのアプローチがありますが、良い結果をもたらすと思われる多かれ少なかれモダンなアプローチは、NEAT(拡張トポロジーのニューロ進化)でした。
申し訳ありませんが、まだコメントを投稿できませんのでご容赦ください。とにかく、私はこのディスカッションスレッドにぶつかり、最近見た論文を思い出しました。ここに参加している人々にとって興味があるかもしれないと思う:
AdaNet:人工ニューラルネットワークの適応構造学習
コリーナ・コルテス、ザビエル・ゴンサルボ、ヴィタリー・クズネツォフ、メーリャル・モーリ、スコット・ヤン; 第34回機械学習に関する国際会議、PMLR 70:874-883、2017年の議事録。
要約人工ニューラルネットワークを分析および学習するための新しいフレームワークを提示します。私たちのアプローチは、ネットワークの構造とその重みの両方を同時に適応的に学習します。この方法論は、強力なデータ依存の理論的学習保証に基づいており、最終的なネットワークアーキテクチャが特定の問題の複雑さに確実に適応するようになっています。
あまり一般的ではないが、非常に効果的な方法を提案したいと思います。
基本的に、潜在的なオプションの小さなサブセット(レイヤーごとのランダムな数とノード)を試す「遺伝的アルゴリズム」と呼ばれるアルゴリズムのセットを活用できます。次に、このオプションの集団を、生物が進化するように1つまたは複数の親を組み合わせたり変異させたりすることで、子を作成する「親」として扱います。最高の子供たちといくつかのランダムなOKの子供たちは、世代ごとに保持され、世代を超えて、適者は生き残ります。
パラメーターが100個以下の場合(レイヤー数、レイヤーの種類、レイヤーごとのニューロン数の選択など)、この方法は非常に効果的です。各世代に多数の潜在的なネットワークアーキテクチャを作成し、学習曲線を推定できるまで部分的にトレーニングすることで使用します(通常、多くのパラメーターに応じて100〜10kのミニバッチ)。数世代後、トレインと検証のエラー率が大幅に異なる(オーバーフィッティング)開始点を、子を選択する目的関数として検討することができます。結論にすばやく到達するために最終モデルを選択するまで、データの非常に小さなサブセット(10〜20%)を使用することをお勧めします。また、ネットワークの初期化に単一のシードを使用して、結果を適切に比較します。
10〜50世代は、まともなサイズのネットワークで素晴らしい結果をもたらすはずです。