$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

◇◇UTTT004:教師あり学習編③:学習部の作成◇◇


ニューラルネットワークに棋譜を学習させて、推論させたい。

教師あり学習でUTTTの棋譜を学習させるために、機械学習ライブラリのPyTorchを使うことにした。理由は、この前買った本にPyTorchでMNISTを学習させる例が載っていたからである。

とりあえず、でMNISTを学習させるために使っていたネットワークと同じ形のネットワークを使ってみることにした。入力の数と出力の数を今回の問題に合わせると、このような感じになった。

                
import torch
from torch import nn, optim

model = nn.Sequential()
model.add_module("fc1", nn.Linear(81*3, 100))
model.add_module("relu1", nn.ReLU())
model.add_module("fc2", nn.Linear(100, 100))
model.add_module("relu2", nn.ReLU())
model.add_module("fc3", nn.Linear(100, 81))

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
                
            

ここ3晩ほど寝ている間に棋譜を集めていたので、1手1000プレイアウトのMCTSエージェントが指した手のデータが168万局面ほど集まっていた。今回は、ここからテストデータを適当に12万局面ほど取り分けて、残りを訓練データとして100エポック学習させてみた。

結果は、テストデータに対して正答率32285/126401だった。25%くらいは正解しているということになる。ただし、今回は集まった棋譜から6000試合分を雑に取り分けたにすぎず、訓練データとテストデータで同じ盤面が多く含まれている可能性が高い。よって、この数字はあまり信用しないほうがいいだろうと思う。その証拠(?)に、168万局面すべてを使って訓練して168万局面すべてを推論したときの正答率も25%程度だった。訓練データに含まれていない盤面だけでテストしたら正答率はもっと低くなるのではないだろうか。

訓練データと同じデータを含むテストデータを推論した際の正答率をもとにモデルの精度を議論することに意味はないが、とはいえ仮にランダムに選択した場合には正答率は2%以下になるはずだから、それよりも大幅に高い正答率が得られたことには意味がある。少なくともネットワークが壊れていたりライブラリの使い方を間違えるなどして全く学習ができていない、ということにはなっていないらしい。精度は今の段階では気にしていないので、学習が可能であることが分かれば充分である。

モデルが小さいこともあってか、推論はかなり高速だった。推論を1局面ずつ168万回させたのだが、10分程度で終わってしまった。MCTSが同じ数の手を指すのに3晩かかっているので、これと比べるとかなり速い。きちんと学習させられれば、MCTSよりも高速で強いエージェントを作るというのは不可能ではないかもしれない。

棋譜を使って学習させる方法がわかったので、次回はこのモデルを使ってsupervised_learningエージェントを作成して、対戦ができる状態にしたい。

戻る