【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～強い方策ネットワークを目指す

<img width="200" style="float: left;" alt="将棋AIで学ぶディープラーニング" src="https://qiita-image-store.s3.amazonaws.com/0/233744/ded117b9-37c7-1b41-033d-960e63ca5fe1.jpeg">
第廿一夜も、本書から逸脱するが、昨夜の延長としてVGGモデルを利用して、強い方策ネットワークを目指す。
###やったこと
（１）VGGモデルを利用する
（２）LesserKai vs Policy vs VGG_Policyの総当たり戦
（３）さらなる追求
###（１）VGGモデルを利用する
ほぼ前回のCifar10のモデルから想像できると思いますが、モデルは以下のようなものです。

```py
﻿from chainer import Chain
import chainer.functions as F
import chainer.links as L
from pydlshogi.common import *
ch=192
class PolicyNetwork(Chain):

    def __init__(self):
        super(PolicyNetwork, self).__init__()
        with self.init_scope():
            self.conv1_1 = L.Convolution2D(104, ch, 3, pad=1)
            self.conv1_2 = L.Convolution2D(ch, ch, 3, pad=1)
            self.conv2_1 = L.Convolution2D(ch, ch*2, 3, pad=1)
            self.conv2_2 = L.Convolution2D(ch*2, ch*2, 3, pad=1)
            self.conv3_1 = L.Convolution2D(ch*2, ch*4, 3, pad=1)
            self.conv3_2 = L.Convolution2D(ch*4, ch*4, 3, pad=1)
            self.conv3_3 = L.Convolution2D(ch*4, ch*4, 3, pad=1)
            self.conv3_4 = L.Convolution2D(ch*4, ch*4, 3, pad=1)
            self.l13=L.Convolution2D(in_channels = ch*4, out_channels = MOVE_DIRECTION_LABEL_NUM, ksize = 1, nobias = True)
            self.l13_bias=L.Bias(shape=(9*9*MOVE_DIRECTION_LABEL_NUM))
    def __call__(self, x):
        h = F.relu(self.conv1_1(x))
        h = F.relu(self.conv1_2(h))
        #h = F.max_pooling_2d(h, 2, 2)
        #h = F.dropout(h, ratio=0.25)
        h = F.relu(self.conv2_1(h))
        h = F.relu(self.conv2_2(h))
        #h = F.max_pooling_2d(h, 2, 2)
        #h = F.dropout(h, ratio=0.25)
        h = F.relu(self.conv3_1(h))
        h = F.relu(self.conv3_2(h))
        h = F.relu(self.conv3_3(h))
        h = F.relu(self.conv3_4(h))
        #h = F.max_pooling_2d(h, 2, 2)
        #h = F.dropout(h, ratio=0.25)
        h13 = self.l13(h)
        return self.l13_bias(F.reshape(h13, (-1, 9*9*MOVE_DIRECTION_LABEL_NUM)))
```
学習時はDropoutを生かして置き、推論時はコメントアウトします。
また、Maxpoolingはどうもパラメータの調整ができないので、はずしました。
つまり、純粋にはVGGLikeなモデルとも異なります。
しかし、もしMaxpoolingを生かすとすると、今回のチャンネルごとの画像サイズが９ｘ９なので、４ｘ４、２ｘ２となり３回で１ｘ１になってしまいます。
そして将棋の場合それでいいのかという問題もあります。

中間層のチャンネルはここでは192としていますが、これ以外に32,128などを実施しました。しかし、それらはやはり接待将棋の振舞で負けるように打つ将棋になってしまいました。
###（２）LesserKai vs Policy vs VGG_Policyの総当たり戦
今回は方策ネットワークとしてどこまで強くできるか挑戦です。
ということで、LesserKaiとPolicyと対戦してみまたした。
結果は以下のとおりとなりました。
![VGGvsPolicyvsLKai.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/ce4f8cb3-9d38-db6d-4c73-5cd6b4f91d63.jpeg)
総合ポイントではどうにか今回のモデルが一番になりました。ここで使ったパラメータはepoch7であり、まだまだ学習途中のものです。
そして、実は内容としてPolicyには4-0-0と完勝しましたが、LesserKaiには1-0-3で負けています。
しかし、改めてLesserKaiと対戦すると完勝しました。
![VGGvsLKai.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/99b6c0d1-282e-1a12-2466-c9c7f5bf1181.jpeg)

| 名称 | loss | 一致率（方策） | 一致率（価値） |備考|
|:-:|:-:|:-:|:-:|:-:|
| [policy](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/Policy/policy.py) |1.682677|0.4226734| -  |方策ネットワークのみ|
| [policy_VGG192](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/VGGLike/VGG_tiny_nBn192.py) |1.9452| 0.41795877| -  |方策ネットワークのみepoch7|
###（３）さらなる追求
そして、MCTSとの対戦をやってみました。MCTSが十分に思考できるように持ち時間終了後も３０秒思考できるようにして対戦しました。
その結果、一応2-1-7で負けてしまいましたが、２度は勝っています。まだまだ学習途中なのでこれから強くなると思われます。
![VGGvsMCTS.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/5e3b1b37-97ab-6be0-0765-776c3eb04f56.jpeg)

ただ、この路線もパラメータが76.565MBと大きくこれ以上層を深くするのは限界が近いようです。また、学習時の計算時間も81m10s/epochかかっており、1080ではそろそろ限界が近い模様です。
そして、今回の結果はやはりモデュレーションがあったほうが、より強い可能性があり、WideResnetなどをきちんと追求するのも一つの方向だろうと考えています。
###まとめ
・VGGLikeなモデルで学習させたモデルは方策ネットワークで強くなった

・さらに強い将棋AIの可能性がある