フィードフォワード・ニューラル・ネットワークの隠れた層とノードの数をどのように選ぶか?

フィード・フォワード・ニューラル・ネットワークの層数と各層のノード数を選択するための標準的で受け入れられた方法はありますか?私は、ニューラルネットワークを自動で構築する方法に興味があります。

ソリューション

この質問には既に回答がなされていると思いますが、現存する回答は質問の主題に一般的に関連するリンクを示すだけで、実際には質問に関与していないように思います。特に、このリンク先では、プログラムによるネットワーク構成のための1つの手法が説明されていますが、それはネットワーク構成のための"[a] standard and accepted method"ではありません。 小さな明確なルールに従うことで、プログラム的に有能なネットワークアーキテクチャ(ニューロン層の数や種類、各層を構成するニューロンの数など)を設定することができます。このスキーマに従うと、有能なアーキテクチャが得られますが、おそらく最適なものではないでしょう。 しかし、一度ネットワークを初期化してしまえば、いくつかの補助的なアルゴリズムを使って、学習中に構成を繰り返し調整することができます。これらのアルゴリズムの1つは、一定回数の学習エポックの後に、重みベクトルの(小さな)値に基づいてノードを pruning することで、つまり、不要または冗長なノードを排除することです(詳細は後述)。 つまり、すべてのNNには3種類の層があります。入力」「隠蔽」「出力」の3種類です。 したがって、NNのアーキテクチャを作成するには、各タイプの層の数と、各層のノード数の値を考える必要があります。 入力層について 単純なことですが、すべてのNNにはちょうど1つの入力層があり、例外はありません。 この層を構成するニューロンの数については、学習データの形状がわかれば、このパラメータは完全に一意に決まります。具体的には、その層を構成するニューロンの数は、データの特徴量(列)の数と同じです。NNの構成によっては、バイアス項のためにノードを1つ追加するものもあります。 出力層の構成 入力層と同様に、すべてのNNは正確に1つの出力層を持ちます。出力層のサイズ(ニューロンの数)を決めるのは簡単で、モデルの構成によって完全に決まります。 あなたのNNは、Machine ModeとRegression Modeのどちらで実行されますか?(統計学でも使用される用語を別の意味で使用するMLの慣習は、非常に混乱を招きます。)マシンモード:クラスラベルを返します(例:"Premium Account"/"Basic Account")。リグレッションモードは、値(例:price)を返します。 NNが回帰器の場合、出力層には1つのノードがあります。 NNが分類器の場合、softmaxが使用されない限り、出力層は単一のノードを持ちます。 この場合、出力層はモデルのクラスラベルごとに1つのノードを持ちます。 隠れた層について 以上のいくつかのルールにより、入力層と出力層の層数とサイズ(ニューロン/層)が決まりました。残るは隠れた層です。 隠れ層の数は?もし、データが線形分離可能であれば(NNのコーディングを始める時点で分かっていることが多いですが)、隠れ層は全く必要ありません。もちろん、データを解決するためにNNが必要なわけではありませんが、それでも仕事はこなせます。 それ以外にも、ご存知のようにNNの隠れ層構成の問題については、山のようなコメントがあります(そのコメントの「優れた要約」[2]については、非常に詳細で洞察に満ちた[NN FAQ][1]をご覧ください)。このテーマの中でコンセンサスが得られている問題の1つは、隠れ層を追加することによるパフォーマンスの違いです。2つ目(または3つ目など)の隠れ層でパフォーマンスが向上する状況は非常に少ないです。大多数の問題では、1つの隠れ層で十分です。 では、隠れ層の大きさはどうでしょうか。ニューロンの数は?経験的に導き出された法則がいくつかありますが、その中でも最も一般的に頼りにされているのが '隠れ層の最適なサイズは、通常、入力層のサイズと出力層のサイズの間です*'。Introduction to Neural Networks in Java]3の著者であるJeff Heaton氏は、さらにいくつかの方法を提案しています。 まとめると、ほとんどの問題では、たった2つのルールを使って隠れ層の構成を設定するだけで、(2回目の最適化のステップがなくても)おそらくまともな性能を得ることができます。(i)隠れ層の数は1に等しい、(ii)隠れ層のニューロンの数は入力層と出力層のニューロンの平均値である。 *ネットワーク構成の最適化 Pruning***は、ネットワークのサイズを(レイヤーではなくノード単位で)切り詰めることで、計算性能や時には解像性能を向上させるための一連の技術について説明しています。これらの技術の要点は、ネットワークからノードを削除しても、ネットワークのパフォーマンス(データの解像度)に顕著な影響を与えないノードを特定することで、トレーニング中にネットワークからノードを削除することです。(正式なプルーニング技術を使用しなくても、トレーニング後の重み行列を見ることで、どのノードが重要でないかを大まかに把握することができます。)明らかに、トレーニング中にプルーニングアルゴリズムを使用する場合は、過剰な(つまり、'プルーニング可能な')ノードを持つ可能性が高いネットワーク構成から始めます。言い換えれば、ネットワークアーキテクチャを決定する際に、プルーニングステップを追加する場合は、より多くのニューロンを持つ側に舵を取ります。 別の言い方をすると、学習中にネットワークにプルーニングアルゴリズムを適用することで、最適なネットワーク構成に近づけることができます。これを1回の"up-front"(遺伝的アルゴリズムベースのアルゴリズムなど)でできるかどうかは分かりませんが、今のところ、この2段階の最適化が一般的であることは分かっています。 [1]: http://www.faqs.org/faqs/ai-faq/neural-nets/part1/preamble.html [2]: http://www.faqs.org/faqs/ai-faq/neural-nets/part1/preamble.html

解説 (16)

私は現在、これに関する実証的な研究に取り組んでいます(HPC施設でのシミュレーションは1,000プロセッサセンチュリーに迫る勢いです!)。 しかし、正則化のパラメータを適切に調整する必要があります。

アーキテクチャ選択の問題点の1つは、モデルの複雑さを連続的ではなく離散的に制御することであり、特に理想的な複雑さが低い場合には、少し鈍器のようなものになってしまいます。

正則化はほとんどの場合で効果的ですが、アーキテクチャ選択の方が効果的な場合もあるでしょうし、目の前の問題がそうであるかどうかを調べる唯一の方法は、両方のアプローチを試してクロスバリデーションを行うことです。

もし私が自動ニューラルネットワークビルダーを作るとしたら、Radford Neal'のHMC(Hybrid Monte Carlo)サンプリングベースのベイズ法を使い、1つのネットワークの重みを最適化するのではなく、大きなネットワークを使って重みを統合します。 しかし、これは計算コストが高く、ちょっとしたブラックアートですが、ニール教授が達成した結果を見ると、それだけの価値があると思います

解説 (2)

私の知る限りでは、層の数や各層のニューロンを自動的に選択する方法はありません。しかし、EANN(Evolutionary Artificial Neural Networks、遺伝的アルゴリズムを用いてトポロジーを進化させる)のように、トポロジーを自動的に構築できるネットワークはあります。

いくつかのアプローチがありますが、最近ではNEAT (Neuro Evolution of Augmented Topologies)が良い結果を出しているようです。

解説 (0)