$$ \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}} $$

◇◇UTTT002:教師あり学習編①:棋譜の生成◇◇


はじめに、教師あり学習をやってみることにした。

教師あり学習編では、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より思考時間が短く強力なエージェントを作ることは可能かもしれない。また、オリジナルのエージェントとの手の一致率も測定してみたい。

次回から、生成した棋譜を使って教師あり学習のエージェントを作成していく。

戻る