【将棋AI】「将棋AIで学ぶディープラーニング」を読む♪～ディープなNetworkモデルで強い将棋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">
第十七夜は、昨夜の結果がどうにもおかしいので、ディープなNetworkモデルをやり直して、将棋AIのどれが強いか総当たり戦を再度やってみた。
###やったこと
（１）ResnetのディープなNetworkモデルで学習した
（２）昨夜の上位のNetworkモデルで総当たり戦を実施した
###（１）ResnetのディープなNetworkモデルで学習した
モデルは以下のとおりのBlocks=20すなわち全部で３層＋４０層の４３層と今までと比べるととても深いものをやってみました。

[dlShogi-kai/Network/ResnetSimple/policy_value_resnetSimple.py](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/ResnetSimple/policy_value_resnetSimple.py)
主要な部分は以下のとおり（ほとんどだけど）

```py
class Block(Chain):
    def __init__(self):
        super(Block, self).__init__()
        with self.init_scope():
            self.conv1 = L.Convolution2D(in_channels = ch, out_channels = ch, ksize = 3, pad = 1)
            self.conv2 = L.Convolution2D(in_channels = ch, out_channels = ch, ksize = 3, pad = 1)
    def __call__(self, x):
        h1 = F.relu(self.conv1(x))
        h2 = self.conv2(h1)
        return F.relu(x+h2) #x+h2
class PolicyValueResnet(Chain):
    def __init__(self, blocks = 20):
        super(PolicyValueResnet, self).__init__()
        self.blocks = blocks
        with self.init_scope():
            self.l1=L.Convolution2D(in_channels = 104, out_channels = ch, ksize = 3, pad = 1)
            self.l2=L.Convolution2D(in_channels = ch, out_channels = ch, ksize = 3, pad = 1)
            for i in range(1, 20):
                self.add_link('b{}'.format(i), Block())
            # policy network
            self.policy=L.Convolution2D(in_channels = ch, out_channels = MOVE_DIRECTION_LABEL_NUM, ksize = 1, nobias = True)
            self.policy_bias=L.Bias(shape=(9*9*MOVE_DIRECTION_LABEL_NUM))
            # value network
            self.value1=L.Convolution2D(in_channels = ch, out_channels = MOVE_DIRECTION_LABEL_NUM, ksize = 1)
            self.value2=L.Linear(9*9*MOVE_DIRECTION_LABEL_NUM, fcl)
            self.value3=L.Linear(fcl, 1)
    def __call__(self, x):
        h = F.relu(self.l1(x))
        h = F.relu(self.l2(h))
        for i in range(1, 20):
            h = self['b{}'.format(i)](h)
        # policy network
        h_policy = self.policy(h)
        u_policy = self.policy_bias(F.reshape(h_policy, (-1, 9*9*MOVE_DIRECTION_LABEL_NUM)))
        # value network
        h_value = F.relu(self.value1(h))
        h_value = F.relu(self.value2(h_value))
        u_value = self.value3(h_value)
        return u_policy, u_value
```
ポイントは以下のとおり
１．`for i in range(1, 20):`および`for i in range(1, 20):`と追加するNetworkの数を明示した
２．ResnetはBatchNormalizationしているが、外してみた
※これはなんとなく将棋の場合は変な規格化は悪い影響がありそうな気がしたため
３．Layer１３のモデルを作成できるように入力に次ぐ二層目のNetworkを追加した
※これでblocks＝５として、Block()の`return F.relu(h2)`とするとLayer１３と同じ構造になるが、今回は`return F.relu(x+h2)`としている

このNetworkモデルで以下のような結果を得た。Lossは今一つだが、一致率は抜群な結果となった。

| 名称 | loss | 一致率（方策） | 一致率（価値） |備考|
|:-:|:-:|:-:|:-:|:-:|
| [policy](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/Policy/policy.py) |1.682677|0.4226734| -  |方策ネットワークのみ|
| [Policy_Value;Layer13](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/Policy/policy_value.py)| 2.016|0.4204578|0.67033803|１３層の方策・価値ネットワークでMCTS|
| [Policy_Value;Layer23](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/Layer23/policy_layer23.py)|2.1938|0.41157416|0.6601796|２３層のMCTS|
| [ResnetSimple40](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/ResnetSimple/policy_value_resnetSimple.py)|2.5091131|0.42899686|0.6974323|Resnet２０block４３層|
| [ResnetSimple40](https://github.com/MuAuan/dlShogi-kai/blob/master/Network/ResnetSimple/policy_value_resnetSimple.py)|1.756215|0.43086118|0.6800308|Loss最小対戦は上記|
![figure_1-34log3000_resnetSimple20_2016_2017.png](https://qiita-image-store.s3.amazonaws.com/0/233744/5688f389-35ce-53af-8d07-02fe006d3983.png)

###（２）昨夜の上位のNetworkモデルで総当たり戦を実施した
![Resnet40Win.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/5cf127ee-f776-163f-de2b-e7b2ef52466e.jpeg)
![Resnet40Win2.jpg](https://qiita-image-store.s3.amazonaws.com/0/233744/0133f7b0-4522-c206-ad20-61a9dfd1a901.jpeg)

| ---------- |R43|L13|LKai|policy|Win|Draw| Loss |Pt|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  R43 |-|2|1|2|5|0|1|5|
|  L13 |0|-|2|1|3|0|3|3|
| LKai |1|0|-|2|3|0|3|3|
|policy|0|1|0|-|1|0|5|1|
###まとめ
・４３層というディープなモデルで今までで一番強い将棋AIが作成できた

・バグが回避できたのでバリエーションを追求してさらに強い将棋AIを作成したい