Python
DeepLearning
データ分析
ディープラーニング
コンピュータ将棋

【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪~VGG利用のPolicy_Valueネットワーク

将棋AIで学ぶディープラーニング
第廿二夜も、本書から逸脱するが、昨夜の延長としてVGGLikeモデルを利用したPolicy_valueネットワークモデルを作成して強さを見た。

やったこと

(1)VGGLikeモデルを利用したPolicy_valueネットワークモデル
(2)パラメータサイズと収束性について
(3)強くなったのか??

(1)VGGLikeモデルを利用したPolicy_valueネットワークモデル

今回の場合、昨夜のVGGLikeモデルから想像つくと思いますが、以下の通りです。

from chainer import Chain
import chainer.functions as F
import chainer.links as L
from pydlshogi.common import *

ch = 192
fcl = 256
class PolicyValueNetwork(Chain):
    def __init__(self):
        super(PolicyValueNetwork, 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)
            # policy network
            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))
            # value network
            self.l13_v=L.Convolution2D(in_channels = ch*4, out_channels = MOVE_DIRECTION_LABEL_NUM, ksize = 1)
            self.l14_v=L.Linear(9*9*MOVE_DIRECTION_LABEL_NUM, fcl)
            self.l15_v=L.Linear(fcl, 1)

    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.dropout(h, ratio=0.25)
        h13 = self.l13(h)
        # policy network
        h13 = self.l13(h)
        policy = self.l13_bias(F.reshape(h13, (-1, 9*9*MOVE_DIRECTION_LABEL_NUM)))
        # value network
        h13_v = F.relu(self.l13_v(h))
        h14_v = F.relu(self.l14_v(h13_v))
        value = self.l15_v(h14_v)
        return policy, value

(2)パラメータサイズと収束性について

やはり、上記ネットワークモデルはサイズが大きく、収束時間等は以下のとおりです。

名称 loss 一致率(方策) 一致率(価値) 備考
VGGLike 2.37443 0.4219189 0.69108087 VGGLike8層
ResnetSimple40※ 2.29075 0.4325099 0.6906338 Resnet20block43層
ResnetSimple20  2.308355 0.4326057 0.6941468 Resnet10block23層
ResnetSimple10 2.360802 0.42507267 0.6948055 Resnet5block13層
ResnetTry30 2.27104 0.43431032 0.6986858 ResnetTri10block33層
ResnetVGGLike5 2.279315 0.43526843 0.69514084 ResnetVGGLike5block19層
model time/epoch params/MB
VGGL8 90:52 8層 78.72
S43 57:10 43層 49.73
VGGL19 45:19 19層 27.74
S23 37:59 23層 25.61
S13 30:30 13層 13.56

やはり、今回のVGGLikeモデルはパラメータも多く、時間も大幅にかかることとなっている。
そして、dropoutを使っている所為か、パラメータが多い割にはあまり一致率も上がってはいない。

(3)強くなったのか??

数字が物語るように、もう一つ強いとはいいがたく、そして以下のような面白い勝負となったものもある。
strangeKifu.jpg

まとめ

・VGGLikeなPlocy_valueのネットワークモデルでフィッティングしてみた
・パラメータが多くなり、時間がかかる割にあまり強くはならなかった

・ひとつの壁にぶつかったと感じている