-1

序章

私は、人工知能、機械学習、およびニューラル ネットワークに非常に慣れていません。

この種のシステムの機能をテストするために、FANN (Fast Artificial Neural Network)ライブラリ (C++) を使用してコーディングを試みました。

プログラミング

教師あり学習を処理するための学習ファイルを生成する小さなコードを作成しました。私はすでにいくつかのテストを行っていますが、これは、同じ問題を解決するために、隠れ層の組織と AI 機能との関係を理解するのに役立ちました。

私の観察を説明するために、表記法ABC-[...]-Xを使用して、 A入力ニューロン、最初の隠れ層のBニューロン、2 番目の隠れ層のCニューロン、...、およびX出力ニューロンの構成を描写します。

これらのテストでは、学習データは、機能するNOT 関数 (f(0)=1 ; f(1)=0) (多くの言語で「!」に相当)の 2k のランダムな結果でしたエポックは、すべての学習データに対する 1 つのトレーニング テストを表すことにも注意してください。「AI」は訓練された ANN を表します。

学習データに誤りはありません。

ソース コード全体は、私の GitHub Repo にあります。

多いほど良くない

まず、1-1-1 システムは、1-[5 ニューロンの 50 層]-1 が 20k エポックよりも 37 エポックの方が強力であることに気付きました (0.25 に対して 0.0001 エラー率)。

私の最初の意見は、最小限に抑えるにはより多くのコストがかかるため、2 番目の AI にはより多くのトレーニングが必要であるということでしたが、これが唯一の理由かどうかはわかりません.

これにより、同じ総数のニューロンでいくつかのテストを試すようになりました。

等しいは等しくない

1-2-2-1 構成は 1-4-1 構成よりも効率的と思われる

実際、これら 2 つの異なる構成でテストを実行すると、これらの出力が得られました (独自にコード化されたテスト プログラム)。これらは 2 つの異なるテストです。"9**" はテストの現在のインデックスです。

テストは、AI に 0 と 1 の間のランダムな int を与え、出力を出力することで構成されます。各テストは個別に実行されています。

// 1-2-2-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 1.000000, output : 0.009162
[938]Number : 0.000000, output : 1.000000
[939]Number : 0.000000, output : 1.000000
[940]Number : 1.000000, output : 0.009162
[941]Number : 0.000000, output : 1.000000
[942]Number : 0.000000, output : 1.000000

// 1-4-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 0.000000, output : 1.000000
[938]Number : 1.000000, output : 0.024513
[939]Number : 0.000000, output : 1.000000
[940]Number : 0.000000, output : 1.000000
[941]Number : 1.000000, output : 0.024513
[942]Number : 1.000000, output : 0.024513

最初の構成では、2 番目の構成よりも 0 に近い結果が得られることがわかります。( 0.024513に対して0.009162 )。これは IEEE エンコーディングの問題ではなく、別のテストを実行してもこれら 2 つの値は変わりません。

その理由は何ですか?それを理解しようとしましょう。

  • 最初の構成にはいくつの「シナプス」がありますか?

最初

first[0]->second[0]
first[0]->second[1]

それから

second[0]->third[0]
second[0]->third[1]
second[1]->third[0]
second[1]->third[1]

最後の

third[0]->first[0]
third[1]->first[0]

したがって、合計で2 + 4 + 2 = 8 個のシナプスが得られます。(したがって、8 つの異なる重みの可能性)。

  • 2番目の構成はどうですか?

最初

first[0]->second[0]
first[0]->second[1]
first[0]->second[2]
first[0]->second[3]

最後の

second[0]->third[0]
second[1]->third[0]
second[2]->third[0]
second[3]->third[0]

したがって、合計4 + 4 = 8 個のシナプスが得られます。(まだ 8 つの異なる重みの可能性)。

また、両方のシステムに4 つの活性化関数があります(各ニューロンに 1 つ)。

同じ特性を持つ能力の有意な差をどのように得ることができますか?

4

1 に答える 1

3

一般に、多数のノードと重みがあると、ニューラル ネットワークが過度に専門化される可能性があります。少し極端な例: 数千の画像がある場合、数十億のノード (およびさらに多くの重み) を持つニューラル ネットワークは、「目」という概念を見つける代わりに、トレーニング データのすべてのピクセルを学習する危険があります。耳」、…「顔」を構成します。そのため、特殊化されたニューラル ネットワークをさまざまな画像で提示すると、それらの画像では機能しません (少なくとも、それほどうまく機能しません)。抽象的な概念 (たとえば、「猫には耳と目があり」、「家には窓がある」など) は解決されていません。

あなたのテストでは、過度に専門化することはあまりありませんが、これによる (マイナーな) 影響がまだ見られる場合があります。

同じプロパティ: 重みの数は同じですが、構造が異なります。ノードの直線 (1-1-1-...-1) で構成されるニューラル ネットワークは、よりコンパクトなノード (1-20-1) とはまったく異なる動作をします。1-1-1-...-1 ネットワークは、1-20-1 ネットワークが学習できることを学習できない可能性があります (ただし、ブール代数を学習するために必要なノード/重みの数にはいくつかのルールがあります)私はそれらを覚えていません)。

「1-4-1」は、各中間ノードがより多くの重みの影響を受けるため、期待される結果からより多くの偏差を示していると思います.ノードごとに適切な重みが増えるほど、トレーニングに時間がかかります.

1-2-2-1 ネットワークでは、最初の中間層にはノードごとの入力として 1 つの重みしかなく、2 番目の中間層にはノードごとに 2 つの重みがあり、出力層にはノードごとに 2 つの重みがあります。そのため、最大で、中間ノードごとに 2 つの値を「小刻みに動かす」ことができます。

あなたのニューラル ネットワーク (重みが適用される関数) の詳細はわかりませんが、次の例を考えると、物事が明確になるかもしれません。

  • 関数が f(weight, input) = input*weight + constant であると仮定しましょう
  • さらに、ネットワークは 1-1 です (つまり、決定する重みが 1 つあります)。

その 1 つの重みが -1 で定数が 1 の場合、否定関数があります。そのニューラル ネットワークは、トレーニング速度と精度の両方で、より大きなネットワークを凌駕するでしょう。より多くのノード (したがって重み) を持つネットワークは、「否定」という概念を表すものを見つけるまで、すべての重みの微妙なバランスを解決する必要があります。おそらく、そのニューラル ネットワークには多くのゼロが含まれます (つまり、「その入力を無視します") と、否定を行う 1 つのパス。

さらなる研究の糧として: ニューラル ネットワークは、あいまいなデータには適していますが、代数関数を 10 桁まで取得するにはあまり適していません。

于 2016-12-30T16:53:05.053 に答える