TadaoYamaokaの日記

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

将棋AIの進捗 その4(詰みの探索)

前回の日記で、末端ノードで詰みの探索を行う予定と書いた通り、詰みの探索をするようにしました。

ディープラーニングは詰みの探索が苦手なので、ディープラーニングと詰み探索を組み合わせるのは有効だと思っています。
Policy Network、Value Networkの計算中は、CPUが空いているので、詰み探索を行ってもNPSへの影響はないので、確実に終盤の棋力向上につながるはずです。
といっても、棋力でいえばPolicy Network、Value Networkの精度の方が重要ですが。

詰み探索の実装は、AND/OR木を使って、とりあえず優先度を考慮しないで探索しました。
かなり遅いコードですが、深さ7までは、NPSに影響でないので、採用することにします。

コードはこれ↓
DeepLearningShogi/mate.cpp at master · TadaoYamaoka/DeepLearningShogi · GitHub

ルートノードでの詰みの探索を今までは、Aperyを使って探索していましたが、詰み探索の実装に置き換えました。
終盤局面で深さ11までは1秒以内探索できるようですが、深さ13にすると10秒くらいかかる時がありました。

長手の詰みを探索するには、df-pnなどまともな実装が必要そうです。

王手の指し手の生成も全合法手を1手動かして王手になるか調べているので、遅いです。
Aperyに王手の指し手生成があれば、それを使えたのですがどうやら実装されてないようです。
この部分を自力で実装するのは大変なのでどうしようかな・・・。

将棋AIの進捗 その3

以前の日記で、電王トーナメントに出るつもりと書いていましたが、申し込みをしました。
予選通過も厳しそうですがとりあえず頑張ります。


さて、前回からの進捗ですが、35億局面の学習が3エポック回したところで飽和しました。
一致率は、Policy Networkが46%、Value Networkが78.1%となりました。

Policy Networkは強化学習を行っているので、単純に一致率では評価できませんが、少し微妙な感じです。
入力特徴、ネットワーク構成、フィルターサイズなど変えて実験したいですが、やり直す時間もなさそうなので、一旦これで完了として他の改良に着手しようかと思います。

モデル学習が終わったので、昨晩からfloodgateに放流してみました。

f:id:TadaoYamaoka:20170917091642p:plain

レーティングは、2710となっています。

gpsfish_normal_1cと同じくらいの強さにはなっています。
同じディープラーニングを使っているShogiNetSearchには勝っているようなので、ディープラーニングモンテカルロ木探索の有用性はそれなりに示せているかと思います。

上位ソフトには全く勝てていません。
原因がどこにあるか詳細に分析をしたいと思っていますが、気づいたところでは終盤になるにつれPolicy Networkで読み漏れが発生していて、読み漏れ起きる局面ではValue Networkも正しい値をつけられていないようです。

終盤では従来の手法の方が有効そうなので、終盤は従来の手法も取り入れた方がよさそうです。

AlphaGoでも、末端局面の評価は、Value Networkとプレイアウトの平均としているので、それを参考にValue Networkと従来の手法(3手読みくらい)の平均とした場合にどうなるか次に試す予定です。
Value Networkの実行中はCPUは遊んでいるので、数手くらいであれば従来の手法で探索を行っても速度面のデメリットはありません。
Policy Networkの読み漏れ対策としては、最小選択確率を調整したり、遷移確率にノイズを付加して、読み漏れする局面も低い確率で探索させるようにする予定です。

2017/9/18 追記

末端ノードで従来手法での探索を行って平均をとるのを試してみましたが、逆に弱くなってしまいました。
浅い探索の評価値よりはValue Networkの精度の方がよいということでしょうか。
Policy Networkで読み漏れが発生する件は、ノイズを付加するとやはり弱くなってしまうようです。

素直にPolicy NetworkとValue Networkの精度を上げることを考えた方がよさそうです。

  • 効果的な入力特徴を増やす
  • ネットワーク構成、フィルターサイズなどを見直す
  • 中盤以降の学習局面の数、バリエーションを増やす
  • 深さ8よりも上げて棋譜を生成する

など。

2017/9/19 追記

Value Networkの計算中に1手詰め計算をするようにしました。
デメリットは特にないので、少しは効果がでるはずです。

できれば3手詰めにしたいけど、elmo(Apery)に3手詰めが実装されていないので、自力で実装が必要になります。
それほど難しくはないと思うので、実装する予定です。

将棋AIの進捗 その2

elmo_for_learnを使ってdepth8で35億局面の生成ができたので、DNNの学習を開始しました。

前に7.5億局面を学習したときは、4日と20.5時間かかったので、35億局面を学習するには22日15.6時間かかる見込みです。

elmo_for_learnで生成した局面には重複局面が4%程含まれるため、前処理として重複局面を削除する処理を行いました。

自作のC++ツールで、std::uniqueを使って重複を削除していますが、35億局面のファイルは合計で127GBあってメモリに乗らないため、ファイルを分割し、分割したファイル同士で重複を削除するツールを作成して処理しました。
ElmoTeacherDecoder/hcpe_uniq2 at master · TadaoYamaoka/ElmoTeacherDecoder · GitHub

DNNの学習では、学習データがシャッフルされていることが精度を上げるために重要なため、これもC++でツールを作成し、std::shuffleでシャッフルを行いました。
これもメモリに乗らないため、まずは全データのインデックス(連番)を格納した配列を用意し、それをシャッフルしたあと、インデックスを使って実際のデータを分割して処理するツールを作成しました。
ElmoTeacherDecoder/hcpe_shuffle at master · TadaoYamaoka/ElmoTeacherDecoder · GitHub

あと、初期局面のroots.hcpのバリエーションを増やすため、まふ定跡の局面とネットで集めた棋譜の初期局面を追加しています。

あとは、どれだけ精度が上がるか楽しみにして、学習が終わるのを待つだけです。

将棋AIの進捗

検証しているディープラーニングを使った将棋AIは、学習データを増やさないと精度が上げられないため、elmo_for_leanを使ってひたすら学習データを生成中です。

現在、ようやく20億局面くらい。
PCを占有されると困るので、10コアのPCを1台買ってしまいました。
仕組みを作っている間は楽しいですが、精度を上げるフェーズになるとつらいですね・・・

次の電王トーナメントに出るつもりでいますが、上位のソフトに届く可能性は低そうですが、とりあえず頑張ってみるつもりです。

大会のマシンのGPUがしょぼかったらどうにもできないので、Titan Xか1080Tiを複数枚用意してくれないかなぁ。

音声スペクトルモニター(Audio Spectrum Monitor)のバージョンアップ

Androidアプリの音声スペクトルモニター(Audio Spectrum Monitor)をバージョンアップしました。

要望のあったピークホールドの機能を追加しました。

ドラムのチューニングに使いたいという方がいて、瞬間のピッチを保持したいという要望をもらっています。
実装は難しくないですが、UIをどうするかが悩みどころです。
チューニング用途だと音階と周波数Hz表示は必須と思われますが、リアルタイムの表示と2つ表示するとごちゃごちゃしそうで、エレガントなUIをひらめき待ちです。

play.google.com

音声スペクトルモニター(Audio Spectrum Monitor)のバージョンアップ

Androidアプリの音声スペクトルモニター(Audio Spectrum Monitor)をバージョンアップしました。

しばらく将棋AIばかり作っていたので、アプリの開発が止まっていましたm(_ _)m

もらっていた要望のうち、とりあえずGoogleドライブに転送する機能を追加しました。

アプリで保存したファイルはどこに保存されるのか?という質問をよく受けていたのですが、Androidのアプリで保存したファイルはセキュアな領域に保存されるため、他のアプリから直接参照することができません。

代替策として、インテントを使ってオーディオファイルに対応したアプリに転送できるようにしました。
Googleドライブに転送することで、ファイルとして取り出すことができます。


あと、ピークホールドを追加してほしいという要望ももらっていますが、近いうちに対応する予定です。

play.google.com

ディープラーニングを使った将棋AIの作り方

後でちゃんと書く予定

とりあえず以前の記事をリンク
tadaoyamaoka.hatenablog.com