TadaoYamaokaの日記

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

将棋AI実験ノート:ブロック数とフィルタ数とSE有無の比較

同一データを学習した際に、ResNetのブロック数とフィルタ数とSE(Squeeze-and-Excitation)有無により、精度、強さがどう変わるかを比較した。 比較対象 ResNet 10ブロック、192フィルタ ResNet 15ブロック、224フィルタ ResNet 20ブロック、256フィルタ 上の…

dlshogiをPyPIに登録

今までdlshogiの学習を行うために、python環境を作成して、boostをインストールして、C++からPythonモジュール(cppshogi)をビルドしてという手順が必要だったが、pipコマンドでインストールできるようにPyPIに登録した。 pip install dlshogiアップデートの…

将棋AIの進捗 その57(SWAの修正)

dlshogiの学習では、SWA(Stochastic Weight Averaging)を導入している。今までは、1世代学習するごとに、平均化した重みを出力して、次の世代ではその重みを使用して学習していた。 しかし、SWAは通常複数エポックに渡って平均化してから、最後に平均化した…

将棋AI実験ノート:自己対局時のノードの再利用

以前に、dlshogiの自己対局でノードの再利用を行うと、テスト損失が上昇する(過学習する)という問題が起きたことを書いた。方策の分布を学習するようにしたため、問題も起きにくくなっている可能性があるので、ノードの再利用(ルートノードはクリア)を行…

将棋AI実験ノート:方策の学習に温度パラメータを導入

以前にdlshogiで方策の分布を学習できるようにしたが、方策の分布を学習したモデルで対局すると、指し手のみを学習したモデルよりも弱くなるという問題が起きている。 温度パラメータの調整である程度強くできたが、指し手のみを学習したモデルには及んでい…

dlshogiの学習部のリファクタリングと各手法の精度比較

世界コンピュータ選手権も終わったので、feature/hcpe3やfeature/hcpe3_averageに分かれていたブランチをmasterに統合して整理した。 リファクタリング 重複局面の平均化や、評価値の補正をオプション(それぞれ--use_averate、--use_evalfix)で有効/無効化で…

GCTの学習に使用したデータセットを公開

dlshogi with GCTのWCSC31バージョンのモデルの学習に使用したデータセットを公開します。https://drive.google.com/drive/u/3/folders/1Lkh4HL0tMx9p3NNbHue9lvh_HOSBGxhv加納さんのご厚意により、Googleドライブの無料枠を大幅に上回る容量を提供してもら…

将棋AI実験ノート:自己対局の評価値の補正

Discordで、評価値と勝率を変換する際の以下のシグモイド関数の係数aは、dlshogiはelmo_for_learnの自己対局から求めた756.0864962951762という値を使用しているが、floodgateの棋譜などを学習する場合はもっと低い値になるので補正すべきというやり取りがあ…

dlshogi with GCT(WCSC31バージョン)のWindows版ビルド済みファイル公開

dlshogi with GCT(WCSC31バージョン)のWindows版ビルド済みファイルを公開します。 ダウンロード Release 第31回世界コンピュータ将棋選手権バージョン · TadaoYamaoka/DeepLearningShogi · GitHubNVIDIA GPUに対応したTensorRT版と、NVIDIA GPU非搭載のWi…

第31回世界コンピュータ将棋選手権 結果報告

「dlshogi with GCT」として、第31回世界コンピュータ将棋選手権に参加しました。 本日は予選2日目で、dlshogiはシードのため2日目からの参加でした。 上位8チームが決勝進出になります。結果は、30チーム中14位と決勝進出ならず残念な結果でした。昨年の電…

将棋AIの実験ノート:重複局面の平均を学習

dlshogiの自己対局で生成したデータを学習すると、方策損失がNaNになるというissueをもらった。 自己対局棋譜を用いるとPolicyのlossがNaNになる · Issue #44 · TadaoYamaoka/DeepLearningShogi · GitHub 原因 実際にデータをもらって、調査したところ、強化…

cshogiにリーグ戦モードを追加

プログラムの修正やモデルを学習した後の強さの計測に変更前後の自己対戦のみだと、系統が違うソフトに対して強くなっていないことがあるため、基準となるソフトを加えたリーグ戦で確認を行っている。連続対局には、cshogiを使用して、PGNファイルを出力して…

将棋AIの実験ノート:方策の分布を学習すると探索パラメータの調整が必要になる

以前に方策の分布を学習することで、Actor-Criticで学習するよりも精度が上がることを確かめた。 dlshogiの強化学習でも、方策の分布を学習するように移行した。しかし、テストデータに対する精度は上がるが、実際に対局すると弱くなっているという問題が発…

将棋AIの実験ノート:AVX対応

コンピュータチェスのCeresでは、PUCTによるノード選択の処理をAVXを使って高速化している。 これは、Ceres独自の「parallelized descent algorithm」(並列降下アルゴリズム)と合わせて使用することで、効果を発揮するもののようだ。Ceresで実際にどれくら…

将棋AIの実験ノート:方策の分布を学習 その3

前回の続き。 dlshogiの強化学習で、方策の分布を含む棋譜を生成し、そのデータを用いてモデルの学習を行い、方策の分布の有無による精度の違いを検証した。 棋譜生成 dlshogiの自己対局で、200万局面(29315棋譜)を生成した。 学習条件 Resnet10ブロック、活…

将棋AIの実験ノート:方策の分布を学習 その2

以前に、指し手を学習するより、方策の分布を学習した方が、方策の精度が上がるということを書いた。 しかし、現在、dlshogiの強化学習で生成している教師局面フォーマット(hcpe)では、方策の分布を記録していない。そこで、方策の分布を出力できるように、…

将棋AIの進捗 その56(データローダーの並列化)

dlshogiのモデルの訓練に使用しているPythonスクリプトは、ベタなforループで記述しており、ミニバッチ作成部分と、ニューラルネットワークの学習の処理をシーケンシャルに実行しており並列化は行っていなかった。ミニバッチデータの作成は、盤面から入力特…

AobaZeroの棋譜の統計情報

AobaZeroの棋譜を利用するにあたり、統計的な傾向を把握しておきたいと思い調べてみた。 調査範囲 arch000012000000.csa.xz ~ arch000026050000.csa.xzの棋譜を調べた。 1ファイル当たり1万棋譜含まれ、棋譜数は合計で14,050,000になる。 手数 手数を10手間…

将棋AIの実験ノート:初期局面集の優先順位付きサンプリング

深層強化学習の手法に、Prioritized experience replay (PER)(優先順位付き経験再生)という方法がある。 リプレイバッファに蓄積した経験データに優先順位を付けて、優先順位が高いほどより多くサンプリングする手法だ。優先順位の尺度には、TD誤差が用い…

MineRLをWindowsで動かす

MinecraftのOpenAI Gym環境 MineRLをWindowsで動かすための環境構築方法について。 ほぼ個人用メモ。インストール方法は、公式ドキュメントを元にしている。 OpenJDKインストール Chocolateyを使用してインストールする。 PowerShellを管理者権限で起動し、 …

将棋AIの実験ノート:Normalizer-Free Networks

ちょうどFixup Initializationを試したタイミングで、DeepMindからBatch Normalizerを削除してSOTAを達成したという論文が発表された。Introducing NFNets, a family of image classification models that are:*SOTA on ImageNet (86.5% top-1 w/o extra dat…

将棋AIの実験ノート:Fixup Initialization

深いResNetの訓練では、勾配爆発が起きる。そのため、Batch Normalizationを使用するのが一般的である。Leela Chess Zeroでは、Batch Normalizationの統計情報に関連する問題が報告されている。 Pawn promotion issues in T40 · Issue #784 · LeelaChessZero…

将棋AIの実験ノート:最大手数で引き分けの局面を除外

dlshogiの強化学習では、最大手数(320手)に達した局面の価値を0.5として学習対象としている。補助タスクの学習の際に、教師データを調べていた際に、あと数手で詰みの局面で引き分けになっている局面が含まれていることに気付いた(これまであまりチェックし…

将棋AIの進捗 その55(勾配クリッピング)

dlshogiを初期値から学習を開始すると、lossがinfやnanになる場合がある。 初期値からの学習以外でも勾配爆発を防ぐために、勾配クリッピングのオプションを追加した。KataGoでも勾配クリッピングを追加している。学習が安定してからは特に効果はないようだ…

将棋AIの実験ノート:方策の分布を学習

一般的な方策勾配法では、選択した行動aに対して、損失を計算するが、 AlphaZeroでは、方策の損失は、探索から求めた方策の確率分布を使用している。 dlshogiでは、前者をベースにしたActor-Criticで更新を行っている。 後者の確率分布を学習する場合と、ど…

BoostでZlib Filtersを有効にしてビルドする

C++で、gzipの圧縮解凍を標準ストリームで行いたかったので、ライブラリを調べたところ、Boost.IostreamsにZlib Filtersを追加することで対応できることがわかった。しかし、Windowsではデフォルトでは有効になっておらず、「conda install -c conda-forge b…

将棋AIの実験ノート:オフポリシー補正

強化学習において、サンプル効率が低いという課題の対処として、リプレイバッファを使用して過去の方策で生成したデータも学習に使用するということが行われている。 一般的に挙動方策(経験を蓄積する際の方策)と推定方策(学習する方策)が異なる場合をオ…

将棋AIの実験ノート:Attention Branch Network

以前に、Mask-Attentionについて記事にしたが、同様の手法にAttention Branch Network(ABN)がある。 ABNは、Attention Branchの損失も計算して訓練する点がMask-Attentionと異なる。 ここでは、ABNをdlshogiのネットワークに適用して、AIが注視している座標…

Jupyter QtConsoleを起動するとコマンドプロンプトが起動する問題の対策

Pythonを対話的に使用する際は、Jupyter QtConsoleを好んで使用している。Jupyter Notebookを使っている人の方が多いと思うが、Jupyter QtConsoleは起動が速く、Jupyter NotebookをブラウザやVS Codeなどから使用するよりも手軽に使用できる。 また、入力の…

将棋AIの進捗 その54(補助ターゲット)

深層強化学習では、メインの学習タスクに加えて、補助タスクを同時学習することで、パフォーマンスを改善するということが行われている。 [1611.05397] Reinforcement Learning with Unsupervised Auxiliary Tasks 囲碁AIの例 囲碁AIのKataGoでは、 占領した…