TadaoYamaokaの開発日記

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

SL policy networkの囲碁プログラムへの適用

以前に学習したSL policy networkを囲碁プログラムに適用してみた。

特徴を4つに絞って、学習を160万局面で行ったものなので、棋譜との一致度は30%くらいの状態だが、そこそこ効果はあるのではないかと思って試してみた。
学習している棋譜は19路盤なので、19路盤でGnuGoと対戦させて確認した。

rollout policyのみを適用したプログラムでは9路盤だとGunGoに3割程度勝つことができるが、19路盤では1回も勝てていない。

SL policy networkを使えば、1回くらい勝てるようになるかと思って、対戦させてみたが、10回対戦して1勝もあげられなかった。

rolloutのみのプログラムとも対戦させてみたが、それにも負けるので、効果がでるどころか逆効果となっていた。
精度が高くない状態では、プレイアウトの勝率の方がまだ信頼できるということだろう。

学習局面を増やして、精度をAlphaGoの論文の55.4%に近づけてからもう一度試す必要がありそうだ。


DCNNの処理方式としては以下のような方式とした。

DCNNはGPUが1つしかないため、1スレッドで実行し、計算中は他のスレッドでプレイアウトを並列で行う。
プレイアウトのスレッドでUCTのノードが追加されたタイミングで、要求キューに追加して、キューがミニバッチサイズに達したらDCNNを実行する。
キューがいっぱいだった場合は、キューに追加しないでプレイアウトを続行し、キューが空いたらその時点のプレイアウトでルートに一番近い未計算のノードをキューに追加する。
ミニバッチサイズは、DCNNの実行回数が最大となるように調整する。(自分の実行環境では4の時が最大となった。)

この方式で、論理コア8コアのうち7コアをプレイアウトに割り当て、1コアをDCNNにすると、1万プレイアウトでDCNN実行回数は280ノードくらいだった。

1: playout num = 9996, created node num = 206140, dcnn node num = 284, dcnn depth avr = 1.003521, elapse time = 3593 ms
1: playout num = 9996, created node num = 202485, dcnn node num = 284, dcnn depth avr = 1.000000, elapse time = 3641 ms
1: playout num = 9996, created node num = 192075, dcnn node num = 272, dcnn depth avr = 1.003676, elapse time = 3593 ms
1: playout num = 9996, created node num = 175023, dcnn node num = 276, dcnn depth avr = 1.010870, elapse time = 3516 ms

ログから見るとUCTのツリーのルートから平均1階層目までしか計算できていないが、ノード展開の閾値を30としているので、プレイアウト回数が1万だとそもそも平均1階層目までしか展開されないので、DCNNはちゃんと計算できているようだ。


次は特徴数を論文と同じ48にして、時間をかけて学習させてみるつもり。
GPUもっと良いの欲しい・・・。

github.com