タスクについて簡単に説明すると:車両-私たちの場合はエイリアン、またはホイール上のシンガーミシンのいずれか、単に「エージェント」と呼びましょう-最初から最後まで同じ名前のノイズで砂丘に沿って運転する必要があります。 これは、エージェントがサンドボックスでどのように見えるかです:
トラックの後ろに触れるか、目標に向かって移動する際に適切な熱意を示さないエージェントは、トラックから削除されます。
ニューラルネットワークを使用して問題を解決しますが、遺伝的アルゴリズム(GA)によって最適化されます 。このプロセスは、 神経進化と呼ばれます 。 私たちは、世紀の初めにケネス・スタンレーとリスト・ミークライネンによって発明されたNEAT(NeuroEvolution of Augmenting Topologies)メソッドを使用しました。すでにNEATを実装する独自のフレームワークがありました。 そのため、率直に言って、解決方法を選択しませんでした。むしろ、完成した方法を実行できるタスクを選択しました。
図は、遺伝的アルゴリズムのおおよそのスキームを示しています。
まともなGAは最初の母集団から始まることがわかります( 母集団は潜在的なソリューションのセットです)。 私たちはその創造に従事すると同時に、NEATの最初の原則に精通します。 この原則によれば、開始集団のすべてのエージェントは、ニューラルネットワークの最も単純な「最小」トポロジを持つ必要があります。 トポロジはそれと何の関係がありますか? 事実、NEATでは、接続の重みの最適化とともに、ネットワークアーキテクチャも進化しています。 ちなみに、これにより、タスクの設計が不要になります。 単純なアーキテクチャから複雑なアーキテクチャへの移行は論理的であるだけでなく、実用的でもあるため(検索スペースが少なくなります)、最小限のトポロジから開始する必要があります。これが、メソッドの作成者が推論した方法です。
私たちと同様のすべての場合、この最小限のトポロジは次の考慮事項から導き出されます。 意味のある何かをするために、エージェントは以下を必要とします:
- 環境とその状態に関する情報を持っている、
- この情報を処理する
- あなたの世界と対話します。
最初の役割はセンサーによって実行されます-入力層のニューロン、エージェントに役立つ情報を提供します。 出力層ニューロンは、センサーからのデータを処理します。 アクター (出力層の「それらの」ニューロンからの信号に応答して機械的動作を実行するデバイス)は、環境との対話を担当します。 したがって、初期構成を構築する一般的な原則は次のとおりです。センサーとアクチュエーターで決定し、アクチュエーターごとに1つのニューロンを開始し、すべてのセンサーともう1つの特別なニューロンを接続します- 変位ニューロン ( バイアス 、以下)、すべてのニューロンのランダムな重み出力層。 このようなもの:
b-バイアス、s-センサー、o-出力層のニューロン、a-アクチュエーター、n-センサーの数、k-アクチュエーターの数
そして、ここに私たちのタスクのための最小限のNSがあります:
アクチュエータは1つしかありません。これは、車輪を作成するエンジンです。 パイプの射撃、ジャンプ、プレイの方法はまだわかりません。 次の値は、出力レイヤーの単一のニューロンからエンジンに適用されます(レイヤーと呼ぶのは残念です):
ここで、w bは、バイアスから出力ニューロンへの接続の重みの値に、バイアスが「生じる」、つまり + 1、s iはi番目のセンサーの範囲[0,1]に正規化された値、wiはi番目のセンサーから出力ニューロンへの接続重みの値、fは活性化関数です。
アクティベーション関数として、このソフトサインファンタジーを使用します。
-彼女は、狭い円で有名な神経進化論者のテストで最高のパフォーマンスを示しました[2] 。 そして、この関数の曲げの柔らかさとグラフの対称性を、角度を曲げたLeaky ReLUと比較することは意味がありません。
この図は、異なる値のアクティベーション関数に対するエージェントの反応を示しています。 ユニティ値に近いとき、エンジンはホイールを時計回りに回転させ、エージェントを前方に加速し、ハウジングを後方に強く傾けます。そのため、気の弱い、しかし勇敢な人はすぐに背中を倒して死にます。 値が0に近い場合、反対のことが当てはまり、値が0.5の場合、エージェントモーターは動作しません。
同じ図は、変位ニューロンの役割を示しています-横軸に沿った変位f(x)の大きさと方向は、(1)から次のように、そこから出力層のニューロンに向かう結合の重みが原因です。 図の点線は、w b = -1の活性化関数のグラフを示しています。 センサーに信号がなくても、そのような接続のエージェントはかなり速く戻ることがわかります:f(x)= f(-1 + 0)≈0.083<0.5。 一般に、関数の値を水平方向にシフトすると、バイアス接続が微妙に(重量に応じて適切にまたは厚く)センサーのすべての値と接続の重量に対するエンジンの反応を一度に調整できます。 探索空間に新しい次元が追加されたようですが(w bの 「正しい」値を検索する必要があります)、追加の自由度という形での利点は、そのような変位の可能性を上回ります。
さて、将来の初期集団のエージェントのニューラルネットワークを提示しました。 しかし、NEATは遺伝的アルゴリズムであり、 遺伝子型(ネットワークの形成元である構造、より一般的にはデコードプロセスの表現型)で機能します。 表現型から始めてから、すべてを逆方向に実行します。上記のネットワークを遺伝子型でエンコードしようとします。 ここでは、 第2のNEAT原理がなくてはなりません。その主な本質は次のとおりです。遺伝子型では、ニューラルネットワークの構造とその接続の重みに加えて、情報はすべての要素の起源の履歴に保存されます。 この歴史的な側面を除いて、表現型はほぼ「一対一」の遺伝子型にエンコードされているため、ニューラルネットワークのフラグメントとしての第2の原理を説明します。
この原則の価値を過大評価することは困難です-それはエージェントに有性生殖の可能性を提供します。 トピックはかなりデリケートなので、まず無性生殖を検討します。 これは次のように発生します。エージェントのすべての遺伝子のコピーが作成され、それらのいくつかのタイプの変更の1つである突然変異が行われます。 NEATバージョンでは、次の突然変異が可能です。
- 接続重量の変更
- リンク解除
- リンクを追加
- ニューロン挿入。
最初の3種類の変異は、単純であり、さらに説明することなく理解できます。 ニューロンの挿入を次の図に示します。既存の接続の代わりに常に行われ、接続が削除され、その場所に2つの新しい接続が表示されます。
ここで、hは隠されたニューロンです。
2人のエージェントが性的生殖または交配に関与しています-親、そして結果として3番目が現れます-子供。 子どもの遺伝子型が形成される過程で、たとえば、 意味が同一である親の遺伝子または遺伝子のグループの交換が行われます。 2番目の原則は、同じ意味を持つ遺伝子を検索するために必要なものです。
上記のリストから異なる一連の突然変異を受けた遺伝子型とクロスエージェントをしたいと想像してください:
両方の親のトポロジーの点で一般的ないくつかのフラグメントを探し、胎児の遺伝子型のためにこれらのフラグメントの一部を取得することは論理的なようです。 これを行うのは難しいでしょう。NPでさえ一般的なケースでは難しいですが、私たちが管理したと仮定します。 この場合、右側の親には、左側の親のグラフと同型の2つのサブグラフがあることがわかります。 次の図では、これらのサブグラフの円弧が異なる色で強調表示されています。
左側の親遺伝子との組換えのために選択するのはどれですか?
これらの遺伝子型の出現の歴史を見てみましょう。
親エージェントの両方の祖先は、予想どおり、最小限のNS(T 0 )で開始しました。 それらのゲノムはどういうわけかそこで突然変異し、左親の祖先の時間T 1の瞬間に、接続s 1- > oに隠れたニューロンの挿入がありました。 この劇的な瞬間に、結合s 1- > hおよびh-> oをコードする遺伝子は、左の親の祖先でそれらの意味を見つけます: リンクs 1- > oの置換 。
時間T 2での右の親の遺伝子型の遺伝子s 1- > h 1およびh 1- > oは、まったく同じ意味を持ちます。 私たちの先祖のさらなる運命は、私たちにとって特に興味のあるものではありません。
遺伝子の歴史を正しく書く方法は、特にこの分野でいくつかの小さな発見があるため、安定した生殖スキームへの元の技術の適応に関連しているので、次回の確認が可能になります。
締めくくりの時間です。 この記事はYoutubeで始まりました-そして、それを完成させます。 シミュレータの初期バージョンでは、トラックを生成するためのコードを書いた同僚が、それを底なしの深byで終わらせませんでした。 このような小さな宇宙の設計に対する、車輪の下にある大空の存在下で長い間進化してきたニューラルネットワークの反応は、おそらく「テンプレートブレーク」と呼ばれます。
サイバー自然主義者の生活からの他の逸話的な物語の広範なコレクションは[3]にあります。