TadaoYamaokaの開発日記

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

コンピュータ将棋

反証駒

前回までに実装した詰み探索では、ループの対策を行っておらず、最大深さまでループする局面があった。 ほとんどの局面では閾値がうまく働いて無限ループにならないが、以下の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で始めと同じ局…

やねうら王の詰み探索を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はライセンス上の問…

USIエンジンをAWSのWindowsインスタンスで実行する

以前にAWSのWindowsサーバで、GPUを増やしても探索速度を上げられなかったということを書きましたが、後からバグがあって1個のGPUしか使っていなかったがわかりました。 バグを修正したバージョンで、p3.8xlargeで4GPUを使うと自宅のGPU2枚のPCより少し探索…

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

自己対局による強化学習を続けています。 現在、1サイクルあたり500万局を自己対局で生成するサイクルを17サイクル実行したところです。 教師ありでelmoで深さ8で生成した4.9億局面を事前学習したモデルを初期モデルとしています。 初期モデルは、収束前のLe…

将棋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の進捗 その17(AWS対応を検討)

世界コンピュータ選手権の参加者のマシンスペックをみると、マシンスペック高すぎです( ゚Д゚)GPUを2枚詰んだ個人のPCで参加しようと思っていましたが、GPU8枚とかで来られたらモデルと探索の性能ではどうにもならなそうです。 モンテカルロ木探索は並列化の効…

将棋AIの進捗 その16(マルチGPU)

将棋AIをChainerを使用した実装からcuDNNを使用した実装に変更できたので、マルチGPUでの性能を測定した。 Chainerを使用した場合 Python経由でChainerを使用しているPythonのGIL機構によってマルチスレッドの性能に制限がある。 Chainerを使用した場合の、…

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

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

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

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

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

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

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

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

将棋AIの進捗 その11(マルチGPU対応)

GPUが2つになったので、dlshogiをマルチGPUに対応させました。ニューラルネットワークの計算要求をキューにためてミニバッチで推論を行う仕組みにしていたので、キューをGPUごとに用意して、探索スレッドを一方のキューに対応させて、キューを監視してニュ…

将棋AIの進捗 その10(Linux対応)

ChainerのMNISTサンプルをUbuntuで動かすとWindowsよりも早いことがわかったので、dlshogiの自己対局をUbuntuで行えるようにした。AperyのMakefileを参考に、g++でビルドできるようにした。Windowsで32スレッドで1手800シミュレーションで自己対局を行うと、…

第28回世界コンピュータ将棋選手権申し込み

しばらく忙しかったのでコンピュータ将棋の開発できていませんでした。 ぼちぼち再開します。12月くらいにブートストラップのバグを修正してelmoの深さ8で生成した局面を使って学習をやり直しましたが、強さはあまり変わりませんでした。5.8億局面くらいでte…

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

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

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

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