Aestetica

コンピュータ将棋Selene(セレネ)を作っています。名前は西海枝昌彦(さいかいし まさひこ)と読みます。

ディープラーニングと将棋のプログラム(その1)

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1125503421
まあ、無理だろうなあ。


DeepMindがとうとうチェスと将棋にも(少し)乗り出しましたね・・。
ディープラーニングだと何がどうなんだ。ということなんですが。

まずは将棋については、2006年に(もう10年以上前か!!)Bonanza機械学習を採用して以来、延々と機械学習を採用したプログラムが上位を独占しています。

で、機械学習とは何なんだ。ということですが。
以下、イメージね。イメージ。

機械学習でデータを学習すると、とにかくなんらかの分類ができます。
「このデータが来たらA!、このデータが来たらB!」という感じ。
すごいのは、学習させていないデータを渡したとしても、それとなく分類できてしまうところがすごい!

カレーが好き、あんこが嫌い。と学習させて、カレーうどんが好きかどうか識別させると、「好き」なんじゃないの?と、返ってきます。従来のプログラムでは、確かにカレーは好きだと教えたかもしれないが、カレーうどんは教えていないので「不明デス」と返ってくるはずだったのが、好きだと返る。

どのくらい好きかも学習可能で、先ほどのカレーうどんも含め、様々なことを学習させた場合、
カレー:超絶好き
カレーうどん:好き
カレーそば:まあまあ好き
カレーラムネ:微妙
といった学習結果になります。

学習させるときに必要な設定値があり、それは「特徴」です。
上の食べ物の例で言うと、なんですかね。材料とか調味料かな?

カレー粉、じゃがいも、うどん、たまねぎ、ラムネ・・とか、いろいろ用意しておいて、「カレーが好き」と学習させたいのであれば、カレーに関連した特徴にそれぞれ点を足していきます。カレーにはラムネは入ってないので、ラムネには点が入りません。
逆に「カレーが嫌い」であれば、カレーに関連した特徴の点をそれぞれ減らします。

これを延々と繰り返した場合、なんとなく学習できそうな感じですよね。

それでは、ここから将棋を学習させたいのですが、特徴には何を用意したら良いのでしょうか?
一番精度が良いのは、盤面のすべての状態を特徴としておくことです。

食べ物の例だと、特徴としていろんな食材、調味料を用意しておくから精度がよくなるのであって、例えば特徴が「たまねぎ」だけだったりすると、ぜんぜん識別できません。

将棋において、すべての盤面の状態を取っておくということは、初期局面はもちろんとして、26歩と飛車先を着いた局面、さらに34歩とした局面も取っておくのですが、恐ろしいことに、初期局面から18香など「そんな手絶対やらないだろ!」という局面も含めてなにもかも全部です。
※18香、念のため調べてみたら、検討してる人もいますね・・。

そうなると、特徴の数は10の220乗となり、そんなにデータは持てません。iCloudを使ってもぜんぜん無理です。
1テラバイトが10の12乗バイト。100テラバイトが10の14乗なので、10の20乗くらいだと既にとんでもなく大きい。
よく引き合いに出される、宇宙に存在する素粒子の数が10の80乗。宇宙10個分が10の81乗。

しかし、ここではデータを持てたとしましょう。友達のいとこの友達が、たまたまそんなパソコンを持っていたとしましょう。そしたら私のニンテンドースイッチと交換しましょう。

それだけの特徴を用意した場合、今度は学習に必要な棋譜、対局の数はいくつになるのでしょうか?
例えば、過去の名人戦棋譜をすべて学習させても、出てこない局面はそれこそ無数にあるので、特徴はほぼ全部値が付かない状態となり、名人戦に出てきた局面にいくらか点がついてるくらいにしかなりません。未知の局面に対しては、ランダムプレイヤー(ではないけど、そのような感じ)となるので、このプログラムに対しては簡単に勝てるでしょう。
※学習させた棋譜のうち、負けたプレイヤー側と同じ指し手だと負けます。

そうなると、最初のほうで「学習させていないデータを渡したとしても、それとなく分類できてしまうところがすごい!」とか書いていたのに、まったく実現できていません。機械学習アルゴリズムを使用して計算しているのに、これ以上は無い状態まで特徴を増やしてみたら、逆に分類できなくなってしまいました。

おい!機械学習!ダメじゃん。と、なるところですが、
続きます。