見出し画像

プログラミングにおける賢い猫の手!?

AIと一緒にプログラムを書く時代の到来

「プログラムのコードを書いてくれるAIがあったらいいのにな」
はじめてプログラミング(Cでした)を学んでいたとき、ポインターの概念やデータ構造の理解に苦労していた大学時代に思っていたことです。

あれから約20年。実際にそんな世界を実現するAIが登場しました。

開発者と一緒にプログラミングを書いてくれる「GitHub Copilot」です。このAIを開発環境にインストールすると、途中まで書いたコードを補完してくれたり、コメントを読んでコードを提案してくれたりします。

GitHub CopilotはOpenAI、GitHub、Microsoftによって2021年に共同開発され、一部にのみ限定公開されていましたが、2022年6月21日に正式リリースとなり誰でも使えるようになりました(有料です)。

Visual Studio Codeの拡張機能としてCopilotをインストール&実行

Copilotをインストールすると、たとえば次のようにコメントを書くだけでそれに対応するコードを書いてくれます。「Hello Worldのプログラムを書く」というコメントを書き、defという関数を定義する部分を書くと自動的に残りにコードを補完してくれます。

「Hello World」と出力する関数ができたので、次は何を書こうかなと考えながら、コメント(##)を入力しました。すると、今度は「1から100まで出力するプログラムを書く」というコメントを自動生成しCopilotが提案してくれました!提案を受け入れると、次は実際に1から100まで出力するプログラムも自動生成してくれます。

自動生成されるコメントとプログラムを眺めているだけで、プログラミングそのものも学べてしまうのではないかという気さえしてきます。すごい世の中になったものです。大学生のときの私がそうであったように、プログラミングに対して難しいというイメージや苦手意識を持つ人も多いと思いますが、Copilotをうまく活用するとプログラミングの楽しさをより感じられるようになるのではないかと思います。

Copilotを応用した「賢い突然変異」の生成

さて、プログラミングの新たな可能性を開くCopilotですが、新たな画期的な使い方が提案されました。Copilotを(正しくはCopilotのベースとなったCodexという大規模な言語モデルです)「賢い突然変異」を生み出すツールとして利用するというアイディアです。

なぜこれが画期的なのかを理解するための事前知識となるのが「遺伝的プログラミング(Genetic Programming)」です。遺伝的プログラミングとは、生物の進化の仕組みを模倣する進化アルゴリズムをプログラムの生成に応用し、より効率的なプログラムを探索する手法です。遺伝的プログラムでは親となるプログラムに突然変異を加えて、親と少し異なる子プログラムを作成します。

このとき「どうやって親と少し異なる子プログラムを作るのか?」が問題となります。ここでCopilotの出番です。たとえば、先程示した「1から100まで出力するプログラム」を例に考えてみましょう。

親となるプログラムは最初に作成した次のプログラムです。

親プログラム

次に同じコメントを入力するとCopilotはたとえば次のような異なるバージョンを提案してくれます。1から100まで出力するけれど、3の倍数のときは「Fizz」と表示し、5の倍数のときは「Buzz」と表示し、3と5の公倍数のときは「FizzBuzz」と出力するというものです。

子プログラム

このようにCopilotを使うことで、親プログラムとは少し異なる「突然変異」が加わった子プログラムを作ることができます。

これまでの遺伝的プログラミングでは、親と少し異なる子プログラムを作るために主に使われていたのはランダムに変更するという方法でした。ところが、プログラムは一箇所でも文法に沿わないバグがあるとたちまち動かなくなってしまいます。そのため、文法を崩さない範囲での突然変異のみに制限することが必要でした。制限する方法によっては、思うように探索が進まないというジレンマに陥ってしまうことが多く、遺伝的プログラミングを使いこなすボトルネックになっていました。

Evolution through Large Models

Copilotは人間がプログラムを変更した履歴を使って学習されています。そのため、Copilotによって提案されるプログラムのバリエーションは、あたかも人間がプログラムを変更するときのような「賢い」突然変異を提案してくれるのです。

この賢い突然変異モデルを使えば、新しい課題を解決するプログラムの探索に使えるのではないか?そんな考えから提案されたのが「Evolution thourgh Large Models」という論文です。

論文の著者らは、Sodaraceというバネでつながった仮想生物を使った実験を行っています。この仮想生物はPythonコードから生成されるようになっていて、たとえば、下図左のPythonコードから、右図のような四角い形の仮想生物が生成されます。

「Evolution through Large Models」のListing 1(左)とFigure 6(右)より引用

このコードを初期状態として、大規模モデルによる賢い突然変異を繰り返していくと、次の動画に示すような多様な仮想生物が生成できることが示されました。

賢い突然変異によって作りだすデータを新しい学習データセットとして扱えば、モデル自身をアップデートすることも可能です。モデルが自ら作り出したデータのみによって新たな分野を取り込み、生成能力を高めることができるのです。

オープンエンドなアルゴリズムの実現にも一歩近づく

大規模モデルを突然変異マシンとして使うことで、わずか数個のサンプルプログラムから非常に多様で高品質なデータを作り出すことができることが示されたことは、オープンエンドなアルゴリズムの実現にも新たな可能性を開くものです。

ALIFEの研究におけるグランドチャレンジに「オープンエンドな進化」をつくるということがあります。オープンエンドとは「終わりがない」という意味です。自然の生命が実現しているような終わりのない進化をアルゴリズムで作り出そうという挑戦です。

これまでに新規性探索、品質多様性、POETといったさまざまなオープンエンドの実現に向けたアルゴリズムが提案されていますが、いずれもオープンエンドの実現には至っていません。環境を進化させたりといった工夫を取り入れていますが、それでも、探索空間がどんどんと枯渇していき、面白いものが生まれなくなっていってしまうのです。

環境の探索空間がどんどんと枯渇していってしまう課題を解決するためには、環境そのものをどんどんと複雑化させたり、新たな要素を環境に取り込む必要があります。提案された方法を用いることで、環境を生成するプログラムを作成すればそれも可能になるかもしれません。抽象度の高い言語空間のインターフェースを通すことで、これまでは扱えなかった環境のダイナミックな変化を生み出せる可能性があるのです。それは、地球における自然の進化の中で、海で生活していた生物が陸上に進出するような変化を彷彿とさせます。陸上という新しい環境にさらされたことで、歩き回るための手足や、遠くに移動するための羽を生物が獲得していったような進化を、仮想空間の中にもアルゴリズムで作り出せる可能性を秘めています。

オープンエンドな技術がCopilotのようなAIに適用されることでわたしたちもその恩恵を受けることができます。それはまさに、私が20年前に夢見ていたような新しい問題を問くプログラムを書いてくれるAIの実現です。新しい問題に対して簡単なプログラムをいくつか提示するだけで、次々と改良されたプログラムを提案してくれるようなAIが近い将来実現するかもしれません。もしそんな未来がやってくれば、人間の役割はますます問題を解くことではなく、問題そのものを作り出すことに価値が置かれるようになるかもしれません。

最後までお読みいただき、ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?