TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

【囲碁プログラム】 rollout/tree policyをAdaGradで学習

※学習のやり直しを行った記事はこちら

プロの棋譜からrollout/tree policyを学習してもGnuGoに対して勝率が30%程度であまり高くなっていない。

学習に確率的勾配降下法(SGD)を固定の学習係数(0.001)とL1正則化係数(0.0000001)を使っていたので、
学習方法を変えたら勝率が上がらないかと思って試してみた。

将棋ソフトのponanzaの開発メンバでもあるaki.さんのページでAdaGradが勧められていたので、実装も容易だったので試してみた。

それと、正則化項の計算を、更新のあったパラメータのみ対して行っていたので修正した。
正しくは、局面に表れず更新しなかったパラメータについても正則化項は計算しないといけない。

パラメータ数は数10万あるため、1局面の学習のたびに全パラメータを更新するのでは時間がかかりすぎる。

そこで、このページに書かれていた正則化の計算の高速化の方法を採用した。

以上のように方法を変えて学習を行ったところ、SGDでの学習に比べて損失の値が下がったのでより学習が進んでいるようである。

GnuGoと対戦させたところ、9路で勝率80%となった。
f:id:TadaoYamaoka:20160521094345p:plain
(10戦しかしていないのでもっと回数を増やすべきだがまだ試行錯誤中なので評価に時間はかけていない。)


19路では、実行に時間がかかるので数回しか試していないが、GnuGoに一度も勝てていない。

AlphaGoの論文のrollout/tree policyは最大でも12pointの範囲のパターンなので、19路では局所的な範囲しか判断できないため、SL network policyと組み合わせないと強くならなそうである。
SL network policyは、DeepLearningを使って盤面全体を抽象的なパターンとして認識できる。(それでいて、特徴数は19×19×48で、rollout policyの数10万より少ない。)


自分のプログラムのrollout/tree policyは、まだナカデの実装ができていない。

ナカデに関しては、AlphaGoの論文ではパターン数が8192となっているがどのくらいの範囲のどういう形のパターンなのかが書かれておらず実装方法がイメージできていない。
パターンの範囲を広げるとプレイアウトの処理時間に影響が出てしまう。
狭くするとナカデをほとんど認識できない。

プロの棋譜でナカデが現れる局面を調べてみたが、明確にナカデが打たれた局面はほとんど現れない。
読みの中では考えられていると思うが、実際ナカデになる局面にはならないということかもしれない。
これではナカデのパターンの学習はできなそうである。

AlphaGoの論文ではrollout policyの学習には、Tygem serverの800万局面が使われている。
大局観のあるプロの棋譜よりもアマチュア棋譜の方が局所的な最善手を学べるので適しているのかもしれない。
マチュア棋譜でナカデの局面がどれくらい現れるのか検証してみたい。


rollout/tree policyは改善個所がまだ残っているが、一旦おいておいてSL network policyの方に着手しようと思う。


github.com