TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

dlshogiが序盤に先手を過剰に評価することがある問題

ほぼ個人的なメモです。

電竜戦で、dlshogiで作成した定跡で序盤に先手の評価値が異常に高い局面が登録されていた。

例)7手目の評価値が238と高い
f:id:TadaoYamaoka:20201129174134p:plain

定跡作成時は、5000万ノード探索を行っており、探索ノード数が増えた場合に発生することが分かった。

当該局面の探索ノード数と評価値の変化

f:id:TadaoYamaoka:20201129174803p:plain

4000万局面あたりから評価値が単調に上昇している。

GCTのモデル

GCTのモデルで同一局面を探索した場合は、以下のようになった。
f:id:TadaoYamaoka:20201129175113p:plain

評価値は60くらいから徐々に下がっていき、5000万ノードでほぼ互角という評価になっている。

原因

dlshogiとGCTのPVのinfoは、それぞれ以下のようになっている。

dlshogiのPVのinfo
info nps 207030 time 241515 nodes 50000935 hashfull 1000 score cp 240 depth 33 pv 7i8h 4a3b 2f2e 2b7g+ 8h7g 3a2b 6i7h 2b3c 3i3h 7a7b 1g1f 7c7d 3g3f 8a7c 5i6h 6c6d 2i3g 7b6c 4g4f 6a6b 3g4e 3c2b 2e2d 2c2d 2h2d 8b8a B*6f P*2c 2d3d 5a4b 7f7e 7d7e P*7d
GCTのPVのinfo
info nps 226579 time 220676 nodes 50000582 hashfull 1000 score cp 10 depth 29 pv 7i8h 2b7g+ 8h7g 3a4b 2f2e 4b3c 3i3h 4a3b 3g3f 7a6b 6i7h 6c6d 5i6h 6b6c 9g9f 9c9d 6h7i 7c7d 3h3g 6c5d 3g4f 4c4d 3f3e 4d4e 3e3d 3c3d 4f3g B*3c 4i5h

dlshogiの方が、depthが高く探索の幅よりも深さを優先していることが分かる。
狭い局面に探索が集中して、その局面より先に後手番の読み抜けがあり先手に有利な評価をしている状況だと考えられる。

深さが優先されることは悪いことではないが、序盤の後手番に読み抜けがありそうなことが問題である。

GCTは学習にAobaZeroの棋譜を混ぜているため、序盤の局面が多く含まれている。
AobaZeroは、AlphaZeroと同様に初期局面から開始して、30手までは訪問数に応じた確率で選択している。
そのため、序盤の評価が安定していると考えられる。

対策

dlshogiは、強化学習の初期局面集に中終盤が多く含まれており、序盤の局面の比率が少ない。
そのため、序盤にうまく学習できていない局面がある可能性が高い。

AobaZeroの棋譜を混ぜて学習することが対策となっているが、AobaZeroの棋譜を使わなくてもdlshogiのみで学習できるようにしたい。
そのためには、dlshogiも、序盤から強化学習を行う必要がありそうだ。

AlphaZeroと同様に初期局面から30手までを確率的に選択するよりも、floodgateから出現頻度が一定以上の局面を初期局面とする方が効率が良く、現在のdlshogiの処理を変更しなくてよいため、floodgateから初期局面集を作成することにする。
現在のdlshogiは、初期局面集からランダムに局面を選択し、4手は確率的に選択している。
そのため、AlphaZeroと条件を合わせて、26手までの頻度が一定以上の局面を初期局面集とすることにする。

初期局面集を変えて、序盤の評価が正しくなるか別途検証する予定(強化学習には時間がかかるため結果がでるのはだいぶ先になる)。

2020/12/5 追記

floodgateから初期局面集を作成して、強化学習で使用するようにした。

先手後手どちらかのレーティングが3000以上で、手数が80手以上、千日手棋譜は除外という条件で抽出した。
千日手を除外するのは、自己対戦で毎回千日手となる開始局面を除外したいためである。

抽出棋譜から、26手目までの出現頻度の統計を取り、99パーセンタイル以上の局面を対象とした。
ほとんどの局面は出現回数が1で、99パーセンタイルという条件でも、出現回数は、118591棋譜中で31回である。

初期局面集作成用スクリプト

https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/utils/csa_to_roots_hcp.py

2018年から2020年9月20日までのfloodgateの棋譜を入力として、実行した結果は以下の通り。

DeepLearningShogi\utils> python .\csa_to_roots_hcp.py -r F:\floodgate\a\ F:\hcp\floodgate26.hcp
num_games 118591
               count            ply
count  706460.000000  706460.000000
mean        4.363302      19.545299
std       207.161570       4.972049
min         1.000000       1.000000
25%         1.000000      16.000000
50%         1.000000      20.000000
75%         1.000000      24.000000
max    118591.000000      26.000000
th 31
output num 6933
               count          ply
count    6933.000000  6933.000000
mean      258.881437    14.571758
std      2075.449703     6.150281
min        32.000000     1.000000
25%        41.000000    10.000000
50%        60.000000    14.000000
75%       113.000000    19.000000
max    118591.000000    26.000000

作成した初期局面集を使用して、自己対局を行ったところ、30手以内に高頻度で千日手となる局面が含まれていた。
学習データに偏りが生じるため、そのような局面は除くことにした。
30手で打ち切るようにして自己対局を多数行い、高頻度で千日手となる局面を削除した。

以前の初期局面集の活用

以前に使用していた中終盤を多く含む約5億局面の初期局面集は、モデルの学習中に実行する自己対局で使用することにした。
dlshogiでは、自己対局で500万~700万局面生成 → モデル学習 というサイクルを回しているが、モデル学習中にも学習に使用していないGPUで自己対局を行っている。
その際に以前の初期局面集を利用することにした。

ノイズなしの学習データ生成

また、強化学習時は、探索中のルートノードのポリシーにランダムでノイズを加えている。
そのため、生成される学習データは、ノイズを含んだデータになっている。
正確なValueの値を学習させるため、モデル学習中の自己対局ではノイズを加えないことにした。
モデル学習中に生成する局面の学習データ全体に対する割合は8.2%程度になる。

2020/12/8 追記

バックアップごとにvalueの値を累積していたため、floatの桁落ちが関係していそうということがわかった。
累積ではなく平均を都度計算する方式に見直す予定。

2020/12/12追記

定跡の評価値がおかしいのは、floatの桁落ちが原因であることが判明した。
将棋AIの進捗 その51(floatの桁落ち) - TadaoYamaokaの開発日記

dlshogiの強化学習を、上記の初期局面集で行った場合、約12%が重複データになることがわかった。

AobaZeroの前処理した棋譜も調べたところ、11.6%が重複データ局面になっていた。

hcpes = np.fromfile(r'F:/aobazero/hcpe/arch000015000000.hcpe', HuffmanCodedPosAndEval)

(len(hcpes) - len(np.unique(hcpes))) / len(hcpes)
Out[11]: 0.11643395063382735

序盤の局面から強化学習を行うと、データの偏りから序盤に偏って学習される懸念がある。
dlshogiの方では、方針を変えずに今までの多様な初期局面集を使い続けることにする。

AobaZeroの棋譜の加工

GCTでは、AobaZeroの棋譜を、事前学習に使用し、また、dlshogiの強化学習データに混ぜて使用している。

アンサンブル効果の仮説

dlshogiの強化学習データと混ぜて使用したという部分が強さに影響しているのではないかという仮説を立てている。

dlshogiは、ディープラーニングが中終盤に弱いという課題に対処するために、初期局面集に中終盤を大量に含める(約5億)、詰み探索の結果を報酬とするαβ探索のソフトをリーグ戦に加えて学習するということを行っている。

一方、AobaZeroは、序盤と入玉に強く、中終盤に比較的弱いという傾向がある。

そのため、dlshogiとAobaZeroの棋譜を混ぜることで、うまくアンサンブルの効果が出たのではないかと考える。
dlshogiのデータは序盤の局面はあまり含まれていないため、混ぜて学習しても局面の重なりは少なく、お互いの良いところだけを学習できたのかもしれない。

事前学習も不要で、単に混ぜて学習すればいいのでは?という気がするので、検証してみたいと考えている。


この記事では、前処理として、AobaZeroの棋譜を加工する方法について記す。

AobaZeroの棋譜の加工

一括ダウンロード

AobaZeroの棋譜は、rcloneGoogle Driveから一括ダウンロードできる。
rcloneのWindows版を使ってローカルにダウンロードした。
Google Drive向けの設定を行い、自分のGoogle DriveにRecords01フォルダのショートカットを作成し、rclone copyでバッチ処理を行った。

解凍

ダウンロードしたファイルは1万棋譜ごとのCSAファイルがxz形式で圧縮されている。
7zipをコマンドラインから使用してバッチ処理で解凍する。
例)

7z x arch000021660000.csa.xz -ocsa/

※2021/1/16 追記
下記のスクリプトaoba_to_hcpeで.csa.xzを直接読み込めるようにした(cshogi v0.1.0以上が必要)。

棋譜の形式

1つのCSAファイルには複数棋譜が含まれている。
各指し手にはコメントが付与されており、各候補手のMCTS探索の訪問数が記録されている。
30手までは、訪問数に応じた確率で選択されるため、訪問数が最大の手以外が選ばれている場合がある。

また、棋譜を調べたところ、数手の詰みを見逃して、逆転されている棋譜が含まれていた。
AobaZeroは詰ます手順に弱いことが分かる。

ILLEGAL_ACTIONで終了している棋譜が含まれているので除く必要がある。
CHUDANで終了している棋譜は、最大手数である512手を超えた棋譜である。

以上を考慮して、dlshogiの学習用に以下のように加工をする。

  • 30手までに最後に最善手以外を指した局面以降を使用する
  • 5手詰みのチェックを行い、詰みの局面であれば読み込みを中止し、勝敗を上書きする。

dlshogiはMCTSの探索中に、終端ノードで、5手詰みのチェックを行っているため、5手詰みの局面以降の局面は学習する必要がない。

  • ILLEGAL_ACTIONで終了している棋譜は除外する
  • CHUDANは引き分け扱いとする


参考までに棋譜の統計を取ると以下の通りであった。

kifu num : 7110000
moves sum : 907460289
moves mean : 127.63154556962026
moves median : 123.0
moves max : 513
moves min : 16
nyugyoku kachi : 193756

cshogiのAobaZero棋譜対応

Pythonでさくっと前処理を行いたいため、私が公開しているPython向けの将棋ライブラリであるcshogiをAobaZeroの棋譜に対応した。
cshogiは、python-shogiに比べて、CSAファイルの読み込みなどが10倍速い
また、hcpe形式ややねうら王の学習データへの出力機能などを備えている。

アップデートしたcshogi v0.0.8をPYPIにアップロードした。

pip install -U cshogi

でインストールできる。

作成したhcpe形式への変換スクリプト

https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/utils/aoba_to_hcpe.py

このスクリプトを使用し、AobaZeroのarch000015000000.csa ~ arch000022110000.csaまでの711ファイルの変換を行った。
4時間43分で変換できた。
※プロセスを並列で実行すればもっと早く変換できる。

まとめ

cshogiでAobaZeroの棋譜をdlshogiの学習に使用できるhcpe形式に加工する方法について紹介した。
hcpe形式に変換できたのでdlshogiのデータを混ぜて学習することで、GCTと同等以上のモデルができるか別途検証したい。

GCT、dlshogi、二番絞りの比較

電竜戦の決勝リーグに進んだ、dlshogiを使用している3ソフト(GCT, dlshogi, 二番絞りプレミアム生)の比較を行った。
「二番絞りプレミアム生」(以下、二番絞り)は、48先生からモデルファイルを提供いただいて、探索部には最新のdlshogiを使用して測定した。
二番絞りは、探索部にも変更加えているため、今回の測定は参考値である。
二番絞りプレミアム生とは? - 48's diary

測定条件

  • 思考時間を、1手1秒、3秒、5秒、8秒と変えて測定
  • 対局相手は、3ソフトを直接対局させた場合と、水匠2(固定ノード数)を相手にした場合で測定
  • たややん互角局面集を使用
  • Ponderなし
  • 対局回数は1000回で、1局ずつ先後入れ替えて対局。秒読みが長い条件は、途中までの結果を記載。
  • GPUは、V100 1枚

なお、連続対局には、cshogiを使用し、結果をPGNに出力して、Ordoでレーティングを算出している。

1手1秒の測定結果

直接対局
  # PLAYER          :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)     W    D     L  D(%)
   1 dlshogi         :     0.0   ----  1318.5    2000    66      99  1250  137   613     7
   2 GCT             :   -22.8   17.4  1231.0    2000    62     100  1160  142   698     7
   3 nibanshibori    :  -228.2   20.4   450.5    2000    23     ---   383  135  1482     7
水匠2(100万ノード固定)
   # PLAYER                        :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D     L  D(%)
   1 dlshogi                       :   231.8   25.0   789.5    1000    79      99  757   65   178     6
   2 GCT                           :   190.3   22.5   747.5    1000    75     100  715   65   220     6
   3 nibanshibori                  :    84.4   21.1   618.0    1000    62     100  574   88   338     9
   4 YaneuraOu NNUE 5.32 64AVX2    :     0.0   ----   845.0    3000    28     ---  736  218  2046     7

1手1秒では、dlshogiが一番強いという結果になった。

1手3秒の測定結果

直接対局
   # PLAYER          :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D     L  D(%)
   1 GCT             :    48.4   20.6  1004.5    1566    64     100  952  105   509     7
   2 dlshogi         :     0.0   ----   852.5    1568    54     100  802  101   665     6
   3 nibanshibori    :  -113.2   20.4   494.0    1568    32     ---  440  108  1020     7
水匠2(300万ノード固定)
   # PLAYER                        :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D    L  D(%)
   1 GCT                           :   176.7   43.9   211.0     288    73      80  205   12   71     4
   2 dlshogi                       :   150.2   43.7   205.0     292    70     100  197   16   79     5
   3 nibanshibori                  :    69.8   41.7   176.5     295    60     100  167   19  109     6
   4 YaneuraOu NNUE 5.32 64AVX2    :     0.0   ----   282.5     875    32     ---  259   47  569     5

1手3秒では、dlshogiとGCTが逆転して、GCTが一番強いという結果になった。

1手5秒の測定結果

直接対局
   # PLAYER          :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D    L  D(%)
   1 GCT             :     4.5   29.1   462.0     768    60      62  437   50  281     7
   2 dlshogi         :     0.0   ----   451.5     763    59     100  426   51  286     7
   3 nibanshibori    :  -142.2   29.4   231.5     759    31     ---  204   55  500     7

水匠2(固定ノード)は未測定。

1手5秒では、GCTとdlshogiの差がなくなっている。

1手8秒の測定結果

直接対局
   # PLAYER          :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D    L  D(%)
   1 GCT             :    57.2   42.1   241.0     375    64     100  228   26  121     7
   2 dlshogi         :     0.0   ----   191.5     366    52     100  179   25  162     7
   3 nibanshibori    :   -94.9   41.4   121.5     367    33     ---  112   19  236     5

水匠2(固定ノード)は未測定。

1手8秒では、GCTが1番強いという結果になった。

考察

測定結果から、1手1秒という短い思考時間ではdlshogiが強く、長い思考時間ではGCTが強いということがわかった。
大会の持ち時間であればさらに差が広がっていた可能性がある。

二番絞りについては、探索部が大会で使用されたものとは別なため、参考値である。
二番絞りが大会で強かったことを考えると、探索部の改良(ルートでLCBで選択、探索打ち切り条件変更)が効いているのかもしれない。
特に、探索打ち切り条件の変更は、20ブロックのResNetでは効いていそうである。
また、長い持ち時間では強くなる可能性がある。

まとめ

今回の測定から大会の結果は偶然ではなく、やはりGCTが強いことが確認できた。
dlshogiとGCTの差は、活性化関数、学習データと学習方法の差であり、そのうちどれが強さに影響したのかについて、別途確認したいと思う。

GCTの学習に使用したデータセットとノートブックを公開します

GCTの学習に使用したデータセットと、Google Colabのノートブックを公開します。

colab.research.google.com

データセットについて

データセットには、以下を含みます。

  • floodgateの棋譜からhcpe形式に変換したもの
  • elmo_for_learnで生成したデータ
  • AobaZeroの棋譜をhcpe形式に変換したもの
  • dlshogiの強化学習で生成したデータ
AobaZeroの棋譜について

AobaZeroの山下さんに、変換したファイルの二次配布についてご快諾いただきました。ありがとうございます。
Re: AobaZeroの棋譜の二次配布について | コンピュータ将棋や囲碁の掲示板 | 3708

ノートブックについて

加納さんがGCTのモデルの学習に使用したノートブックです。
加納さんは基本は無料のGoogle Colabを使用して学習を行っています。

公開の目的とか

dlshogiの強化学習のデータセットは、私が2018年から生成を開始したものです。
GPUを継ぎ足しつつ自宅のPCを24時間稼働させて、最終的には3枚のGPUを使って生成しています。
同様のことを新たに始めるにはおそらくハードルが高すぎます。

今回、GCTが学習の工夫でdlshogiよりも結果を残したことは、自分にとっても驚きで、学習やモデルアーキテクチャにまだまだ工夫の余地があることを発見しました。
加納さんからデータとノートブックの公開を行いたいという要望があったのを機に、データを公開し参入のハードルを下げることは意義があることだと考えたので公開することにしました。

データセットとノートブックを使うことで、少なくともGCTのモデルの再現は可能だと思います。
新たな人がコンピュータ将棋の開発に参加して、いっしょに盛り上げていってくれることを期待します。


データのストレージやノートブックはすべて加納さんから提供してもらっています。ありがとうございます。
(公開は私の方から行ってほしいという意向です。)

「GCT電竜」とdlshogi(NVIDIA GPU非搭載PC対応版)の公開

「GCT電竜」とdlshogi(NVIDIA GPU非搭載PC対応版)を公開します。

ダウンロード

Release 世界将棋AI 電竜戦バージョン(「GCT電竜」同梱) · TadaoYamaoka/DeepLearningShogi · GitHub

NVIDIA GPUに対応したTensorRT版と、NVIDIA GPU非搭載のWindows PCでも動作するOnnxRuntime版を含みます。

世界将棋AI 電竜戦で優勝した「GCT電竜」のモデルを含みます。
(GCTのモデルの開発者は加納さんです。配布は私の方で一本化して欲しいという意向です。)

OnnxRuntime版について

Windows 10 version 1903以降のPCであれば実行可能です。
ただし、探索速度は、TensorRT版にくらべて落ちます。

NVIDIA GeForce 2080Tiの場合、初期局面の探索速度に、以下の差があります。

バージョン NPS
OnnxRuntime版 5715
TensorRT版 41280

約7.2倍の差があります。

最高のパフォーマンスを出すには、TensorRT版をTensorCore搭載のNVIDIAGPU(NVIDIA GeForce 2080Tiなど)で動かすことを推奨します。

検討での使用

ShogiGUIの検討機能で使うには、一部対応できていない機能があります。
「深さ」の指定はできません。
候補手の数は、現状1手のみです。
時間無制限でも、UCT_NodeLimitで設定したノード数に達すると探索を終了します。

MultiPV対応は、Qhapaqさんからのプルリクエストをもらっているので、後日対応予定です。

検討では、設定でDNN_Batch_Sizeを256など大きめにした方がNPSが上がります。

【電竜戦】チームdlshogiのGCTが決勝リーグで優勝しました

本日開催されたコンピュータ将棋の大会「電竜戦」で、チームdlshogiのGCTが決勝リーグで優勝しました!

コンピュータ将棋の大会でディープラーニングを使用したソフトが優勝するのは初です。
2017年からdlshogiの開発を始めてやっと優勝までたどり着きました。

GCTについて

元々GCTは、加納さんがdlshogiを使用して開発したソフトです。
探索部分はdlshogiで、モデルの学習に使うデータをdlshogiとは別のもので行っています。

今大会では、私とチームで参加して、dlshogiの強化学習のデータや、学習方法、定跡作成方法など共有して、加納さんが主体でモデルの学習・定跡作成をしています。
今回の成果は、私のdlshogi単体では成し遂げたられなかったので、GCTが優勝してくれたことに感謝しています。

チームの経緯

加納さんとは将棋AI開発前からの知り合いで、以前から気楽に情報交換を行っていました。

NVIDIA A100が発表されてから、いつからクラウドで使用可能になるのかという話をしていたところ、ちょうどよいタイミングで、AWSで使用可能になりました。

AWSのA100のインスタンスp4d.24xlargeは、vCPU上限申請が必要なため、申請を行ったところ私の方では断られてしまいました
加納さんは申請が通ったため、貸してもらうことにしました。
その際、お互いチームとして参加するという話になり、インスタンスを貸してもらう代わりとして、GCTにはdlshogiの強化学習で生成したデータ(600万局面×直近100サイクル)を提供しました。

GCTとdlshogiの違い

GCTとdlshogiの違いは以下の通りです。

探索部 モデル 事前学習データ 強化学習データ 定跡
GCT dlshogiと同一 dlshogiで実験中のswishのモデル floodgate, elmo, AobaZero dlshogiで生成したデータにAobaZeroの棋譜を混ぜて学習 dlshogiの定跡作成方法に水匠2の定跡を使用
dlshogi dlshogiと同一 以前から使用しているResNetモデル elmo dlshogiで生成したデータ dlshogiの定跡作成方法にfloodgateの統計を使用

大会で使用したハードは、どちらもNVIDIA A100×8です。

dlshogiは6位という結果だったので、モデルの精度の差が大きかったと思います。

モデルのサイズは、どちらもResNet10ブロックで同じです。
やはり一番差がでたのは、事前学習にAobaZeroの棋譜を使用したことだと考えています。
(連続対局での勝率は別途確認するつもりです。)

精度のデータは共有してもらったので、別途まとめるつもりです。

今後の予定など

GCTのモデルとdlshogiを普通のPC(NVIDIAGPU非搭載)でも動くようにしたものを後日公開する予定です。

最後に

大会を開催していただいた運営の皆様、初めての大会の立ち上げで苦労もあったと思いますが、本当にお疲れ様でした。
そして、参加者の皆様、お疲れ様でした。

【電竜戦】dlshogiライブラリ使用の3ソフトが2日目決勝リーグに進出します

本日、コンピュータ将棋のオンライン大会「電竜戦」の1日目が開催されました。

私が開発しているdlshogiは、56チーム中10位で、2日目のA級リーグ(決勝)に進出します。
他にもdlshogiライブラリを使用しているソフトが合計で3チーム決勝リーグ進出します!

第1回世界将棋AI 電竜戦 勝敗表

dlshogi

ディープラーニングMCTSを使用したソフトが、大会で決勝リーグに進出するのは初です。
3位の「二番絞りプレミアム生」と4位の「GCT」もdlshogiライブラリを使用しているソフトです。
(本家なのに10位なのは悔しい・・・
しかし、10位なのでバレルハウス賞を頂きました。ありがとうございます。)

GCT

「GCT」にはチームdlshogiのメンバとしても参加しています。
dlshogiの強化学習で生成したデータを提供しています。
dlshogiで実験中のswishのモデルを使用しているので、本家より強くなっている可能性はあります。

deqshi

qhapaqさんとの合同チームの「deqshi」は、15位で残念ながら決勝リーグには進めませんでした。
こちらは、dlshogiとやねうら王の合議を採用しています。
クラスタ部分のメインの開発はqhapaqさんです。
昨日は夜遅くまでデバッグしていました(;'∀')
明日のB級での上位を目指します。

感想

直前で探索パラメータを変更したことが影響したのか、作成した定跡が序盤でおかしな評価値を付けるようになって終始安心して観れませんでした。
10戦目の「二番絞りプレミアム生」戦で負けたことが、一番悔しかったです。
AobaZeroの棋譜も学習して、大きなモデルサイズを使用しているということで、dlshogiの今後の方針を考え直すべきかと思いました。
逆に言えば、まだまだdlshogiには成長の余地があるということで、いろんな方がdlshogiの開発に参加してくれることを願っています。


ということで、明日2日目もNVIDIA A100インスタンスに課金してがんばります。

公式放送

1日目
www.youtube.com
2日目
youtu.be