Python
DeepLearning
データ分析
コンピュータ将棋
Chainer

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

将棋AIで学ぶディープラーニング
第廿一夜も、本書から逸脱するが、昨夜の延長としてVGGモデルを利用して、強い方策ネットワークを目指す。

やったこと

(1)VGGモデルを利用する
(2)LesserKai vs Policy vs VGG_Policyの総当たり戦
(3)さらなる追求

(1)VGGモデルを利用する

ほぼ前回のCifar10のモデルから想像できると思いますが、モデルは以下のようなものです。

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を生かすとすると、今回のチャンネルごとの画像サイズが9x9なので、4x4、2x2となり3回で1x1になってしまいます。
そして将棋の場合それでいいのかという問題もあります。

中間層のチャンネルはここでは192としていますが、これ以外に32,128などを実施しました。しかし、それらはやはり接待将棋の振舞で負けるように打つ将棋になってしまいました。

(2)LesserKai vs Policy vs VGG_Policyの総当たり戦

今回は方策ネットワークとしてどこまで強くできるか挑戦です。
ということで、LesserKaiとPolicyと対戦してみまたした。
結果は以下のとおりとなりました。
VGGvsPolicyvsLKai.jpg
総合ポイントではどうにか今回のモデルが一番になりました。ここで使ったパラメータはepoch7であり、まだまだ学習途中のものです。
そして、実は内容としてPolicyには4-0-0と完勝しましたが、LesserKaiには1-0-3で負けています。
しかし、改めてLesserKaiと対戦すると完勝しました。
VGGvsLKai.jpg

名称 loss 一致率(方策) 一致率(価値) 備考
policy 1.682677 0.4226734 - 方策ネットワークのみ
policy_VGG192 1.9452 0.41795877 - 方策ネットワークのみepoch7

(3)さらなる追求

そして、MCTSとの対戦をやってみました。MCTSが十分に思考できるように持ち時間終了後も30秒思考できるようにして対戦しました。
その結果、一応2-1-7で負けてしまいましたが、2度は勝っています。まだまだ学習途中なのでこれから強くなると思われます。
VGGvsMCTS.jpg

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

まとめ

・VGGLikeなモデルで学習させたモデルは方策ネットワークで強くなった

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