私は一般的に人工ニューラルネットワークとNeuroEvolutionアルゴリズムに不慣れです。 NEAT(NeuroEvolution of Augmented Topologies))というアルゴリズムを実装しようとしていますが、 元の公開論文 の説明では、の重みを進化させる方法を見逃しています。ネットワーク、それは言う
接続の重みは、他のNEシステムと同様に変化し、各接続は各世代で摂動されるかどうかにかかわらず変化します
NEシステムで重みを変更する方法について検索しましたが、残念ながら詳細な説明が見つかりません。
ニューラルネットワークのトレーニング中は、通常、バックプロパゲーションアルゴリズムを使用して重みを修正しますが、世代を通じて固定トポロジ(構造)があり、問題の答えがわかっている場合にのみ機能します。 NeuroEvolutionでは、答えがわかりません。適応度関数しかないため、ここでバックプロパゲーションを使用することはできません。
私は、遺伝的アルゴリズムを使用して固定トポロジーNNをトレーニングした経験があります(この論文では「従来のNEアプローチ」と呼んでいます)。これに使用したいくつかの異なる突然変異および複製演算子があり、それらをランダムに選択しました。
2つの親がある場合、複製演算子(これらのクロスオーバー演算子と呼ぶこともできます)には次のものが含まれます。
ネットワーク内の特定のニューロンの単一の重みまたはすべての重みを交換します。したがって、たとえば、繁殖用に選択された2人の親が与えられた場合、ネットワーク内の特定の重みを選択して値を交換します(交換では、2つの子孫を生成し、次世代の集団で生き残るために最適な子孫を選択しました)。または、ネットワーク内の特定のニューロンを選択し、そのニューロンのすべての重みを交換して、2つの子孫を生成します。
レイヤー全体の重みを交換します。したがって、親AとBが与えられた場合、特定のレイヤー(両方で同じレイヤー)を選択し、それらの間ですべての重みを交換して、2つのオフスピングを生成します。これは大きな動きなので、この操作が他の操作よりも選択される頻度が少なくなるように設定しました。また、ネットワークに数層しかない場合、これは意味をなさない場合があります。
私たちの突然変異演算子は単一のネットワーク上で動作し、ランダムな重みと次のいずれかを選択します。
あなたは確かに突然変異演算子で創造的になることができます、あなたはあなたの特定の問題のためによりよく働く何かを発見するかもしれません。
IIRCでは、ランダムな比例選択に基づいて母集団から2つの親を選択し、それぞれに対して突然変異操作を実行し、次にこれらの突然変異した親を生殖操作で実行し、2つの子孫を適応度関数で実行して、最適な1つを選択します。次世代の人口に。
もちろん、あなたの場合、トポロジーも進化させているので、選択した2つの親が完全に異なるトポロジーを持つ可能性があるため、上記のこれらの複製操作の一部はあまり意味がありません。 NEAT(私が理解しているように)では、ネットワークの非隣接レイヤー間で接続を確立できます。たとえば、レイヤー1ニューロンに、直接フィードする代わりに、レイヤー4で別のニューロンをフィードさせることができます。これにより、ニューロンのすべての重みを含むスワッピング操作がより困難になります。ネットワーク内で同じ数の重みを持つ2つのニューロンを選択するか、ネットワーク内の単一の重みの交換に固執することができます。
NEのトレーニング中は、通常、バックプロパゲーションアルゴリズムを使用して重みを修正することを知っています。
実際、NEではbackpropは使用されていません。バックプロパゲーションの代わりにネットワークをトレーニングしているのは、GAによって実行されるミューテーションです。この場合、バックプロパゲーションは、ネットワークへの「非正統的」な追加のために問題がありました。 。ただし、バックプロパゲーションが可能であれば、私はそれを採用しました。NNをトレーニングするための遺伝的アプローチは、バックプロパゲーションよりもはるかにゆっくりと進行するようです。また、ネットワークの重みを調整するための進化的方法を使用する場合は、クロスオーバーや突然変異率など、GAのさまざまなパラメータを微調整する必要があります。
NEATでは、すべてが遺伝子演算子を介して行われます。すでにご存知のように、トポロジーはクロスオーバーイベントとミューテーションイベントを通じて進化します。
重みは、突然変異イベントを通じて進化します。他の進化的アルゴリズムと同様に、重みがランダムに変更される可能性があります(新しい数値を生成するか、元の重みに正規分布の乱数を追加するなど)。
NEATの実装は簡単な作業のように思えるかもしれませんが、最終的にはかなり複雑になる細かい詳細がたくさんあります。既存の実装を調べて、そのうちの1つを使用するか、少なくとも重要なものはすべて NEATユーザーページ にあります。