進化的アルゴリズム、遺伝的プログラミングと学習

1. 説明

進化的アルゴリズムは、自然 (ダーウィンの)進化プロセス        に触発された検索アルゴリズムのファミリーです。さまざまな家族のメンバー全員に共通しているのは、自然の遺伝学と自然選択にヒントを得た技術を適用することによって、

  •         初期の演算子を進化させることにより、
  •         問題に対するより適切な (つまり、より良い) 解決策が時間内に現れるように、問題を解決するための候補解決策のランダムな母集団。

        この分野の起源は 1950 年代と 1960 年代に遡りますが、過去 20 年間で頭角を現し、最適化、自動プログラミング、電子回路設計など、非常に多様な分野の数多くの問題の解決に成功していることが証明されています。 、電気通信、ネットワーク、金融、経済、画像解析、信号処理、音楽、芸術。

        興味深いことに、私も含めた研究者たちは、進化的アルゴリズムを有益な方法で機械学習や深層学習と組み合わせることができることを発見しています。それについては後で詳しく説明します。

2. 遺伝的アルゴリズムの構造

        基本的な進化アルゴリズムは次のようになります。

  1. 当面の問題に対する解決策の候補となる個人の初期母集団を生成する
  2. 解決策を求める問題に基づいて各人の適性を評価します
  3. 終了条件を満たさない場合は、より育種に適した個体の選抜・ 組換え交叉)個体・ 変異個体・ 改変個体の適応性の評価



進化的アルゴリズムの主なコンポーネントを見てみましょう。

ゲノム(染色体)。進化的アルゴリズムは基本的に母集団に基づいています。集団内の個人はゲノムまたは染色体と呼ばれます。ビット文字列、実数値ベクトル、文字ベースのエンコーディング、コンピューター プログラムなど、さまざまな形式を取ることができます。当面の問題に適した表現を設計することは、進化的アルゴリズムの成功にとって重要です。

フィットネス、またはフィットネス機能母集団内の候補ソリューションの品質の尺度。この関数を適切に定義することも、進化的アルゴリズムの成功にとって重要です。

世代上記の while ループを 1 回繰り返します。

を選択します進化的アルゴリズムは、遺伝的 (つまり、「遺伝的」) 物質を次世代に提供するために (通常は確率的に) 適合性の高い個体を選択する演算子です。

クロス。2 つ (またはそれ以上) の候補解 (親) を何らかの事前定義された方法で組み合わせて子孫を形成する 2 つの主要な遺伝演算子のうちの 1 つ。

突然変異2 番目の主要な遺伝的オペレーター。候補解の 1 つがランダムに変更されます。

簡単な例を挙げてみましょう長さ 10 のビット列 (ゲノム) である 4 人の個体からなる集団を考えてみましょう。適合度の値は、
ビット文字列内の 1 つの数値に等しくなります。もちろん、実際の応用では、集団サイズとゲノム長はさらに大きくなります。

この場合、適応度の計算は非常に簡単です。人の中の 1 の数を数えるだけです。現実世界の問題では、通常、適合度値を取得するためにいくつかの複雑な計算を実行する必要があります。

初期のランダム母集団は次のようになります (適応度の値は括弧内にあります): 0000011011 (4)、1110111101 (8)、0010000010 (2)、0011010000 (3)。

選択内容は、親ペアとして、1110111101 (8) と 0011010000 (3)、0000011011 (4) と 1110111101 (8) を選択できます。一部の人は他の人よりも選択される可能性が高く、一部の人はまったく選択されない可能性があることに注意してください。選択は確率的であり、健康状態に依存します。適応度が高いほど、親として選ばれる確率が高くなります。

クロスオーバー オペレーターは、ペアの親間でランダムなチャンクを交換し、その後に少数のビットをランダムに反転する突然変異オペレーターが続きます。

選択、交差、突然変異を行うと、新しい世代が得られます。この例では、1111010000 (5)、0010101101 (5)、0000011011 (4)、1110111111 (9) のようになります。はい、この親を少しだけ、あの親を少しだけ変えて、少し変更すると、改善されたソリューション、フィットネス 9 が完成します (以前の最高は 8 でした)。

何をするべきだろう?十分な解決策が得られるまで、選択、交差、突然変異、適応という世代を繰り返してください。もしかしたら最高かもしれない。

3. 遺伝的アルゴリズムプログラミング

        さあ、もっと面白くしてみましょう。なぜ単純なビット列を開発するのでしょうか? 進化的アルゴリズム内の主要なサブフィールドの 1 つは、より複雑な表現の使用に焦点を当てた遺伝的プログラミングと呼ばれます伝統的に、これらは計算ツリーですが、長年にわたって他の多くの表現が提案されてきました。

        計算ツリーは次のようになります。

私はこのツリーを        遺伝的プログラミングを通じて進化させ、実際に等価な数式 x⁴ + x³ + x² + x + 1 を (再帰的に) 計算します。進化により、次のようなより複雑なツリーが生成される場合があります。

4. 機械学習と深層学習

        私や他の人がここ数年で発見したように、進化的アルゴリズムの主な利点の 1 つは、正しく使用された場合に、機械学習と深層学習をどのように「再生」するかです。

        たとえば、機械学習のコンテキストでは、XGBoost、LightGBM、ディープ ニューラル ネットワークと競合する進化ベースの分類器を多数設計しました。以下は全文です。

        深層学習のコンテキストでは、複数の集団が共進化して深層ネットワークの活性化関数を進化させる、いわゆる共進化アルゴリズムを使用します。標準的な ReLU、シグモイドなどを使用する代わりに、進化した活性化関数を深いネットワークに接続し、それらのパフォーマンスが向上することを示します。以下は全文です。

敵対的ディープラーニングの分野        では、研究者はモデルの防御を改善することと新しい攻撃を考案することを目的として、攻撃に対するディープモデルの脆弱性を調査しています。検出できない入力画像の小さな変化は、ネットワークでエラーを引き起こす可能性があります。

        ある研究では、進化を利用して、グラデーションを使用せずに、パフォーマンスが高く、現実的に見える、物理的にもっともらしい敵対的パッチを生成します。GAN (Generative Adversarial Network) ジェネレーターを使用しました。事前トレーニングされたジェネレーターが与えられた場合、オブジェクト検出器にエラーを引き起こす原因となる、生成された画像に対応する入力潜在ベクトルを探します。潜在空間の(比較的)小さい次元を利用し、進化戦略アルゴリズムを使用して勾配を近似します。このアルゴリズムは、適切な敵対的パッチが発見されるまで、ターゲット オブジェクト検出器にクエリを実行することによって入力潜在ベクトルを繰り返し更新します。

        下の目撃者は、私の優秀な大学院生であるラズ・ラピッドが、彼の恋人の隣に立って、進化するパッチ(印刷された、つまり物理的な)が外部の深層学習モデル(境界ボックスなし)の中にどのように彼を隠しているかを示しています。全文はこちら。

詳細と論文全文については、私のウェブサイトをぜひご覧ください。

進化的アルゴリズムを使い始めるのはどのくらい難しいですかそうですね、世の中にたくさんある優れたパッケージの 1 つから始めたいと思います。恥ずかしがらずに、私が始めたプロジェクト、そして私の素晴らしい協力者や大学院生たち、  EC-KitYを推薦したいと思います。

このプロジェクトには複数の目標があるため、EC-KitY は次のようになります。

  • 進化的アルゴリズムを実行するための包括的なツールキット。
  • Python で書かれています。
  • scikit-learn の有無に関係なく動作します。つまり、sklearn モードと非 sklearn モードの両方をサポートします。
  • 最新のソフトウェアエンジニアリングを念頭に置いて設計されています。
  • すべての一般的な進化アルゴリズム パラダイムをサポートするように設計されています。

わずか 3 行のコードで進化的アルゴリズムを実行できます。


algo = SimpleEvolution(Subpopulation(SymbolicRegressionEvaluator()))algo.evolve()print(f'algo.execute(x=2,y=3,z=4): {algo.execute(x=2, y=3, z=4)

}')

次のコード スニペットに示すように、EC-KitY は scikit-learn とも互換性があります。

X, y = make_regression(n_samples=100, n_features=3)terminal_set = create_terminal_set(X)algo = SimpleEvolution(Subpopulation(creators=FullCreator(terminal_set=terminal_set),
 evaluator=RegressionEvaluator()))regressor = SKRegressor(algo)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)regressor.fit(X_train, y_train)


print('MAE on test set:', mean_absolute_error(y_test, regressor.predict(X_test)))

チャールズ・ダーウィンの引用、『種の起源』の結論文で終わりたい        と思います

        この生命観は壮大であり、そのいくつかの力は、もともといくつかの形または 1 つの形に吹き込まれており、惑星は一定の重力の法則に従って循環していますが、そのような単純な始まりから、最も美しく素晴らしい形が生まれています。進化し、進化し続けています。モーゼス・シッパー博士

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/132911755