プログラムを自動生成してみた

以前研究していたことに関して少し紹介します。

スポンサーリンク

プログラムを自動生成するプログラム

プログラムを自動生成するプログラムに関する研究を行っていました。

まずは実際に自動生成されたC#のプログラムを見てください。

フィボナッチ計算を行うプログラムです。

フィボナッチ数列の最初の12個の正解を与えておくと、自動的に上記のようなプログラムを生成してくれます。

下の動画は実際に作成させているところです。

理論

遺伝的アルゴリズムを応用した方法でプログラムを構築していきます。

遺伝的アルゴリズムは生物の進化を模倣した最適化アルゴリズムです。

よい個体は生き残りやすく、よくない個体は生き残りにくい環境下で、交配によって世代交代を繰り返しながら最適化を行います。

世代が進むにつれより良い個体が残ります。

生物がそれぞれ遺伝子と、それをもとに成長したがあるように、遺伝的アルゴリズムにも遺伝子型表現型があります。

私の用いた手法「Graph Structured Program Evolution」は遺伝的アルゴリズムの表現型がグラフ構造をとり、ループの表現が簡単にできるように改良されたものでした。

視覚化

画像にあるように、プログラム言語で使用される「+」や「-」などの算術演算、「<」や「>」などの比較演算のみが使用されます。

これらの膨大な組み合わせの中から、入力に対して正しい出力を行えるプログラムを進化的な最適化によって導き出します。

学習との違い

遺伝的アルゴリズムは進化による最適化です。

通常、進化は一個体で行うものではありません。

世代交代時の交配と、まれに起こる突然変異によって変化を持つ子が生まれます。

よいものが生き残りやすく、よくないものが生き残りにくい環境で子個体群が淘汰されていき、よいものが生き残る。

このように何世代にもわたって行われるものです。

一方で学習は通常、一個体内で行われるものです。

ヒトが歩けるようになる、言葉を覚える、

トリが飛び方を覚える、チーターが速く走れるようになる。

親から教わったり試行錯誤をしたりしながら、個体の能力を最適化していくのです。

進化との大きな違いは、個体の能力に限界があるということです。

ヒトがトリのように空を飛べなかったり、チーターのように速く走れなかったりするようにヒトには身体的な限界があり、学習によってどうにかなるものではありません。

進化の場合は交配と突然変異によって全く新しく、今までにない能力を持つ個体が生まれる可能性があります。

最近はやりの「人工知能」

最近はやっているのはDeep Learningだと思います。

これは神経を模倣した学習アルゴリズムであるニューラルネットワークをより複雑にしたものです。

今はこのアルゴリズムの強力な識別能力が、さまざまな分野で活躍しています。

しかし学習アルゴリズムであるため、あらかじめ個体の能力は人間によって決められてしまっています。

したがってよりよい能力を持つためには、人間の力に頼らざるを得ません。

完全に人間の手なしでアルゴリズムの改良を行えるようにならないと、いわゆる2045年問題は起こらないと考えています。