TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

dlshogi

dlshogiの学習則

dlshogiを改造して遊びたい方のために、dlshogiの学習則についてちゃんと書いてなかったので書いておく。主に、学習部のソースtrain_rl_policy_with_value_using_hcpe_bootstrap.pyの解説になっている。 AlphaZeroの学習則 AlphaZeroの学習則は、 となってい…

将棋AIの進捗 その48(NPS改善)

ノード再利用の方式見直しを行った後、強くなっているかApery(WCSC28)と1手3秒100局で確認を行った。結果、勝利は62%で、変更前は69%だったので、強くなっていないことがわかった。 考察 理由としては、以下が考えられる。 Ponderなしの秒読みではノード再利…

将棋AIの進捗 その48(PV表示対応)

Qhapaqさんからプルリクをいただいたので、dlshogiをPV表示に対応しました。プルリクにはなかったのですが、USIオプション「PV_Interval」を追加しました。 「0」にするとPV表示なし、0以上にすると、設定したms間隔でPVを表示します。masterブランチに反映…

将棋AIの進捗 その47(Linuxのマルチスレッド排他処理)

昨日の記事で、dlshogiのゲーム木の管理をロックレス方式に見直しを行った。Windowsでは、ノード単位の排他制御をmutexを用いずに、atomic_flag (TAS機能)で実現することで10%NPSが向上したが、Linuxで測定すると800NPSくらいしかでないという悲惨な結果にな…

将棋AIの進捗 その46(ノード再利用の見直し)

世界コンピュータ将棋オンライン大会でノード再利用の処理に問題があることがわかったので、見直した。先日の記事で、Leela Chess Zeroのゲーム木の管理方法を調査して、合流を処理しないでC++のヒープ管理を利用してツリー状にノードを管理していることが分…

Leela Chess Zeroのノード再利用の方法

世界コンピュータ将棋オンライン大会で、dlshogiのノード再利用の方法に問題があることが明らかになったので、見直すことにする。 現在のハッシュ管理 dlshogiのハッシュ管理は、Ray+Rnのゾブリストハッシュの実装を参考にしていた。 Ray+Rnのノード再利用の…

dlshogi(wcsoc2020)のWindows版ビルド済みファイル公開

dlshogiの世界コンピュータ将棋オンライン大会バージョンのWindows版ビルド済みファイルを公開します。Release 世界コンピュータ将棋オンライン大会バージョン · TadaoYamaoka/DeepLearningShogi · GitHub実行には、CUDA 10.2に対応したGPUが必要です。 イン…

世界コンピュータ将棋オンライン大会 結果報告

昨日、本日、世界コンピュータ将棋オンライン大会が開催されました。 dlshogiはシードのため2日目からの参加でした。結果は、4勝4敗で、2日目に進んだ28チームの内13位でした。 floodgateでのテストからR4000くらいと見積もっていたので、順当な結果だと思い…

将棋AIの進捗 その45(大会直前の性能改善)

いよいよ本日から世界コンピュータ将棋オンライン大会が始まりました。概要 http://www2.computer-shogi.org/wcso1.html 参加チーム https://www.apply.computer-shogi.org/wcsoc/team.html 棋譜中継 http://live4.computer-shogi.org/wcso1/ 特設サイト htt…

将棋AIの進捗 その44(大会直前の調整)

世界コンピュータ将棋オンライン大会はいよいよ明日から開催です。今日は、直前に簡単に変更できる部分をいくつか調整を行っていました。 探索延長の条件変更 今までは、ルートの訪問数が1番目の手と2番目の手の差が1.2倍未満の場合に、1.5倍探索を延長して…

将棋AIの進捗 その43(探索パラメータ調整)

未訪問ノードのQの初期値の変更と、FPU reductionを導入してから、探索パラメータの再調整を行っていなかったので、Optunaで最適化を行った。FPU reductionはKataGoを参考に、ルートノードは0としていたが、パラメータにして調整するようにした。 また、Leel…

将棋AIの進捗 その42(TensorRT対応)

TensorRTがdlshogiのDNNの推論においても効果があることがわかったので、TensorRTをdlshogiに組み込んだ。 Tensorコアを搭載したGPUでは、以前のcuDNN版に比べて推論が大幅に高速化される。 実装 ONNXから読み込んだネットワークのビルドには数十秒近く時間…

TensorRTのパフォーマンス測定

先日試したTensorRTをdlshogiのネットワークの推論で試せるようにしたので、パフォーマンスを測定してみた。バッチサイズを可変にして、プロファイル最適化も行った。 測定条件 floodgateの棋譜からサンプリングした10万局面の推論時間を測定する。 バッチサ…

将棋AIの進捗 その41(1サイクルあたりの生成局面数)

dlshogiの今の10ブロックの192フィルタのモデルは、2018年6月から学習を開始して、何度かモデルの精度が飽和して強くならなくなったが、そのたびに新しい手動を導入して現在まで継続して強くできている。201サイクル目からはリーグ戦を導入して、218サイクル…

将棋AIの進捗 その40(マルチGPUの性能)

以前のdlshogiは、マルチGPUで動かした場合、4GPUまでは線形にNPSが伸びるがそれ以上GPUを増やしてもNPSが伸びなかった。 ハッシュテーブルのロックにボトルネックがありそうだ思っていたので、今回ロックの範囲を修正してマルチGPUでの性能を改善した。 ロ…

将棋AIの進捗 その39(リーグ戦)

年末にCPUを3970Xに変えてから、USIエンジンをリーグに加えた強化学習を行っている。 USIエンジンを各探索スレッドにつき2つ、GPUにつき探索スレッドを3つ、3GPUで探索を行っているので、合計18プロセス起動している。 メモリの制約が厳しくこれ以上は起動で…

将棋AIの進捗 その38(SWA)

dlshogiの学習にSWA(Stochastic Weight Averaging)を実装して、測定した。 SWA SWA(Stochastic Weight Averaging)は、一定間隔での重みを平均化することで、ニューラルネットワークのテスト精度を改善するテクニックである。 一般的なアンサンブルの手法では…

将棋AIの進捗 その37(FPU reduction)

昨日、MCTSで未訪問のノードの価値を、動的に親ノードの価値で初期化する方法を試した。 その結果、技巧2(4コア)に対する勝率が、60%から69%(R+68.6)になった。 昨日の結果の考察 今までは0.5(引き分け)で初期化していたため、劣勢の局面で未探索のノードが…

将棋AIの進捗 その36(UCBの価値の初期値)

AlphaZeroのMCTSのUCBには、 という式が使用されており、このUCBで行動価値の信頼区間の上限を見積もっている。は、行動の行動価値を、探索を行った結果得られた価値の平均で推定する。 ここで、のときは未定義であるため、何らかの値で推定する必要がある。…

将棋AIの進捗 その35(PyTorchに移行)

年末に新しいCPUが届いたので、正月はPCを組んでいた。 同時にフルタワーケースを買ったのだが、GPU3枚だと熱対策をしないと安定動作しなかったので、ドリルで加工してファンを増設したりと正月から働いてしまったorz 安定動作するようになったので、前回記…

将棋AIの進捗 その34(終盤力の強化)

前回の日記からしばらくぶりですが、その間SENetの学習を続けていました。 自己対局中の詰み探索の深さ ディープラーニング+MCTS系は終盤に弱点があるので、dlshogiでは自己対局中にルート局面でdf-pnによる詰み探索を行い、詰みが見つかった場合は、ゲーム…

dlshogiのLinuxでのビルド/自己対局の実行方法

dlshogiのビルドや自己対局の実行方法について今まで文章化していなかったので、解説用のJupyter Notebookを作成した。 Google Colabで実行できる。colab.research.google.com dlshogiは学習に初期局面集や評価局面集を使っていたり、メモリを大量に消費する…

将棋AIの進捗 その33(末端ノードでの詰み探索)

dlshogiでは末端ノードで短手数(7手)の詰み探索を実施しているが、終盤ではゲーム木中に詰みの局面が多くなり、王手の合法手も多くなるため、探索速度が大幅に低下することがあった。 先日、MCTSにAND/OR木を組み込む実装を行ったことで、MCTSで詰み探索を行…

将棋AIの進捗 その32(MCTSの探索にAND/OR木を導入する)

Leela Chess Zeroの状況を定期的にウォッチしないとなと思って、issueを眺めていたら"Exact-Win Strategy for Overcoming AlphaZero" #799という投稿がされていた。 Leela Zeroのissue#2276にも同様の投稿がある。 ざっくり説明すると、子ノードが勝ちの場合…

将棋AIの進捗 その31(cuDNNによるSENetの推論処理の実装)

dlshogiの10ブロックのWideResnetの自己対局による強化学習を続けていましたが、230サイクルほどでほぼ頭打ちになりました。訓練損失は下がり続けていますが、floodgateの棋譜に対する損失が上昇傾向になっており、技巧2のとの勝利も上がらないため、このモ…

将棋AIの進捗 その29(自己対局におけるノードの再利用)

先日の記事に書いたが、AlphaZeroは自己対局時にノードの再利用を行っている。 dlshogiでは、先手が探索した結果を後手が利用することになるため(逆も同様)、先手と後手の探索のバランスが崩れるため、ノード再利用を行わず各手番でハッシュをクリアしてい…

将棋AIの進捗 その28(探索時のノイズの効果)

世界コンピュータ選手権まで残り1ヵ月もなくなったので、強化学習で強くするのはあまり望めないので探索部の調整を行っている。以前のdlshogiでは、Policyの読み漏れによって、受けを間違えて数手先で詰まされる状況がよく起きていたため、Policyにノイズを…

将棋AIの進捗 その28(弱点の克服)

前回、自己対局の報酬を詰み探索の結果に変更したことで、valueの精度向上したことを書いた。詰み探索結果を報酬にしたのは、評価値が2000近くある局面から、詰みが見つかり一気に負ける局面があるためだが、そのような局面をより積極的に是正することにした…

将棋AIの進捗 その26(自己対局による強化学習の経過2)

前回から時間が空いたが、自己対局による強化学習を続けている。10ブロック、192フィルタのモデルの自己対局による学習が、79サイクル※回したところで飽和気味になったため、10ブロックのモデルからパラメータを転移して15ブロックのモデルで強化学習を行う…

PUCTの定数のベイズ最適化

AlphaZeroの論文では、PUCTの定数を以下の式で、親ノードの訪問回数に応じて動的に調整を行っている。 この式で現れる定数とは、疑似コードでは以下のように定義されている。 # UCB formula self.pb_c_base = 19652 self.pb_c_init = 1.25 私が実験しているd…