TadaoYamaokaの開発日記

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

DeepLearning

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

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

GeForce RTX 2080 TiでTensorCoreを使う

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

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イテレーションまで自己対局を行うことで有意に強くなりま…

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

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

将棋AIの進捗 その19(初期局面集)

自己対局による強化学習を行う際に、対局の開始局面には、初期局面集を使用している。 AlphaZeroでは、固定手数まではノイズを加えルートノードの訪問回数に応じた確率で手を選択することで局面の多様性を確保している。 しかし、この方法ではモデルに依存し…

将棋AIの進捗 その18(スケーラビリティ)

AWSのp3.8xlargeインスタンスを試験的に借りてGPUを増やした場合の性能を測定しました。 Linuxだとマルチスレッドの性能がでないので、OSはWindowsです。p3.8xlargeのマシンスペックは以下の通りです。 Tesla V100 GPUs 4 vCPUs 32 Main Memory 244GiB 各GPU…

将棋AIの進捗 その15(cuDNNを使用)

モデルの学習にディープラーニングフレームワークのChainerを使用していますが、対局時にChainerで推論を行うと、Python経由で呼び出すためマルチGPUで動かす際、Python経由だとGILによってマルチスレッドの性能が出なくなる。 また、実行環境にPythonが必要…

Chainerで学習したモデルを使ってcuDNNで推論する(マルチGPU)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードを、マルチGPUで並列に動作するようにした。cuDNNをマルチスレッドで、スレッドに別々のGPUを割り当てて使用する場合、それぞれのスレッドでcudaSetDevice()を呼び出し、GPU IDを指定…

Chainerで学習したモデルを使ってcuDNNで推論する(ResNet)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードを、Residual Network(ResNet)構成にした。推論時には、テンソルの加算を行うだけで特に難しいことはない。 ネットワーク定義(Chainer) ResNetは1ブロックのみで、ブロック内の畳み込…

Chainerで学習したモデルを使ってcuDNNで推論する(dropout)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、dropoutを追加した。dropoutは学習時のみ処理を行うため、推論時には何もしなくてよい。 つまり、推論のネットワーク定義にはdropoutは必要ない。 学習用ネットワーク定義 学習用…

Chainerで学習したモデルを使ってcuDNNで推論する(時間計測)

昨日の日記の続きです。C++のコードでcuDNNを直接使用して推論を行った場合と、Chainerを使用して推論を行った場合の実行時間の比較を行った。 測定条件 MNISTのtest set images(1000画像)のすべてを推論するのに要する時間を測定 ミニバッチサイズは、100 …

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

自己対局による強化学習の検証をはじめた。強化学習の手法は、以前の日記で書いた通りで、Alpha Zeroの手法を参考にして、1手800シミュレーションで自己対局を行う。自己対局→学習のサイクルを繰り返してモデルを成長させる。 1回のサイクルで、どれだけの自…

【書籍】将棋AIで学ぶディープラーニング

「将棋AIで学ぶディープラーニング」という本を出版します。昨年10月に技術書典3で「ディープラーニングを使った将棋AIの作り方」という技術系同人誌を出したことをきっかけに書籍化のお話をいただきました。技術書典で出した本は、方策ネットワークを使った…

MCTSnetの論文を読む

DeepMindからarXivに投稿された論文「Learning to Search with MCTSnets」についてです。Redditの投稿が簡潔に要約しています。 Learning to Search with MCTSnets : cbadukAlphaGo ZeroのPUCTアルゴリズムは、PolicyとValueと訪問回数を使って、固定の計算…

将棋AIの進捗 その13(自己対局のマルチGPU対応 その2)

前回マルチスレッドで2つのCPUを使用して自己対局を行うプログラムを作成したが、局面生成の速度はGPU1つの場合と変わらなかった。 ChainerをPython経由で使用しているため、GILのために効率が上がらなかったためと考えている。そこで、プロセスを分けてマル…

将棋AIの進捗 その12(自己対局のマルチGPU対応)

自己対局のプログラムをマルチGPUに対応させました。処理方式は、対局プログラムのマルチGPU対応とほとんど同じです。マルチGPU対応により局面生成の速度がどれくらいあがるか測定しました。 測定条件 シングルGPUは、TitanV 1枚。200スレッドで対局。 マル…

ChainerでマルチGPUを試す

GPUが2枚になったので、ChainerでマルチGPUによる学習を試してみた。MNISTサンプルを使って、実行時間を測定した。 測定条件 CUDA v9.0 cuDNN 7.0.5 ChainerのGitHubレポジトリのexamples/mnistを使用 単体の実行時間はtrain_mnist.pyの実行時間 マルチGPUの…

将棋でディープラーニングする その51(ディリクレノイズ)

電王トーナメント版のdlshogiでは、Policyの読み漏れを回避するために、自分の手番の局面だけ、Policyの予測するそれぞれの手について1/1000の確率で値を1.5倍にするということを行っていた。 自分の手番の局面だけにしたのは、相手の局面にもノイズを入れる…

AlphaZero Chess/Shogiの論文を読む その3

前回までに個人的に気になった点はだいたい書いたので、今回は残った部分で気になったところを拾って書きます。 スケーラビリティ 思考時間を増やした場合、αβ探索よりもレーティングの伸びが良い。 これはAlphaZeroのMCTSがαβ探索より思考時間を短縮できる…

AlphaZero Chess/Shogiの論文を読む その2(AlphaGo Zeroとの差分)

AlphaZero Chee/Shogiの論文についての続きです。 今回はAlphaGo Zeroとの差分について書きます。AlphaGo Zeroの論文については、以前に書いた記事を参照ください。 ネットワーク構成 ニューラルネットワークの構成は、AlphaGo Zeroと同じ、PolicyとValueを…

AlphaZero Chess/Shogiの論文を読む

DeepMindからAlphaGo Zeroと同じ方法で、チェスと将棋でトップレベルを上回ったという論文が発表されました。 [1712.01815] Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithmドメイン知識を用いないスクラッチから…

将棋でディープラーニングする その50(ブートストラップ【訂正】)

以前に書いたブートストラップの説明に誤りがあったのと、Chainerで誤差逆伝播の効率化ができたので、追加記事を書きます。 間違っていた内容 以前に書いた記事で、2確率変数の交差エントロピーは、確率変数がシグモイド関数の場合、 で表され、偏微分が、 …

世界コンピュータ将棋選手権 ライブラリ登録

dlshogiをライブラリ登録しました。 コンピュータ将棋選手権使用可能ライブラリディープラーニングを使って将棋AIを開発したい方のお役に立てば幸いです。第5回電王トーナメントバージョンは、いろいろとバグがあったので、↓このコミットがバグを修正したソ…

将棋でディープラーニングする その48(ResNet)

これまでニューラルネットワークの構成に、5ブロックのResNetを使ってきたが、層を増やすると精度がどれくらい上がるか実験を行ってみた。これまでは、ResNetの構成は、こちらの論文([1603.05027] Identity Mappings in Deep Residual Networks)で精度が高…

将棋でディープラーニングする その47(全結合)

AlphaGo Zeroでは、policy networkの出力ラベルを石の色×座標+passで表しており、全結合層で出力を行っている。 Fan Hui版AlphaGoでは1×1フィルターの畳み込み層を出力層としていた。 出力層を全結合にした理由は、論文では説明されていないが、精度が上がる…

将棋でディープラーニングする その46(出力ラベルの表現方法)

開発してるdlshogiでは、出力ラベルを(駒の種類×移動方向+持ち駒の種類)×座標で表現し、出力層にAlphaGoを参考に1×1の畳み込み層を使用している。 AlphaGo Zeroでは、出力ラベルを石の色×座標+passで表しており、全結合層で出力を行っている。 1×1の畳み込み…

将棋でディープラーニングする その45(高速化)

現在のdlshogiの実装では、NPSが2500程度しかでていないため、高速化できる箇所がないかを検討している。モンテカルロ木探索でpolicyとvalueをGPUで計算すると、GPUの実行時間が処理時間のほとんどを占めているため、CPUの論理コア数以上のスレッドで並列に…

将棋でディープラーニングする その44(L2正則化)

将棋AIのPolicy NetworkとValue Networkのマルチタスク学習でのL2正則化の効果を測定してみた。 正則化なし loss policy accuracy value accuracy L2正則化係数 loss policy accuracy value accuracy 考察 正則化なしでも、trainとlossにそれほど差がないが…