GA(遺伝的アルゴリズム)の悲哀

GA(Genetic Algorithm)とは

 GA(遺伝的アルゴリズム)を知っていますか?理系の方だったらひょっとしたら知っているかもしれないですね。

 その名の通り、生物が交配によって子孫を残す際の遺伝子の交叉・突然変異・淘汰といった仕組みをモデル化したアルゴリズムです。今は、脳の仕組みをモデル化したニューラルネットワーク(ディープラーニング)が全盛ですが、自分がまだ学生だった、今のニューラルネットワークブームが冬の時代には、このGAが熱狂的ブームになった時代があったのです。歴史は繰り返すというやつですね。

 実は、自分も大学のときの研究にGAを少しだけ使ったことがあったりするので、想い出深いアルゴリズムです。C++でフルスクラッチで実装したこともあります。

GAの応用例

 これだけだと、GAが何に使えるかイマイチ分からないかもしれません。GAを使えば、何かしら評価ができる問題であれば、試行錯誤を繰り返すことで、素早く良さそうな解(最適解ではない)を得ることができるので、わりと幅広く適用できます(なので流行りました)。

 面白い例では、以下のような仮想生物を進化させることができます。

 詳しくは以下記事参照ください。

 あとは、遺伝的アルゴリズムで最高にエッチな画像を作ろう!というプロジェクトがネットで話題になったこともありました。ただ、GA単体では画像認識や画像生成は、基本的には厳しいです。

 一方、ニューラルネットワークと組み合わせて性能を上げたり効率化するような試みはよくされています。画像生成の例で、Stable DiffusionとGAの組み合わせだと、メンターとして参加したNASAのハッカソンでの事例note CXOの深津さんが雑誌の表紙画像を生成するのに活用した事例があったりします。

 自分も試しに、Google Colab NotebookでStable DiffusionとGAの組み合わせを試したりしてみました。

 自分の場合は、プロンプトを交叉しているわけではなくて、以下の図のClip(Transformer)で変換したあとの埋め込みベクトルを交叉したり、Seedを突然変異という名のもとに、適当な数字に変えたりしてます

 例えば、まず複数の動物の遺伝子(埋め込みベクトル)を準備します。

 これらを交叉したり、突然変異させたりすることで、以下のようにバリエーションを増やすことができます。

 世代交代繰り返すと、以下のようなパンダとペンギンを組み合わせたようなキメラが産まれたりします。

 現実世界でやったら、完全にマッドサイエンティストですね(笑)

追記:評価関数に関して

 コメントで以下の指摘ありました。

GA(遺伝的アルゴリズム)の悲哀 - karaage. [からあげ]

遺伝的アルゴリズムと言う割に評価関数作れるんだろうか?評価関数なかったらただのモンテカルロ法のような

2023/01/11 12:49

 ちゃんと説明できていませんでしたが、評価関数はなんと自分の主観です(笑)私が良いと思った個体を選択肢し、交叉しています。他の選ばれなかった個体は淘汰されていきます。

 なんとこういった深層学習におけるhuman-in-the-loop的な手法は、GAだと模擬育種法と呼ばれて提案されていたらしいです。

まとめ:GAの悲哀

 GAの紹介をしてみました。GAって、実際に使ったことある人なら共感する人多いのではないかと思いますが、かなり残酷なアルゴリズムです。

 具体的には、優れた組み合わせの遺伝子を獲得するために、大量に交配を繰り返してできの悪い個体を抹消(淘汰)するという極悪非道な行為を何世代も繰り返します。人間社会でやっていることそのものですね。

 もちろん、実際は遺伝子で全部が決まるわけではないと思いますが、多くの凡才が一部の天才を産み出すための過程であったり土壌であったり犠牲であったりするのかもなと感じたりもします。

 まあ産まれてきてしまったものは仕方ないので、多少遺伝子の組み合わせは悪くても、精一杯頑張るのが凡人の生存戦略なのでしょう。あとは環境によって必要な遺伝子の組み合わせ(才能)も変わってくるはずなので、自分にとって最適な環境を見つけるというのは大事なのかなと思ったりします。

関連記事