Aperyのメモ [将棋]
去年ぐらいにツイートで謎のリークがあったが、まさかぁと思っていたところ、本当に公開された。
しかもgithubなので、開発もやりやすい。(といいつつ最近はコンピュータ将棋そのものは忘れている)
全然動かしてないので、確認用のメモ程度で大したことは書いてない。
<平岡さんにRTされて閲覧数が増えたので少し直しました>
■準備
https://github.com/HiraokaTakuya/apery_binaries
落としてきたZipを展開するとBinフォルダが出来ると思うが、リネームしてはいけない
フォルダ構成を変えると、評価値が間違ったまま動作するという罠モードに移行する
(10手目ぐらいで評価値が5000とか出てくる)
2chではXmlいじってどうこうという話が出ていたが、将棋所でもShogiGUIでも普通にエンジン登録できる
・主要な設定
USI_Hash:2048 とか適当に決めたが、ZobristHashの仕様で次の大きさは4096になる
USI_Ponder:False CPU同士対局のときはこうする。
Threads:デフォルトはコア数になっているが、Core i7などでHT使ってて8コアになっていたら、4にする
電王戦FINALバージョンなので対人用設定になっている
Max_Random_Score_Diff 30 評価値がトップとの差30まで
Max_Random_Score_Diff_Ply 40 40手目まで
と思ってるがソースコード確認していない
多分提出したら設定変えられないというルールのためにそうなってるんだろうが、個人が検討用に使うにはここらへんは両方0にしたほうがよいはず。
Diff_Plyのほうの最小値が-32768なのはなんでだろうか。不安になってきた。
対局用では逆に30を500にしたら調度良くなったというような話もあった
序盤はMultiPV3になっているが、これはソースを変えないとだめそう?
Use Sleeping Threadは対局時にはOffのほうが良さそうな印象があったが、デフォルトONだった。
・設定その他
将棋所の「空白は認めないルール」に対応するため、Stoskfishと同等の設定値に「_」がついているので、設定項目が大量に出ている。
いくつかの値は変更されているようだ。SplitDepthが1手深くなっている。
・動作
速度はBMI2使ったものでCore i7 3.4GHzで
序盤1コア80万程度、4コアで320万ぐらい
中盤1コア60万程度 4コアで240万ぐらい
・安定性
GPSFISHと違って落ちない。素晴らしい。
・強さ
自分では3秒10戦しかやっていないが、6-4だった。
Tweetや2ch情報をみてもgpsfishと比べて6:4ぐらいっぽい人もいれば圧勝の人もいる
5960XだとNPSは2倍ぐらいになり、それがR3200のXeonをぼこっていたことを考えると、短時間より長時間のほうがより差がでるかもしれない(平岡さんも短時間はあまり強くないかもとは仰られていた)
評価値を見てみると、中盤においては
Bonanza:点がついていない
gpsfish:矢倉とかで妙に強気なことがある
Apery:gpsfishと似ているが、gpsが評価しない局面で良くなることが多い
みたいな印象。序盤は速さを活かして深く読むので先に優勢になる事が多い。
<追記>
あと、序盤の定跡生成っぽいコードはちゃんと見ていないが、GPSの定跡のように抜けたらいきなり300点悪くなってるというようなことはなさそうだ。
これは、「人間の定跡を再評価して、ある程度よいものを自分の定跡にするようにする」という習甦の方法らしい。(要検証)
<追記終わり>
・ソースコード
https://github.com/HiraokaTakuya/apery
Readme.txtにも書かれているように、StockfishとBonanzaを読んでいると大体わかるようになっているっぽい。
個人的にBonanzaの課題であるところは、速度を出すために黒番と白番でコードが書かれていて、ビット定数がハードコーディングされているところだと思っている。ボナンザ解析Blogでも見ないと意味がわからない。
Stockfishのコードは妙にシンプルだと思ったが、チェスの場合Knightですら後ろにいけるので移動方向に区別があるのは、Pawnだけ。
一方で将棋の場合は先手と後手で非対称なため、コードの同一性が難しい。(ハードコーディングされている数値が先手と後手で違う)
この問題は、各ソフトでは以下のようになっている
Bonanza:先手用ルーチンと後手用ルーチンを書く。数値もハードコーディング。
旧やねうら王:YaneLispを作成し、先手用や後手用のルーチンを自動生成(それだけじゃないが)
Apery:C++11以降のテンプレート機能を使用
Colorが手番を表していてBlackのほうが先手、Whiteのほうが後手のはずだが
(GPSFISHが公開されたときも少し話題になっていたが、チェスだと白が先手だが、将棋では黒が先手で表現されるかららしい)、テンプレート関数でColorがある場合は、先手と後手で違うコードを生成していると思って良い。最近のC++はテンプレートからさらに定数がコンパイル時に決定されるようになっているので、より意味がわかりやすいコードが書けるようになっている。
inFrontMaskなんかはいい例で、Bonanzaではマジックナンバーだったが、それをコンパイラに自動生成させている。templateの部分を引数にすれば普通のコードとしても成り立っている。
VisualStudio 2013の段階ではC++のテンプレートに使える引数に制約が多いため、ビルドが通らない。StockfishではC++11とそうでないコードを用意しているぐらいだが、将来的にVisualStudioがC++11に対応しなかったらどうするんだろうか。
また、学習においてBonanzaではfuncなのが、sigmoidになってたりとか、よりわかりやすい。ただ、個人的にはsigmoidではなくて、Tに相当する何かにしてその中にインラインでsigmoidとかのほうが、より学術的ではないかなと思ったりもする。そうすると元々のfunc自体も別に悪くないのかとか思ったりもする。
学習は多分NDFっぽいことはやってるはずだが、見ていない。Bonanza Methodと同等の構造になってることは確認した。
<追記>
本格的に学習ルーチンを使うのは2015年以降のようだ。
チーム開発する上で、Bonanza改造したほうが手軽なので、それをApery型にしていたようだ。
<追記終わり>
・最終的なパラメータ更新は向きしか考慮しないのがBonanza Methodなので、定数項をかけないようにして、学習の効率化を図ろうとしたようだが、やめている。(理由は不明)
・並列化するべきところとそうでないところについてのコメントが書いてあった。
・FV_WINDOWの数字が変えてあった。
Bonanza Method以外の方法としてgps将棋やBlunderが採用した関数(ロジスティック回帰の対数をとったもの?)にしていたりとかはやっていないようだ。
ロジスティック回帰の関数の性質を考えると、BlunderやGPSや(なのはも?)この方法のほうが良い成果がえられるのかもしれない。
あと、Aperyのソースコード本体よりも、棋譜からBook作るRubyスクリプトのほうも興味深い。(WSCS常連はやってて当然かもしれないが)新規とかの人はかなり参考になりそう。特にAperyはやねうら定跡の富岡流?にはまった過去があるので、このスクリプトには思い入れがあるのではなかろうか。
また、ついでにやってるかどうかはわからないが、Bookの評価値や勝率などを設定している点も興味深い。gpsfishでは、自分が300点悪いと思ってるほうに突っ込むというアホな序盤力があるが、定跡であっても評価値を入れることで自分の好きな形成に入るようになっている。逆にこのことによって、戦型が絞られすぎてしまうので、電王戦FINALでは振り飛車を解禁したのだろう。が、裏目に出てしまったようだ。(というと四間飛車=悪いみたいな話になってしまうが)
序盤は今でも課題だと思われる。PonanzaはUCTで序盤生成を半年ぐらい前にやって、秘策3二金を編み出した(が、Floodgateでその秘策が出ていたようで、Awakeの巨瀬さんはその一局を見逃さず、対策を入れていた)
・終盤
終盤にgpsfishにひっくり返されるという話が2chにあった。十数手の詰みを読みきれなかったとか。終盤力だけでいうと、Bonanza>gpsfish>Aperyのような気がしている。特にBonanzaは詰みっぽいほうに突っ込む傾向が強い。勝率という点だけで見ると、中盤でNPSが出たほうが良いのでAperyのほうが強いのだが、Stockfishに普通にKPP型の評価関数を乗せるとどうしても終盤弱くなるので、工夫の余地はあると思うが、それは素人考えか。
gpsfishでは一定局面ごとにdfpnを呼び出すようになっている。これは、クラスタのセカンダリ以降で使われることを考慮しているためで、対局用としてはチューニングする余地はありそうな気はしている。
アイデアとして、終盤の詰み発見が遅いのがbonafish型の弱点なので、相矢倉などの居飛車系にして入玉を含みにして、DFPNが動くようにすると大会などでは逆転模様になりやすいのではないだろうか。
<追記>
電王戦FINAL,第2局の終盤について、Ponanzaの山本さんがTweetしてたが、三手ぐらい前の局面で1六角が危険だと察知するようだ。何をやったらそうなるのかは大変興味ある。こういうのは評価関数の精度をあげるしかないようなことは前に言ってたがどうなんだろうか。
※13角成は13歩成の間違いだと思われる
例えば5960Xで探索しているとして、34秒*2で68秒のときに、どうなるかというのは、これからWSCS出る人にはテストパターンとしてはいいかもしれない。
程度の差はあれ、最初に13歩成を読んで、ある程度たってから1八香でその時点は100~300程度の点数というのが、どのソフトでもあるような傾向のようである。
しかもgithubなので、開発もやりやすい。(といいつつ最近はコンピュータ将棋そのものは忘れている)
全然動かしてないので、確認用のメモ程度で大したことは書いてない。
<平岡さんにRTされて閲覧数が増えたので少し直しました>
■準備
https://github.com/HiraokaTakuya/apery_binaries
落としてきたZipを展開するとBinフォルダが出来ると思うが、リネームしてはいけない
フォルダ構成を変えると、評価値が間違ったまま動作するという罠モードに移行する
(10手目ぐらいで評価値が5000とか出てくる)
2chではXmlいじってどうこうという話が出ていたが、将棋所でもShogiGUIでも普通にエンジン登録できる
・主要な設定
USI_Hash:2048 とか適当に決めたが、ZobristHashの仕様で次の大きさは4096になる
USI_Ponder:False CPU同士対局のときはこうする。
Threads:デフォルトはコア数になっているが、Core i7などでHT使ってて8コアになっていたら、4にする
電王戦FINALバージョンなので対人用設定になっている
Max_Random_Score_Diff 30 評価値がトップとの差30まで
Max_Random_Score_Diff_Ply 40 40手目まで
と思ってるがソースコード確認していない
多分提出したら設定変えられないというルールのためにそうなってるんだろうが、個人が検討用に使うにはここらへんは両方0にしたほうがよいはず。
Diff_Plyのほうの最小値が-32768なのはなんでだろうか。不安になってきた。
対局用では逆に30を500にしたら調度良くなったというような話もあった
序盤はMultiPV3になっているが、これはソースを変えないとだめそう?
Use Sleeping Threadは対局時にはOffのほうが良さそうな印象があったが、デフォルトONだった。
・設定その他
将棋所の「空白は認めないルール」に対応するため、Stoskfishと同等の設定値に「_」がついているので、設定項目が大量に出ている。
いくつかの値は変更されているようだ。SplitDepthが1手深くなっている。
・動作
速度はBMI2使ったものでCore i7 3.4GHzで
序盤1コア80万程度、4コアで320万ぐらい
中盤1コア60万程度 4コアで240万ぐらい
・安定性
GPSFISHと違って落ちない。素晴らしい。
・強さ
自分では3秒10戦しかやっていないが、6-4だった。
Tweetや2ch情報をみてもgpsfishと比べて6:4ぐらいっぽい人もいれば圧勝の人もいる
5960XだとNPSは2倍ぐらいになり、それがR3200のXeonをぼこっていたことを考えると、短時間より長時間のほうがより差がでるかもしれない(平岡さんも短時間はあまり強くないかもとは仰られていた)
評価値を見てみると、中盤においては
Bonanza:点がついていない
gpsfish:矢倉とかで妙に強気なことがある
Apery:gpsfishと似ているが、gpsが評価しない局面で良くなることが多い
みたいな印象。序盤は速さを活かして深く読むので先に優勢になる事が多い。
<追記>
あと、序盤の定跡生成っぽいコードはちゃんと見ていないが、GPSの定跡のように抜けたらいきなり300点悪くなってるというようなことはなさそうだ。
これは、「人間の定跡を再評価して、ある程度よいものを自分の定跡にするようにする」という習甦の方法らしい。(要検証)
<追記終わり>
・ソースコード
https://github.com/HiraokaTakuya/apery
Readme.txtにも書かれているように、StockfishとBonanzaを読んでいると大体わかるようになっているっぽい。
個人的にBonanzaの課題であるところは、速度を出すために黒番と白番でコードが書かれていて、ビット定数がハードコーディングされているところだと思っている。ボナンザ解析Blogでも見ないと意味がわからない。
Stockfishのコードは妙にシンプルだと思ったが、チェスの場合Knightですら後ろにいけるので移動方向に区別があるのは、Pawnだけ。
一方で将棋の場合は先手と後手で非対称なため、コードの同一性が難しい。(ハードコーディングされている数値が先手と後手で違う)
この問題は、各ソフトでは以下のようになっている
Bonanza:先手用ルーチンと後手用ルーチンを書く。数値もハードコーディング。
旧やねうら王:YaneLispを作成し、先手用や後手用のルーチンを自動生成(それだけじゃないが)
Apery:C++11以降のテンプレート機能を使用
Colorが手番を表していてBlackのほうが先手、Whiteのほうが後手のはずだが
(GPSFISHが公開されたときも少し話題になっていたが、チェスだと白が先手だが、将棋では黒が先手で表現されるかららしい)、テンプレート関数でColorがある場合は、先手と後手で違うコードを生成していると思って良い。最近のC++はテンプレートからさらに定数がコンパイル時に決定されるようになっているので、より意味がわかりやすいコードが書けるようになっている。
inFrontMaskなんかはいい例で、Bonanzaではマジックナンバーだったが、それをコンパイラに自動生成させている。templateの部分を引数にすれば普通のコードとしても成り立っている。
VisualStudio 2013の段階ではC++のテンプレートに使える引数に制約が多いため、ビルドが通らない。StockfishではC++11とそうでないコードを用意しているぐらいだが、将来的にVisualStudioがC++11に対応しなかったらどうするんだろうか。
また、学習においてBonanzaではfuncなのが、sigmoidになってたりとか、よりわかりやすい。ただ、個人的にはsigmoidではなくて、Tに相当する何かにしてその中にインラインでsigmoidとかのほうが、より学術的ではないかなと思ったりもする。そうすると元々のfunc自体も別に悪くないのかとか思ったりもする。
学習は多分NDFっぽいことはやってるはずだが、見ていない。Bonanza Methodと同等の構造になってることは確認した。
<追記>
本格的に学習ルーチンを使うのは2015年以降のようだ。
チーム開発する上で、Bonanza改造したほうが手軽なので、それをApery型にしていたようだ。
<追記終わり>
・最終的なパラメータ更新は向きしか考慮しないのがBonanza Methodなので、定数項をかけないようにして、学習の効率化を図ろうとしたようだが、やめている。(理由は不明)
・並列化するべきところとそうでないところについてのコメントが書いてあった。
・FV_WINDOWの数字が変えてあった。
Bonanza Method以外の方法としてgps将棋やBlunderが採用した関数(ロジスティック回帰の対数をとったもの?)にしていたりとかはやっていないようだ。
ロジスティック回帰の関数の性質を考えると、BlunderやGPSや(なのはも?)この方法のほうが良い成果がえられるのかもしれない。
あと、Aperyのソースコード本体よりも、棋譜からBook作るRubyスクリプトのほうも興味深い。(WSCS常連はやってて当然かもしれないが)新規とかの人はかなり参考になりそう。特にAperyはやねうら定跡の富岡流?にはまった過去があるので、このスクリプトには思い入れがあるのではなかろうか。
また、ついでにやってるかどうかはわからないが、Bookの評価値や勝率などを設定している点も興味深い。gpsfishでは、自分が300点悪いと思ってるほうに突っ込むというアホな序盤力があるが、定跡であっても評価値を入れることで自分の好きな形成に入るようになっている。逆にこのことによって、戦型が絞られすぎてしまうので、電王戦FINALでは振り飛車を解禁したのだろう。が、裏目に出てしまったようだ。(というと四間飛車=悪いみたいな話になってしまうが)
序盤は今でも課題だと思われる。PonanzaはUCTで序盤生成を半年ぐらい前にやって、秘策3二金を編み出した(が、Floodgateでその秘策が出ていたようで、Awakeの巨瀬さんはその一局を見逃さず、対策を入れていた)
・終盤
終盤にgpsfishにひっくり返されるという話が2chにあった。十数手の詰みを読みきれなかったとか。終盤力だけでいうと、Bonanza>gpsfish>Aperyのような気がしている。特にBonanzaは詰みっぽいほうに突っ込む傾向が強い。勝率という点だけで見ると、中盤でNPSが出たほうが良いのでAperyのほうが強いのだが、Stockfishに普通にKPP型の評価関数を乗せるとどうしても終盤弱くなるので、工夫の余地はあると思うが、それは素人考えか。
gpsfishでは一定局面ごとにdfpnを呼び出すようになっている。これは、クラスタのセカンダリ以降で使われることを考慮しているためで、対局用としてはチューニングする余地はありそうな気はしている。
アイデアとして、終盤の詰み発見が遅いのがbonafish型の弱点なので、相矢倉などの居飛車系にして入玉を含みにして、DFPNが動くようにすると大会などでは逆転模様になりやすいのではないだろうか。
<追記>
電王戦FINAL,第2局の終盤について、Ponanzaの山本さんがTweetしてたが、三手ぐらい前の局面で1六角が危険だと察知するようだ。何をやったらそうなるのかは大変興味ある。こういうのは評価関数の精度をあげるしかないようなことは前に言ってたがどうなんだろうか。
84手目の局面で34秒考えると、▲13角成に△16角打でまずいと気がつくようです。 そこで方針を転換して、▲18香と戦おうとしますが・・
※13角成は13歩成の間違いだと思われる
例えば5960Xで探索しているとして、34秒*2で68秒のときに、どうなるかというのは、これからWSCS出る人にはテストパターンとしてはいいかもしれない。
程度の差はあれ、最初に13歩成を読んで、ある程度たってから1八香でその時点は100~300程度の点数というのが、どのソフトでもあるような傾向のようである。
2015-03-20 17:25
nice!(1)
コメント(0)
トラックバック(0)
コメント 0