Miacisを用いた教師あり学習の実行手順

 AobaZeroの棋譜を用いて学習し、floodgateの棋譜を用いて検証する場合を説明します。

前提

 Ubuntu 18.04でのみ検証ができています。おそらくUbuntu 16.04や20.04でも大丈夫だとは思いますが、未検証です。Windowsでも最近のWSL2やDocker for Windowsでできるかもしれませんが、未検証です。

環境構築

1) Nvidia Driverのインストール

 ここの手順は半年も経てば変わっていそうなので、とりあえず2020年6月時点でのQiitaの記事をリンクするにとどめます。

2) CUDA,cuDNNのインストールからMiacisのビルドまで

2-a) Dockerを使う場合

 Dockerfileを公開しているのでDockerを用いることをおすすめします。検証したDockerのバージョンは19.03.12で、nvidia-dockerの拡張を入れます。そのあたりについては

などを参考にしてください。

 Dockerが使える状態になったら適当にビルド用ディレクトリを作り、公開されているDockerfileをダウンロードしてきてビルドします。コマンドとしては

mkdir miacis_build
cd miacis_build
wget https://raw.githubusercontent.com/SakodaShintaro/Miacis/master/scripts/Dockerfile
docker build -t miacis .
docker run --gpus all -it --name miacis miacis bash

2-b) Dockerを使わない場合(未検証)

 CUDA10.2とそれに対応したcuDNN7.5~をインストールしてください。それができたら後の手順は先のDockerfileと同じなので、そこに記載してあるコマンドを上からコピペして実行していけばできると思います。

注意

 以下ではMiacisリポジトリ~/にあると仮定してコマンドを記述していきます(Dockerで環境構築した場合そうなっています)。

3) 棋譜のダウンロード

 検証損失を計算するためにfloodgateの棋譜をダウンロードします(7zipの展開に数時間かかります)。スクリプトを用意してあるのでそれを実行します。

~/Miacis/scripts/download_floodgate_kifu.sh

 学習用の棋譜としてAobaZeroの棋譜をダウンロードします(回線環境に応じてそれなりに時間がかかります)。同様にスクリプトを実行します。

~/Miacis/scripts/download_AobaZero_kifu.sh

 これらのスクリプトにより

~/data/floodgate/train
~/data/floodgate/valid
~/data/aobazero/data

のというディレクトリができ、そこにCSA形式の棋譜が保存されます。

学習

 学習の設定ファイルをMiacis実行ファイルと同階層にコピーしてきます。

cd ~/Miacis/src/cmake-build-release/
cp ~/Miacis/settings/supervised_learn_settings.txt .

 Miacisを実行します。

./Miacis_shogi_categorical

 実行するとCUDA is available.またはCUDA is not available.という表示が出て、その後コマンド受付状態になります。CUDA is not available.という表示が出た場合はCUDAが認識できていないので環境を見直してください。

 コマンド受付状態ではusiなどのUSIプロトコルに対応したコマンドを受付けますが、それらに加えて学習コマンドも実行できます。まずはinitParamsコマンドを入力し、ランダム初期化したパラメータを準備します。その後supervisedLearnコマンドを入力することで、同階層にあるsupervised_learn_settings.txtを読み込んでそこで指定された設定のもとに学習を始めます。

 学習が終わるとfinish supervisedLearnの表示が出たあと、コマンド受付状態に戻ります。終了したい場合はCtrl + Cquitコマンド入力で抜けます。

 一連の手順を1コマンドにまとめると

echo -e "initParams\nsupervisedLearn\nquit\n" | ./Miacis_shogi_categorical

とすればパラメータ初期化、学習、終了を一気に自動的に行ってくれます。

検証対局

 学習した結果はsupervised_train_log.txtsupervised_valid_log.txtとして残されますが、損失値の計算だけでなく実際の対局により棋力を検証したい場合もあります。

 まずはYaneuraOu(評価関数はKristallweizen)をダウンロード、構築します。スクリプトとして手順をまとめており、

~/Miacis/scripts/download_YaneuraOu.sh

を実行することで~/YaneuraOuというディレクトリができ、そこに実行ファイルが作られます。

 YauenuraOuが取得できたら対局を行います。学習を行ったディレクト~/Miacis/src/cmake-build-releaseにおいて

~/Miacis/scripts/vsYaneuraOu.py --time1=250 --time2=250 --NodesLimit=200000 --game_num=250

を入力します。

 対局数が250とやや少なめなので確実な値ではありませんが

158勝  25引き分け  67敗 勝率 68.2% 相対レート  132.5

が2020年9月26日時点で最も良かった値となります。

発展

ハイパーパラメータを変更する

 学習のハイパーパラメータ等を変更したい場合はsupervised_learn_settings.txtの内容を変更します。これは空白区切りで設定項目とその値を1行に書いていく形式になっており、詳しくは~/Miacis/src/supervised_learn.cpp等を見てください。

ネットワークを変更する

 ネットワークを変更したい場合、Miacis/src/neural_network.cppを編集することになると思います。たとえば残差ブロックの数を増やしたければ7行目の

static constexpr int32_t BLOCK_NUM = 10;

というところを変更してからMiacis/src/cmake-build-releaseディレクトリでmakeをするとビルドが行われます。