将棋ソフト制作日和 #1

はじめに

AlphaZeroを読み解く #1


これの続き。
せっかくなので目標があったほうが面白そう。ということで、設定してみた。
もちろん今年の参加表明の期限は過ぎているので来年ということになる。開発に半年、訓練に半年とかでちょうどいいのではないだろうか(適当)
第六回電脳将棋トーナメントがあるのかどうかはわからないのですが、あればそっちもエントリーしてみようと思います。

ソフト名について

「それよりイカしようぜ」みたいな名前にしようと思っていたのだが、流石にまずかろうということでツイッターで募集してみました。


思った以上に反響があっていろいろな面白かっこいい名前を考えていただきました。
この中から適当にマージして良さげなソフト名を考えたいと思います。

ソフトの仕様

どんなソフトにするのかが結構大事なので、ここはしっかりと考えたいところ。

思考部

全然やりたくないけどUSIプロトコルに対応したものを作らなければいけないのだと思いました。実は過去にUSIプロトコルに対応した将棋AIはちょっと作ったことがあるのですが、そのときは二度とやりたくないと思ってました。

学習部

ニューラルネットワークを使ったディープラーニングで行なう。
KerasとかTensorFlowが有名なのでこれを使ってみようかと。
今までは伝統的にKPPやKPPTなどが使われていました。KPPというのはKing Piece Pieceの略で、玉の位置とその他2つの駒の位置に対して評価値を計算し、それらを組み合わせて盤面全体の評価値を計算するタイプの評価関数である。Tというのは「手番」を意味するが、TebanではなくTurnであることに注意。

KPPTからKKPT型評価関数へ


コンピュータチェスのプログラミング業界ではこのKPPを利用することで非常に正確に盤面評価が出来ることが知られていました。それを将棋でも使えばいいじゃん?っていう流れでコンピュータ将棋界にKPP型の学習モデルが入って来た気がするのですが、実際どうなのかは詳しく知りません。詳しい方教えてください。
普通に考えれば、考慮する駒の数を増やせば盤面評価がより正確になるはずなのでKPPPPPPP…(Pがたくさん)型評価関数とかが実装できればよいのですが、駒の位置は80通り以上もあるため、こんなことをまともにやっていてはあっという間に組合せ爆発を起こしてしまいます。

よって、次に評価関数が進化するのであればKKPPないしはKPPPなどになるのですが、これらを計算して駒の配置に対する評価値をデータとして保存しようとするとメインメモリの容量を超えてしまいます。となるとキャッシュのミスヒットが発生した時に主記憶部であるHDDやSSDにアクセスする必要がでてきます。近年のSSDはかなり高速化されていますが、それでもRAMに比べると圧倒的に遅いです。
つまり、そのまま実装すると遅延でパフォーマンスが極端に悪くなってしまいます。また、組み合わせを計算する段階でもかなり遅くなるので、KPPP型評価関数自体がKPPT型評価関数に比べてかなり正確に盤面を評価できない限り、強くしようとしたのに逆に弱くなってしまうという矛盾が派生してしまいます。
Googleの論文によれば2017年の段階で最強であった将棋ソフトElmoが1秒間に3500万手読んでいたのに対して、AlphaZeroはたったの4万手しか読んでいないという。これはAlphaZeroが効率的に手を探索できているということに他ならない。

リソース

うちにあるのはGTX1060なので、それでしばらく学習させてみようと思います。
とりあえず自分よりも強いAIができたら更に高スペックなハードで学習させてみようかなと思っています。

ニューラルネットワーク

一概にディープラーニングと言っても種類がいっぱいあります。

  • CNN(畳み込みニューラルネットワーク)
  • RNN(再帰型ニューラルネットワーク)
  • NN(一般的なニューラルネットワーク)

それぞれ何が違うのかというと、NNの回路の仕組みが違います。RNNはちょっと前まで結構話題になっていたもので、時系列が近いものほど重みを増すようなニューラルネットワークです。
RNNは具体的に言えば株価予想などに使われます。というのも、株価予想だと100年前のデータより1年前のデータのほうが有効性が高いですよね?1年前よりも1ヶ月前、1ヶ月前よりも1週間前。つまりはそういうことです。
最近だとカプセルネットワークなどもあるそうですが、これはどっちかというと外乱(画像の回転など)に対するロバスト性が高いとかなので、将棋などの二人零和有限確定完全情報ゲームでは関係なさそうです。

実際どのくらい強いの?

AlphaZeroは第二世代TPUを4つ並列して学習を行っているという。これは一般的な将棋ソフトよりも遥かにハイスペックなので同じことをしたからといって同じだけの強さが得られるわけではない。
では、実際にどのくらいのレーティングがあるのだろう?
ググってみると考察されている方がいらっしゃったので掲載する。
それによるとAlphaZeroを比較的高性能なGPUを使用した場合、およそR3400程度の実力が見込めるらしい。記事を拝見させていただいたが、仮定および計算は納得できるものであり、どんなに強くてもR4000を超えることはないように思う。
つまり、学習部のハードのリソースがハンパないのでめちゃくちゃ強くなっているだけで、家庭用で学習するだけであれば既存の最強ソフトには全然勝てないということになる。
おや、これはマズいのでは?(笑)

次の記事までにやること

  1. TensorFlowないしはKerasの導入。
  2. ネットワーク構成を考える(何層構造にするか、など)。
  3. DeepLearningを用いた将棋ソフトの記事が少ないので、外国の方がされているチェスのコードを参考にして実装を行なう。

おもったよりもネットワーク部がイメージできていないので、結構まずそう!