TadaoYamaokaの日記

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

将棋でディープラーニングする その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値に段…

【Androidアプリ】電卓アプリをアップデート

ほぼ自分用のアプリですが、電卓アプリをアップデートしました。 play.google.com累乗と階乗の演算子の優先順位が除算と同じになっていたというバグの修正です。 JavaCCで文法を定義していましたが、編集ミスで階乗と除算が逆になっていました。電卓アプリは…

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

これまではAperyの初期局面集にfloodgateの棋譜を加えたものを初期局面集として自己対局を行っていたが、中終盤のバリエーションを増やすため、 やねうら王教師局面からAperyの初期局面集を作成(評価値200以内局面を抽出) 初期局面集から詰みの局面を除く と…

詰み探索の高速化

前回までに作成したdf-pnによる詰み探索を自己対局に組み込んでみたが、探索速度が遅くあまり実用にならなかった。これまでは、モンテカルロ木探索の先端ノードで全探索の7手詰めを行っていたが、それと同じ時間になるようにdf-pnの探索ノード数を調整すると…

王手生成の最大数

詰み探索のMovePickerには最大合法手分の配列を確保していたが、王手生成に限れば最大合法手分よりもサイズを減らすことができる。 そこで、スタックサイズを節約するため、配列のサイズを王手生成の最大数に合わせることにした。 合法手の最大数 合法手の最…

優越関係を利用した証明数と反証数の初期化

局面Aが局面Bを優越する場合、Aの証明数はBの証明数以上になる性質がある。 そのことを利用すると、Aの証明数は、AとAに優越されるすべての局面の証明数の最大値をAの証明数とすることができる。 反証数についても同様に優越関係を利用できる。これをそのま…

反証駒

前回までに実装した詰み探索では、ループの対策を行っておらず、最大深さまでループする局面があった。 ほとんどの局面では閾値がうまく働いて無限ループにならないが、以下の19手詰めの局面で最大深さまでループが発生していたため、優越関係を反証に利用す…

証明駒

詰み探索に証明駒を実装した。証明駒は以下の論文の説明の通り実装した。 詰将棋を解くアルゴリズムにおける優越関係の効率的な利用について 速度比較 証明駒の実装前後で速度は以下の通りとなった。 実装前の状態は、前回の日記に書いた先端ノードで2手詰め…

優越関係の反証への利用

先日の記事で、優越関係を反証に利用するとかえって遅くなるということを書いたが、遅くなる原因は、探索を深さで打ち切りにしていることが原因だった。作成している詰み探索は、長手数の詰将棋を解くプログラムを開発するというより、実戦の詰み探索を短時…

2手詰めルーチン

前回詰み探索に3手詰みルーチンを入れると遅くなったと書いたが、先端ノード以外でも3手詰めルーチンを呼び出していたことが原因だった。3手詰めを行うのは先端ノードのみとして、15手詰めの局面で速度を比較しなおした。 position sfen 1n1g3+Pl/k1p1s4/1ng…

3手詰めルーチン

詰み探索に近接王手からの3手詰めルーチンを実装した。 近接王手の手を生成することで、3手で詰む場合無駄合いを省くことができる。近接王手の生成は、敵玉の8近傍に移動または持駒から打つ手と、桂馬で王手する手を生成する。 王手の指し手生成を変更するこ…

詰み探索のループ対策

やねうら王から移植した詰み探索では、以下の後手3手詰めの局面を不詰みと判定してしまう。 position sfen +B+R5n1/5gk2/p1pps1gp1/4ppnsK/6pP1/1PPSP3L/PR1P1PP2/6S2/L2G1G3 w B2N2LP2p 1 原因を調べたところ、探索にループが発生し、深さが4で始めと同じ局…

詰み探索で優越関係の利用

やねうら王から移植した詰み探索の速度を上げるために優越関係の実装を行った。局面Aが局面Bを優越するとは、AとBの盤上の駒の配置が同一で持駒のみが異なっており、Bの持駒がAの持駒の部分集合になっている場合を示す。 参考: 詰将棋を解くアルゴリズムに…

やねうら王の詰み探索をAperyに移植

Aperyの初期局面集には、詰みの局面を数%含んでいるので、これを除きたい。 詰みの局面で自己対局を行い教師局面を生成すると終盤局面に偏りが生じると考えるためである。 なお、初期局面集に詰みの局面を含めることがマイナスか判断するには実験が必要だが…

やねうら王教師局面からAperyの初期局面集を作成

やねうらおさんが公開してくれていたdepth10で作った110億局面の教師から、Apery用の初期局面集を作成するツールを作成しました。教師局面に記録されている評価値の絶対値を閾値にして、Aperyの初期局面集形式(hcp)を出力します。コマンド例) psv_to_hcp.ex…

将棋AIの進捗 その23(探索と評価の直列化 その2)

前回、対局プログラムを探索と評価の直列化することによって高速化を行ったが、自己対局プログラムについても探索と評価の直列化を行った。以前は、探索を複数スレッドで行って、ニューラルネットワークを計算をキューにためて専用のスレッドでバッチ処理を…

使用ライブラリをAperyに変更

dlshogiは今までAperyから派生したelmo_for_learnのソースを使用していましたが、最新のAperyで修正されたバグの修正を取り込むため使用ライブラリをAperyに変更しました。 入玉宣言に修正が入っていたので、そこだけ取り込むつもりでしたが、ついでにすべて…

Aperyでやねうら王のPackedSfenValueを読み込む

世界コンピュータ将棋選手権のアピール文章にも書いたが、マルチGPUで動かす場合、GPUごとに異なるモデルをロードすることで、モデルごとに誤る確率が独立とすると複数モデルが同時に誤る確率は、単一のモデルを使用する場合より低くなるため精度の向上が期…

将棋AIの進捗 その22(探索と評価の直列化)

前回、ねね将棋が世界コンピュータ将棋選手権で高い探索速度を出していたので、バリューの計算中に末端ノードから新しく探索を行う方法で簡易な実装をして実験を行った。 しかし、末端ノードから新しく探索を始めると、新しく始めた探索のバリューの計算され…

将棋AIの進捗 その21(探索の深さ)

dlshogiでは、MCTSの末端ノードでバリューを計算し、その値をバックアップしているが、GPUでバリューの計算が終わるまで待機している。 バリューの計算が終わる前に次の探索を始めると、ノードにバーチャルロスのみが反映された状態で、勝敗の推定値が反映さ…

第28回世界コンピュータ将棋選手権 出場結果

第28回世界コンピュータ将棋選手権に参加してきました。dlshogiは、一次予選に7位で通過しましたが、二次予選では1勝8敗で24チーム中最下位という結果でした。dlshogiは、今回注目されていたCrazy Shogiと同じくモンテカルロ木探索とディープラーニングを組…

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

dlshogiの第28回世界コンピュータ将棋選手権バージョンのビルド済みファイルを公開しました。第5回将棋電王トーナメントバージョンは、Chainerの環境構築が必要でしたが、USIエンジンの実行のみであれば不要になっています。 CUDA、cuDNNはライセンス上の問…