囲碁の思考エンジンを作ってみる
このブログ記事は、以前書いた記事の続きです。できれば、まずはそちらをお読みください。
Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる
http://www.perfectsky.net/blog/?p=350
Keras/TensorFlowでDNNな囲碁の評価関数を作ってみる その2
http://www.perfectsky.net/blog/?p=380
時間ができたので、以前から作っていたDNNな囲碁の評価関数を使って、囲碁の思考エンジンを作ってみました。「パスも含めて全幅で深さ1だけ読む」という単純なプログラムです。9路盤しか打てません。一応、名前も必要かと思ったので、コードネームだったのをそのまま使って、white shadeと名づけました。由来は、Procol Harumの例の曲です。特にそれ以上の深い意味はありません。ちなみにこの映像は、ちょうど今から50年前のものみたいですが、ポピュラー音楽って本当に進歩がないですね。コンピュータ囲碁は、この5年だけでもめっちゃくちゃ強くなったのに…(笑)
ということで、早速、GNU Goとの対戦を行ってみました。使用した評価関数は、BottleneckアーキテクチャになっているRes-Blockのネックの部分が、32Filterなのと48Filterなのとの2種類。共に10 Res-Block(ちなみに、32Filterはパラメータ数が210,769で、48Filterは368,529。できれば、このあたりのサイズで何とかしたい…)。それぞれ、8対称形の平均をとったのと、とらないのとの、計4種類です。対局数は、先後を換えて150局ずつ計300局。同じような対局ばかりになりがちなので、twogtpに付属していたオープニングブックを使用しています。結果は、
32Filter | 106勝194敗 (勝率 35.33%) |
32Filter/8対称形の平均 | 144勝156敗 (勝率 48.00%) |
48Filter | 128勝172敗 (勝率 42.67%) |
48Filter/8対称形の平均 | 176勝124敗 (勝率 58.67%) |
うーん、よくわからんけどまあこんなものかな? とりあえず、ここがスタートですね。棋譜を見ていると、序盤はかなり上手なんですが、この子どうやらアタリがよく分かってないみたいで(笑)、後半すさまじいファンタを見せてくれます。一番強い48Filterの8対称形平均版から適当に3局選んでみたので、ご覧ください。
Sorry, your browser doesn’t support WGo.js.
Sorry, your browser doesn’t support WGo.js.
Sorry, your browser doesn’t support WGo.js.
こんなのに半分以上負けるGNU Goもどうなのよって感じですが(笑)、まあ強い時は強いからしかたないか… でもって、何でこんなにアタリがわからないのかっていうと、いろいろ理由はあるんでしょうが、おそらく一番大きいのは、学習データにこういう局面があまり含まれていないからだと思います。もちろん、大石がアタリになっている局面はそれなりの数あるのですが、そのほとんどが、アタリにされている方の手番になっていて、つぐなり逃げるなりすれば大事にならないので、それで深刻なことだと学習できていない気がします。NNの入力にダメの数を入れるとか、深さ2読むとかしたら、ここまでひどいことにはたぶんならないと思いますが、そんなことしなくても評価関数だけでこれぐらいは分かってほしいですし、こんなことも分からなくて、もっと高度なことが分かるはずもないような気がするので、なんとかしたいのですが、どうするのがいいかな? 「いっぱい対局させて、それをRayに添削してもらって、酷そうな手の前後を学習データに追加していく」みたいな感じでだめかな? また少し試してみます。
9路盤での最終的な目標は、GNU Goに対して1局平均10目勝ちです(今はだいたいイーブンぐらい)。勝率はあまり気にせず、そこを目指していきたいと思っています。そこまでいけたら、ブラウザで打てるようにしたいですね。
いろいろやっている間に、Rayが出してくれる形勢判断が常に1目ずれていること(黒番の時と白番の時で向きが逆、平均すれば0。簡易的な日本ルール対策?)に気づいて、その分を修正しようとしたのですが、今度は別のところで矛盾が生じてきて絶賛混乱中です。もう一目ぐらいどうでもいいか… あと、現在、Policy Networkも作っています。Value Networkもそうですが、よくこんなのでちゃんとしたアウトプットが出てきますね… なんだか、狐につままれた気分です。
あとあと、CapsNetで囲碁やった人とかいないんでしょうか?
[追記 2018/5/6]
最近、Policy Networkを作っているのですが、学習データを普通の棋譜からランダムに切り出して使ったりすると、結構ラベルに偏りが出てくるのが気になります。ということで、囲碁で一局を通して、座標ごとにどれぐらいの回数打たれるのかっていうのを調べてみました。例えば、COSUMIの9路盤のレベル1の作り碁ならこんな感じ。一番打たれる回数の多い場所を100として、それとの割合です。
14 29 40 52 59 52 40 29 14 30 44 56 68 71 67 55 44 30 40 56 76 86 88 86 75 56 41 53 68 87 96 95 96 86 68 54 60 73 89 95 100 95 88 73 60 54 68 87 97 94 95 86 68 53 41 57 76 86 87 85 75 56 41 30 45 56 68 71 67 56 44 30 15 31 41 53 59 52 40 30 14
そして、レベル5ではこんな感じです。
24 48 56 67 71 67 57 48 24 48 64 74 82 85 82 74 64 48 57 74 89 95 97 95 89 75 57 67 83 96 99 98 99 95 83 67 71 86 97 99 99 98 97 86 72 67 83 95 100 98 99 95 83 68 57 74 89 95 96 94 88 74 56 48 65 74 83 86 83 74 64 47 25 48 57 67 71 67 57 48 25
どうでしょう、ちょっと不安になってきませんか?
今現在、学習に使っているデータは、COSUMIの棋譜から取って、いくつかの条件でふるいをかけたものですが、それの検証用データのラベルの合計がこちら。これを[1]とします。
1628 2786 3627 4372 4508 4372 3627 2786 1628 2786 4038 4507 5506 6126 5506 4507 4038 2786 3627 4507 5296 6662 6550 6662 5296 4507 3627 4372 5506 6662 8024 6928 8024 6662 5506 4372 4508 6126 6550 6928 7928 6928 6550 6126 4508 4372 5506 6662 8024 6928 8024 6662 5506 4372 3627 4507 5296 6662 6550 6662 5296 4507 3627 2786 4038 4507 5506 6126 5506 4507 4038 2786 1628 2786 3627 4372 4508 4372 3627 2786 1628
そして、そのデータと同じ作り方をしている学習用データで学習したNNで、先ほどの検証用データを予測させた時の最後のsoftmaxの出力をそのまま合計したのがこちら(この数字をここで使うことが正しいのかがちょっと確信持てませんが…)。これを[2]とします。
1584 2745 3695 4300 4598 4301 3668 2754 1594 2735 3890 4561 5532 6039 5525 4578 3922 2746 3678 4605 5399 6763 6706 6754 5334 4583 3663 4272 5503 6705 7787 7231 7720 6611 5479 4303 4623 5987 6656 7232 7764 7128 6517 5946 4598 4308 5513 6673 7657 7236 7645 6586 5511 4306 3756 4626 5447 6669 6662 6638 5312 4612 3694 2820 3924 4578 5491 5972 5544 4613 3944 2766 1609 2763 3694 4276 4583 4272 3667 2726 1592
それぞれの座標で、[2]/[1]*100したのがこちら。
97 99 102 98 102 98 101 99 98 98 96 101 100 99 100 102 97 99 101 102 102 102 102 101 101 102 101 98 100 101 97 104 96 99 100 98 103 98 102 104 98 103 100 97 102 99 100 100 95 104 95 99 100 98 104 103 103 100 102 100 100 102 102 101 97 102 100 97 101 102 98 99 99 99 102 98 102 98 101 98 98
ほんの少しだけ、それっぽい傾向が見受けられるような気もしますが、まあこれぐらいならぜんぜんOKでしょうかね? とりあえずは気にしないことにします。
[追記 2018/5/25]
「white shadeの棋譜をRayに添削してもらって、悪手っぽいところの前後を学習データに追加して、それをもう一度学習する」ってやり方で、いきなりGNU Goに1局平均10目ぐらい勝てるようになったのですが、それってそれなりの棋力がないとできないはずだと思って実際に棋譜を眺めてみても、そこまで強そうには見えません。どうも、最後にねちねちやられてGNU Goが自爆していることが、ちょくちょくあるからみたいです。手法自体はかなり有効そうなので、目標を「1局平均20目」に変更して、現在、二周目やってます。
[追記 2018/8/29]
ブラウザで対局できるようにしてみました。続きの記事をどうぞ。
クライアントサイド版COSUMIを作ってみました
http://www.perfectsky.net/blog/?p=402
COSMIで楽しく遊ばせていただいています。
有難うございます。
さて、お願いなのですが、現在着手確定が、マウスのボタンダウンなのですが、ボタンアップで着手確定にして頂けたら有難いです。
それだけでクリックミスが半分に減りそうな気がします。
マウスをダウンしたまま移動した場合(ドラッグ状態)では着手として認めないということです。
実際の囲碁でも、手を離した時が着手確定だと思うのですが。
ぴか星1 - 2018/05/26 01:15
おっしゃられていることは、確かに一理あると思いますし、
もし今から作り始めるのなら、かなり真剣に検討すると思いますが、
申し訳ありませんが、COSUMIでは今のままとさせていただきます。
選択できるようになどもいたしません。
こういったことは、地味に見えて実はかなり重要な部分だと、私自身、そう考えていますが、
考慮しなければならないことが結構たくさんあって、簡単には答えが出せずにいます。
kingfisher - 2018/05/27 23:03