TadaoYamaokaの日記

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

PythonでAlphaZero Shogiを実装する その2

前回の日記の時点で、自己対局と学習を実装したが、学習したモデルを使って対局できるUSIエンジンを実装した。 dlshogi-zero/mcts_player.py at master · TadaoYamaoka/dlshogi-zero · GitHub 将棋ライブラリにcshogiを使用して、探索方法をdlshogiと同じ方…

PythonでAlphaZero Shogiを実装する

次の技術書典のネタとしてPythonでAlphaZero Shogiの完全コピーを実装しています。github.com自己対局と学習がようやく動くようになりました。入力特徴と出力ラベルと探索の仕様はAlphaZero Shogiと完全に一致させました。 入力特徴 先手の駒 14 後手の駒 14…

将棋AIの進捗 その27(やねうら王に初勝利)

前回記事にした自己対局の終了判定にdf-pnによる詰み探索を加えて、学習を進めた結果、valueの精度が1%近く向上しました(floodgateのR3500以上の棋譜との一致率)。 横軸の80サイクルから詰み探索を加えています。どれくらいの棋力になったか、やねうら王 2…

AlphaZero方式における入力の正規化

前回AlphaZero方式で訓練データを作成する際のデータの格納方式をSQLiteに決めたので、テストのためにfloodgateの棋譜から訓練データの作成して、学習を行ってみた。 floodgateの棋譜から訓練データ作成 cshogiを使って2018年分のfloodgateのCSAファイルから…

SQLiteによる教師データの管理

先日AlphaZero方式で教師データを生成する際に、データを固定サイズにすることを検討した。 しかし、指し手の確率分布を保存するには、合法手500手近くの領域が必要となるため、1回の訓練ステップ全てのデータをメモリに載せるのは厳しいことがわかった。 Al…

レイヤー融合を将棋AIの推論で試してみる

先日試したレイヤー融合をdlshogiのニューラルネットワークで試してみた。dlshogiはWideResNetを採用しているので、conv->bnのレイヤー融合を適用できるのは、残差ブロックの2つ目の畳み込み層とBatchNormになる。 推論比較 レイヤー融合前後で推論時間を比…

畳み込み層とBatchNormalizationのレイヤー融合をChainerで試してみた

畳み込み層のフィルタは行列で表すことができる。 BatchNormalizationも、入力の要素ごとに適用するスカラーの式だが、カーネルサイズ1×1の畳み込みで表すことができる。推論のフェーズでは、BatchNormalizationの平均と分散は、学習時の統計情報を使うこと…

将棋の合法手の数の統計

AlphaZero方式の強化学習では、指し手の確率分布を教師データとするため、局面の合法手の数の分だけ確率の値を保存しておく必要がある。 将棋の合法手の最大数は593であることが証明されているが、実際の対局ではそのような局面は現れない。 教師データを保…

Google ColabでAlphaZero Shogiのモデルを教師あり学習する

Google ColabでAlphaZero Shogiのモデルを論文に通り定義して、テストのために教師ありで学習してみました。 TPUでも学習して学習時間の比較もしてみました。教師データには、elmoで生成したhcpe形式のデータを使用し、入力特徴量と正解ラベルの加工には、先…

NHWC vs NCHW on Google Colab

畳み込みの入力データの形式には、NHWCとNCHW があるが、どちらがTPUに最適か実験してみた。TensorFlowのデフォルトはNHWCで、ChainerのデフォルトはNCHWになっている。cuDNNはNCHWに最適化されている。 Performance | TensorFlowしかし、TensorCoreは、NHWC…

Google ColabでTPUを使ってみる

ほぼ自分用のメモです。Google Colabで、Kerasを使ってTPUでMNISTの学習を試してみた。TPUを有効にするには、「ランタイムのタイプを変更」からハードウェアアクセラレータを「TPU」に変更する必要がある。KerasでTPUでMNISTを学習するには以下のように記述…

Kerasでクラス分類モデルの出力をlogitsにする

Google ColabでTPUを使うには、今のところフレームワークにTesorFlow(Keras)を使う必要がある。 Kerasで将棋AI用のモデル定義を行っていて、ChainerではできてKerasでは簡単にできない問題にぶつかった。Kerasでクラス分類のモデルを定義して学習する際、通…

高速なPythonの将棋ライブラリを作る

python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。 公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。しかし、機械学習の用途に使用しようと…

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

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

C++の引数解析ライブラリ

c++

Pythonではargparseという引数解析ライブラリが標準で使用できる。 バッテリー同梱なだけはある。C++にはそのような便利なライブラリは用意されていないため、同じような引数解析を行おうとする煩雑な処理を実装する必要がある。 有名な引数解析ライブラリと…

optunaで探索パラメータの最適化

optunaを使って将棋プログラムの探索パラメータの最適化を行うツールを作成した。 Pythonで実装しており、任意のUSIエンジンの間で指定した回数対局を行い、勝率が最大となるように探索パラメータを最適化する。DeepLearningShogi/mcts_params_optimizer.py …

optunaを使ってみる

昨日試したhyperoptと同じことをoptunaで試してみた。 探索する関数の形 hyperoptで試したものと同じ、2つの説明変数で、極大値が複数ある関数 Z = 10**(-(X-0.1)**2)*10**(-Y**2)*np.sin(5*X)*np.sin(3*Y) optunaによる最適化 optunaでは以下のようにしてパ…

hyperoptを使ってみる

ほぼ自分用のメモです。前回ベイズ最適化で探索パラメータの最適化を試したが、ぽんぽこなどが使っているhyperoptも試してみた。 最適化する目的変数 テスト用に、説明変数が2つで、極大値が複数ある少々複雑な関数を用意した。 Z = 10**(-(X-0.1)**2)*10**(…

PUCTの定数のベイズ最適化

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

AlphaZeroの論文

Science誌に掲載された論文は、新しい対局条件での結果と棋譜の公開がメインで技術的な内容は、昨年のarXivで公開された論文とほとんど差分はありませんでした。 DeepMindのページのリンクからダウンロードできるOpen Access versionのMethodsでは、技術的な…

タスクマネージャーのメモリ使用量

C++

将棋AIの学習のためにGPUを増やしたところ、まったく速度が上がらないどころか低下するという事象が起きて、ここ数日原因を調べていました。 メモリスワップが起きていたことが原因で、わかってしまえば単純な話でしたが、Windowsのタスクマネージャーの仕様…

将棋でディープラーニングする その53(価値ネットワークの精度向上)

作成している将棋AIは、現在自己対局による強化学習を続けています。 floodgateの棋譜との一致率は徐々に上がっており、少しずつですが強くなっています。 48サイクル回したところで、GeForce 1080を1枚搭載したノートPCで、GPSFishに1手3秒で勝ち越すように…

GeForce RTX 2080 TiでTensorCoreを使う(その2 FP16対応)

前回、GeForce RTX 2080 TiのTensorCoreによる推論の速度を、cuDNN 7.2で追加されたCUDNN_TENSOR_OP_MATH_ALLOW_CONVERSIONオプションを使用して、内部的にFP32からFP16に変化させることで測定を行った。今回は入力から出力までを、FP16にして測定してみた。…

GeForce RTX 2080 TiでTensorCoreを使う

GeForce RTX 2080 Tiを使って、ニューラルネットワークの推論でTensorCoreが使えるかを試してみた。TitanVでは、TensorCoreを使うことで、将棋AIの推論が2.57倍高速になった。 2080 Tiにも、TensorCoreが544個搭載されており、TitanVの640個より少ないが、CU…

cuBLASでTensorCoreを有効にする

前回cuDNNでTensorCoreを有効にして推論の速度を比較したが、cuBLASでもTensorCoreを有効にして推論の速度を比較してみた。 cuBLASでTensorCoreを有効にする cublasSetMathMode(cublasHandle, CUBLAS_TENSOR_OP_MATH) で、TensorCore演算を有効に設定する。…

cuDNN/cuBLASのFP16対応

TitanVを使って、FP32からFP16にするとどれくらい推論が速くなるか試してみた。 また、Geforce 1080 Tiなどのゲーム用のGPUにはFP16のアクセラレータが搭載されていないが、FP16の演算は可能なため、FP32と速度が変わらなければメモリ転送の効率が上がる分だ…

cuDNNでTensorCoreを有効にする

将棋AIの強化学習にTitan Vを使用しているが、今までTitan Vに搭載されているTensorCoreを使えていなかった。 cuDNN 7.1以前では、TensorCoreを有効にするにはプログラムをFP16に対応させる必要があった。 cuDNN 7.2で、FP32でもTensorCoreが使えるようにな…

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

前回からだいぶ期間が空きましたが、自己対局による強化学習で、教師ありで収束するまで学習したモデルより有意に強くすることができました。前回は、19イテレーションでほぼ互角の強さでしたが、38イテレーションまで自己対局を行うことで有意に強くなりま…

Protocol BuffersをTensorBoardでグラフ表示

バリューネットワークにはプーリング層が有効らしく、AQでもバリューネットワークはプーリング層を使っているようなので、AQのニューラルネットワークの構成を調べてみた。GitHubで公開されているソースでは、ニューラルネットワーク構成は、Protocol Buffer…

AlphaZeroの価値関数の目標をQ値にすると改善する

この記事で、AlphaZeroの再実装を試した際に、価値関数の学習目標をゲームの結果からQ値に変更することで、エラー率が低下するという報告がされています。 medium.comゲームの結果とQ値の平均を目標とするとさらにエラー率が低下し、ゲームの結果からQ値に段…