将棋AIで学ぶディープラーニング:3日目

昨日、モジュール入りの環境を用意した。
今日はそれを使ってみる。

(ネット接続環境と docker を使う知識をお持ちの方は、同様にお試しいただけます)

まずは環境入りの docker コンテナイメージを取得。
(以下、ターミナルで入力する情報を黒地で示します)

docker pull ryohji/py-dlshogi:cpu

すると以下情報がエコーバックされる。(イメージ未取得の方はダウンロードと展開が実行されます)

cpu: Pulling from ryohji/py-dlshogi
Digest: sha256:91455b80664951674c6c50f78ef195ddcb40b31c7d7ec28715b95d355dcd0219
Status: Image is up to date for ryohji/py-dlshogi:cpu

わたしは MacBook を使っていて、書籍で紹介されている Windows 向けの GUI アプリは使えない。よって、できることは「8.4 コマンドラインからテスト」程度。

学習済みモデルの存在確認

書籍によれば学習済みのモデルがリポジトリーに入っている。 p.145 で D:\python-dlshogi\model\model_policy と参照されているものがそれだ。

docker イメージ ryohji/py-dlshogi にはリポジトリーを /opt/local/python-dlshogi に格納した。存在を確認してみる。

docker run --rm ryohji/py-dlshogi:cpu\
 ls /opt/local/python-dlshogi/model/model_policy

エコーバックされる。

/opt/local/python-dlshogi/model/model_policy

確かに、あった。

動作確認

では実践。
USI コマンドを標準入力から入れて、様子をみる。

docker run --rm -it ryohji/py-dlshogi:cpu\
 python3 -m pydlshogi.usi.usi_policy_player

しかし応答がない……。(ロードに時間がかかるのだろうと、ここで、お約束。コーヒーを淹れた)

なんのことはない。これで、すでに入力待機状態になっていた。

続いて USI エンジンの起動を命じる。

usi

エコーバックは以下。

usiok

書籍には以下応答があると書かれているけれど、これらは出ない。ひょっとして書籍サイトにエラッタが出ているかな?

id name policy_player
option name model file type string default H:\src\python-dlshogi\model\model_policy

モデルファイルの場所を指定する。

setoption name modelfile value /opt/local/python-dlshogi/model/model_policy

エコーバックは無い。
問い合わせ。準備できた?

isready

「できたよ!」

readyok

よし、では盤面を準備しなさい。

position startpos

「ならべた!」

lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1

では初手を考えなさい。

go

「ええーっとねえ、7g の駒を 7f に移動!」

info string 9g9f : 0.00834
info string 8g8f : 0.00000
info string 7g7f : 0.48470
info string 6g6f : 0.00012
info string 5g5f : 0.00153
info string 4g4f : 0.00072
info string 3g3f : 0.00013
info string 2g2f : 0.46938
info string 1g1f : 0.00088
info string 9i9h : 0.00001
info string 1i1h : 0.00000
info string 7i7h : 0.00043
info string 7i6h : 0.00139
info string 3i4h : 0.01277
info string 3i3h : 0.00525
info string 6i7h : 0.00249
info string 6i6h : 0.00000
info string 6i5h : 0.00034
info string 4i5h : 0.00606
info string 4i4h : 0.00002
info string 4i3h : 0.00001
info string 2h7h : 0.00070
info string 2h6h : 0.00078
info string 2h5h : 0.00049
info string 2h4h : 0.00001
info string 2h3h : 0.00003
info string 2h1h : 0.00000
info string 5i6h : 0.00103
info string 5i5h : 0.00111
info string 5i4h : 0.00005
bestmove 7g7f

確かに書籍どおり動くことが確認できた。

quit

これでターミナルに制御が戻る。

GUI アプリは、 USI エンジンからの bestmove を受けて盤面を推移し、後手の USI エンジンあるいは対局者に盤面を渡して(setposition)考えさせ(go)、次の手あるいは投了(bestmove)を受け、以降、先手後手とこれを繰り返すのだろう。

これから考えること

書籍では盤面から次の一手を推測させる model_policy を、既存棋譜の学習で作成している。
気になるのはポリシーは次の盤面そのものを学習させたもののはずで、それなのになぜ確率が一緒に出ているのか、ということ。手の確かさの確率はバリューネットワークの守備範囲なのではなかったか?

ポリシーとバリューのふたつのネットワークは、同時に学習させることで学習効率を上げる、とあった。その確認をしたい。
異なる部分がネットワークの末尾、出力だけになるようにして、そこに至る前段の構成を同じにし、重みパラメーターを共有させる…… というけれど。
推論はよい。逆伝搬はどうやっている? 先にポリシーの学習をさせ誤差からパラメーターを調整、次に共有部分調整済みのパラメーターでバリューを学習、誤差逆伝搬でパラメーターを(共有部分もあわせて)調整、みたいな感じか?

ポリシー・バリューの組み合わせによって、推論はどう実装されている?
与えられた盤面から MCTS のツリーを構築しているのか、それとも?
やっぱりポリシーは、複数の盤面を吐く? いや、まさか。盤面を一つ入力して、盤面が一つ出る。そういう1入力1出力の固定長の関数がポリシーネットワークだよね?

書籍では触れられていないけれど、強化学習(だけ)でポリシーとバリューのネットワークを学習させたい。

書籍の表現でない、自分なりの表現で盤面を学習させたい。

この記事が気に入ったらサポートをしてみませんか?