[かみやんのたわごとへ戻る]


counter

最近、真面目な研究生

 最近、何をやっているかっていうと、真面目な大学生に戻っているのだ。なんせ、後、1ヶ月で卒業論文を書き上げなければならないのだ。まぁ、今も研究のプログラムを組んでいたんだが、なかなかはかどらないから、現実逃避のためにこのページを書いていたりする。
 で、研究内容は、「遺伝的プログラミング」って、まぁ、情報系では今おおはやりのもので、人工知能とか認識とかに使えるんだよね、これが。

コンピュータはニュートンになれるか?

 コンピュータって、計算はむちゃくちゃ速いよね。例えば、ニュートンは、りんごが木から落ちるのを見て

y=g/2 * t*t + v0*t + y0 (g:重力加速度、v0:初速度、y0:初期位置、t:時間、y:時間tの位置)

っていう、物が落下するときの方程式を考え出した。この式のおかげで、人間は未来を予測できるようになった。つまり、りんごが木から離れた瞬間に地面に落ちる時間がわかるのだ!(ってあたりまえね)
この式を、コンピュータに与えれば、猛烈な速度で計算してくれる。たとえ、秒間100万個のりんごが木から落ちても、すべてのりんごの地面に落ちる時間を予測することができるだろう。

 今のところの常識では、「コンピュータは、与えられた式は猛烈な速度で計算してくれる、しかし、式を考えるのは人間の仕事」である。しかし、この常識をやぶり「コンピュータに式を編み出させよう!」というのが遺伝的プログラミングの目的だ!つまり、コンピュータにりんごが落ちるところを見せて、「y=g/2 * t*t + v0*t + y0」を求めさせよう!というのだ。なんか人工知能っぽいでしょ?

 さらに、*とか+とか四則演算子は、2つの引数を持つ関数と考えることができる(C++も、operator*()でオーバーライドできるよね)。つまり、これを発展させると、「コンピュータにプログラムを組ませる」ことができるのだ!(条件分岐もIF(a,b,c)って感じの関数とみなすことができる、aが真ならbを、偽ならcを実行って感じ。つまり、すべて関数とみなすわけだ。もうお気づきの方もいるかもしれないが、これはLISPの考え方だ。)
 今のプログラミングスタイルって、未来からみれば、すごく非効率的な方法なんだろうね。工業で言えば、1900年前後の家内制手工業か、工場制手工業ってところだろうね。つまり、職人が家でコツコツ全部一人で手作業で製品を作る、または、精々分業するといったところだ。今は、自動車のオートメーション工場を見ればわかるが、すべてがオートメーション化され、職人は不要、作業する人も少ない、2分に1台ぐらいの割合でポンポン車が出来上がる。すごい差だ。つまり、未来のソフトウェアの開発スタイルもかなりの部分がオートメーション化されるってことだ。まぁ、今でも、アセンブラで組んでいたころに比べれば、コンパイラもオートメーションと呼べるかもしれないけどね(アセンブラ職人じゃなくても、職人と同じぐらい高速なプログラムが高級言語でできるしね)。また、ソフトウェアのコンポーネント化や再利用もあるけど、これはJISがネジの規格を決めているのと大して変わらない。どちらも「コンピュータにプログラムを組ませる」というレベルのオートメーションではない。

 こういう研究をしている自分もプログラマ(職人)なわけだが、こんな研究が進んだらプログラマの食いぶちがなくなるのでは?と心配するプログラマもいるかもしれない。実際、傘職人とか靴職人っていう人は激減した。恐らく、同様にプログラマの数も減るだろう。でも、優秀なプログラマとセンスのあるプログラマは、ソフトウェアの設計へと移行するだろう。上に述べた話は、「わしら人間は、今、こんな問題を抱えているのだ、だから、こんなソフトウェアを作ってくれ」とコンピュータに命令しなければならない(未来の未来では、「あんたら人間はこんな問題をかかえているんじゃないの?だったらこんなソフトを作ってやるよ」とコンピュータが言い出すのだろうか。。)。

種の起源

 さてさて、ここまでは夢物語だが、「遺伝的プログラミング」とやらは、どんなアルゴリズムなのか?本当に、自発的に式を立てたり、最適なプログラムを作ってくれるのか?と半信半疑な方もみえるだろう。
 遺伝的プログラミングは、生物の進化の過程をモデルとしたアルゴリズムだ。つまり、「ダーウィンの進化論」をもとにしている。

「生物は、生存競争をし環境により適合したものが生き残る」

というやつだ。高い木しか生えていないところに住む馬は、より首のの長い個体が生き残り、世代を重ねるごとに首が長くなって行き、キリンになった。とうやつだ。しかし、これには、「じゃ、なぜ、馬とキリンの間の首の長さの化石がないのか?」という反論があった。それに対する回答は、

「ときどき、突然変異するから」

という取ってつけたような回答だ。しかし、これは現代の遺伝子の研究からも正しいことがわかっている。

遺伝的プログラミングのアルゴリズムは、こうだ。

  1. 最初に、100〜1万ぐらいの仮想生物をランダムに生成する。各、個体は1つの遺伝子を持っている。

  2. 各個体の、環境への適合度を求める(evoluate stage)。

  3. 選択・淘汰。つまり、優秀な個体は、多くの子孫を残し、環境に適合しない個体は死滅する(selection stage)。

  4. 子供は、一定の確率で交叉(両親の遺伝子がミックスされる)・突然変異(一部が変化)・逆位(一部の遺伝子の並びが逆順になる)などの変異を起こす(mutate stage)。

  5. 2へ戻る。

この世代交代を繰り返すと集団は次第に、環境へ適合してゆく(なんでそうなるかはよく考えればわかるよね?)。すごく単純明解なアルゴリズムだ!

この説明は遺伝的プログラミングの一般的な説明だから、ちょっと抽象的でわかりにくいね。最初のニュートンの問題に当てはめて、もう一度、読み返すとわかりやすい。

遺伝子
環境 りんごが落ちるときの測定データ(t=0秒のときy=10m、t=0.1のときy=9.5m ....って感じ)
適合度 遺伝子が環境に適合しているか。つまり、式が測定データと一致しているか(もっと言えば、誤差)。
選択・淘汰 誤差の少ないものを選択する。
交叉・突然変異・逆位 式の一部を交換したり、変えたりする。

実は...

 さて、今までとってもサイバーなことを書いてきたが、実際のところ、GP(Genetic Programming:遺伝的プログラミング)は、乱数の塊なのだ。なぜなら、交叉・突然変異・逆位のおかげで進化しているのだが、その変異はすべてランダムで決められている。つまり、どうすれば環境に適合するかということを全く考えないで、やみくもに変異させ、環境へ適合しない方向へ変異した個体は、全員抹殺するという、残酷なアルゴリズムなのだ。ちなみに、人工知能のもう一つのポピュラーなアルゴリズムであるニューラルネットワークで一般に用いられる、カルマンフィルタ法やパックプロパゲーション法は、教師データ(GPでいう環境)に適合する方向を微分などの数学的理論を使って学習を進める(ニューロでは学習回数というが、GPでは世代数という)。しかし、GPは、現状でもニューロよりすぐれているというのが一般的な見方だ。さらに、GPでは理論が確立していないから、可能性がある(ニューロは最近は行き詰まっている)。

GPの未来

 GPは、まだ研究段階であり、いくつかの問題がある。

 これらの問題を解決する方法として、「数学的理論を確立する」という方向、「生物の進化の過程を観察し、さらにそれに近づける」という方向、「人がプログラムするときの思考を考える」などがある(俺は、数学弱いから最初の方法は全く考えられない。。。)。

 あと、GPの面白い特徴として「並列処理」しやすいというのがある。「並列処理」も情報科学の分野では非常にホットな分野で、すごく研究している人も多いし未来がある。1つのCPUの高速化は段々難しくなってきている、今のところ1GHzぐらいが限度だよね。でも、そのCPUをたくさん作ることは簡単だ。今、彼らが目指していることは、n個のCPUを並列に繋いだときに計算速度がn倍になることだ。「そんなのあたり前じゃん、3人いれば文殊の知恵、3人いたら3人以上の能力がでるのでは?」と思うのは、彼らにとってちょっとコクだ。会社でも、100人で会議しても100倍、結論が速く出るか?っていったらそうでもないよね。協調には、それだけ多くの情報交換が必要だからね(でも、究極の並列処理としては、n倍以上をめざしているだろうけどね)。
 話を戻すと、GPの場合、個体の数だけCPUがあれば、OKって感じ。GPでは、個体を100〜1万つくるんだが、CPUも1万あれば1万倍ちかく速くなるってことが分かっているんだ。並列処理の研究が進めば、1万個ぐらいCPUが載ったパソコンとかもそのうち出るから、GPの未来も明るいってわけだ。

おまけ

 さて、「ニュートンの問題」は説明したけど、「自動プログラムの生成は?」という方や、「もうちょっと知りたい」という方は、以下にミニ論文を書いたので、そちらを読んで頂戴。このミニ論文は、home pageに載せるために書いたのではなく、ボス(教授)に命令されたから書いただけ。2ページで書けって難題を与えられたが、結局、4ページになった。これでもかなり削りに削ったから、わかりにくい説明だと思う。まぁ、このページを読んだ後なら、わかるでしょう。

ちなみに、ミニ論文のオリジナルはWord97で書いたのだが、html出力機能があって、こりゃーすげー!って感じ。OLEオブジェクトで埋め込んだ、図や数式がgifに変換される。HTMLで論文を書こうとすると式や図が面倒なんだけど、こりゃ楽チン!あと、Front Page98も買ったので、スタイルシートの練習に、一部スタイルシートを使っているよ。スタイルシートはまだできたばからりの仕様で、Internet ExplorerとNetscape Navigatorとで表示が違うのがタマにキズだけど。Front Page98は、なかなか良好だね(Netscape Composerも良好だね)。やっぱり、慣れれば、テキストエディタで書くより楽だね。HTMLは。

ミニ論文へのリンク

あ、今回は、具体的な計算結果や、今作っているGPシステムは公開していません。それは、また今度。じゃ。

 


[かみやんのたわごとへ戻る]