はじめに、教師あり学習をやってみることにした。
教師あり学習編では、MCTSの棋譜を学習させることにした。棋譜を用意する必要があるので、エージェントを自動対戦させて棋譜を出力するプログラムを作成した。棋譜はとりあえず
[
...,
{
"agent": "RandomAgent",
"board": [2, 1, 0, 2, 0, 0, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
"legal": [9, 10, 12, 13, 14, 15, 17],
"move": 12
},
{
"agent": "MctsAgent_1000",
"board": [1, 2, 0, 1, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0],
"legal": [28, 29, 30, 32, 33, 34, 35],
"move": 30
},
...
]
のような形でjsonで記録してみた。上からエージェントの名前と着手前の盤面、合法手のリスト、実際にmarkした場所を表しており、盤面は先手後手にかかわらず自分のmarkが1で相手のmarkが2である。今回はMCTSエージェントの手を学習させることが目的なので、ゲームの勝敗は記録する必要がない。
棋譜の生成は自宅のPCで行うことにした。CPUが20スレッドなので、並列対戦をすると寝ている間に20000対戦から30000対戦くらいできることがわかった(1000プレイアウトのMCTS vs ランダムエージェント)。1対戦は大体40局面くらいあるので、MCTSエージェントが指した手は一晩で50万局面くらい取れることになる。ランダムエージェントが手を指す速度はMCTSエージェントに比べて十分高速なので、MCTS同士の対戦を行った場合には1試合から取れる教師データの数が倍、対戦速度は半分となり、全体として取れる量は変わらないと考えられる。
教師あり学習編の目標としては、MCTSよりも強いエージェントを作りたいと思っている。当然棋譜を学習させている以上はオリジナルのエージェントより強くなることはないが、たとえば10000プレイアウトのMCTSエージェントが生成した棋譜を学習させて、1000プレイアウトのMCTSより思考時間が短く強力なエージェントを作ることは可能かもしれない。また、オリジナルのエージェントとの手の一致率も測定してみたい。
次回から、生成した棋譜を使って教師あり学習のエージェントを作成していく。
戻る