SSブログ

棋譜からの学習、再考 [将棋]

結構前だが、Bonanza 6.0の学習ルーチンを動かすだけ動かしてみようと思ったことがあった。
なんでそう思ったのかは今となっては思い出せないが、きっとLS3600さんのBlogを見ていたのだと思う。

で、保木さんから聞いたと言われる方式を前にやってみたのである。

learn ini 32 -1 -1 8 8


学習は2つのPhaseにわかれている

・Phase1
 棋譜から学習するべきデータを作る
 その際に探索も行い、PVリストを作成しtmp.binに保存される

・Phase2
 Phase1で作成されたtmp.binを元に、評価関数のパラメータを変化させる
 全部終わったら、ペナルティで補正をかける
 元の評価関数に展開する

ループの時はPhase1に戻る

という動きをするが、Phase2のときに、1スレッド当たり300MBぐらい消費する。(FV.BINのサイズ)
並列で処理するために、保木さんのコマンドである8を指定すると、300*8で2GB以上確保しようとするが、処理系によってはメモリ確保エラーで落ちてしまう。

というのをまとめるのが面倒で、Tweetしてたら、本家にメモられていたw

http://d.hatena.ne.jp/LS3600/20091130/p1

なんか見覚えあるななんて思ってたら、自分だった。

というわけで、急に思い出したので、1000局ほど学習させてみた
一局でした。

  Iteration 001
  Parse 1  done
   Number of Games : 1
   Total Moves     : 10919
   Moves Counted   : 1366
   Illegal Moves   : 0
   Nodes Searched  : 914644
   Max pos_buf     : 1801
   Prediction ()  : 32.17 57.39 70.43 78.26 84.35 88.70 92.17 92.17
   Target          : 0.030882 (0.004179)
   Futility        : misc=385 drop=236 cap=675 mt=1000 misc(k)=672 cap(k)=680
  Parse 2
   Moves Counted   : 1366
   Objective Func. : 515.61111712 0.03088198 515.58023514
   Steps ................................ done


1000局ぐらいだとあっという間におわってしまった。 あんまり早く終わったので用意したデータが悪いのかもしれない。 プロファイラで見てみると、学習後の再展開処理が4割を占めるという、あまり意味のない学習だった。 あんまり一瞬で終わったので、これがんばって4万局ぐらい集めて学習すれば俺も作れるようになるんじゃね? と思ったのだが、サーチデプス2のままだったので、3にしたらまた時間かかるのだろう。

Number of Gamesが局数で、1,つまり一局しかやっていなかったので、学習後の再展開ルーチンの負荷のほうが大きかっただけだった。実際再展開はテーブル全部に対して再計算を行うために高コストではあるが、一番負荷が高いのはPhase1の学習時における評価コストであった。

Blunderは開発時は4とかにして学習させていたというのをどっかで見た。
学習時の評価の精度が高ければ高いほどよいのだろうが、時間とマシンパワー(というか金)が必要になる。

それはともかく、Predictionは上記のようになっている。

ここで、やねうら王Blogを思い出した。

http://yaneuraou.yaneu.com/2014/12/18/%E5%B0%86%E6%A3%8B%E3%81%AE%E6%8E%A2%E7%B4%A2%E7%A9%BA%E9%96%93%E3%81%AE%E5%BA%83%E3%81%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

やねうら王では探索をしない場合、プロの棋譜との指し手一致率は、以下のようになっています。

Prediction(%) = 43.5828, 64.8331, 75.9408, 82.7774, 87.3075, 90.4403, 92.6531, 94.2629, 95.4584, 96.3543, 97.0501, 97.5901


Bonanzaの一致率と比較していいと仮定する。
Stockfishでは3手ぐらいまでの有望な手でカットが始まることを考えると
最初の3つの%が深い探索に影響をあたえると思われる。

前々から人間でいう「一目」がここら変のことだと勝手に思っているのだが
一致率で見てみると、10%~5%ぐらい差がある

また、深く読んでもBonanzaはやねうら王に比べて5%は多くミスをするということであり、
100手で決着がついたとしてその半分の5%=2、3手は悪手を挿すことになる。

これがレーティング200以上の差と考えてよいのだろうか。
Nozomiの棋譜をちょっと確認してみたが、評価値そのものはBonanzaのもののようで、まじめにBonafish作ればR2800ぐらいになるだろうということがわかった。

そこからR200以上上乗せするには評価関数そのものの精度を上げる必要がある。
というのが今の結論なのだが・・・

http://yaneuraou.yaneu.com/2014/12/23/kpp%E3%81%A7%E3%81%AF%E5%B7%A6%E5%8F%B3%E3%81%AE%E5%AF%BE%E7%A7%B0%E6%80%A7%E3%82%92%E8%80%83%E6%85%AE%E3%81%99%E3%82%8B%E3%81%A8%E5%BC%B1%E3%81%8F%E3%81%AA%E3%82%8B%EF%BC%81%EF%BC%9F/

これによるとNDFのKPP相対をやねうら王では採用していて、8コアマシンで収束に一ヶ月かかるようだ

この間のツイートでAperyの平岡さんは12月の電気代が8000円だったという。
一人暮らしでかつ家にほとんどいない風なので、8000円はほぼ5960Xの電気代だろう。

家族がいるPonanzaの山本さんは3万円だったという。
家に人がいると暖房を使うので、それだけで1万円ぐらいはあるとしても2万円分ぐらいは電気代だろうか。

<追記>
すでにLS3600の2009年のエントリにも同じことが書かれている。
また、なのはのかずさんの試算によれば月3000円はかかるとのこと。
<追記終わり>

というのがあって、此処から先は覚悟がある人の領域なので現状はやる気が起きていない。
左右対称KPP相対とか、いろいろ試してみたいのだが・・・

<追記>
左右対称は元からありまぁす
これについては後日書く。

Stockfishは新しいほど(将棋用としては)弱いっぽい [将棋]

平岡 拓也@HiraokaTakuya 17分前
昨年はMoveを16bitにすれば弱くなり、SEEを正しく計算すれば弱くなり、bitboardの成り駒を他の駒とまとめると遅くなり、Stockfishの成果を取り込めば弱くなり、全然コードが綺麗にならずレガシー感だけが高まってきた。今年は綺麗にしたい。


最新版を取り込むと弱くなるというのは、強豪ソフト開発者2人目(やねうら王のやねうらおさん、Aperyの平岡さん)。Seleneの西海枝さんは、一昨年ぐらいのバージョンが弱かったと書かれていた(ので3あたりか)

コミットログを見てた記憶では、2、3~4ぐらいまではバグ修正、DDは大会用に無理やりバージョニング、5あたりになると、何かの統計をとった結果として探索パラメータなどが変更される(ような記憶)。
最新版ほどチェスに最適化されていて、将棋には合わなくなっていると予想。

本来は1000局以上対局してStockfishメソッドでパラメータ調整したほうがよいのかもしれない。

ということを考えると、なのはMiniが、GPSですでに成果が出ている2.1をベースで作ったのは正解であったように思う。(そのかわりMultiPVが殺されてるが)

一方でAperyは3に平岡さんの修正コミットがあったぐらいだから、3以上だろうし
やねうら王はBlogの記事読む限りDDベースであろうということから、強豪=DDベース
という可能性もある。(Seleneも時期的にDDだったような)

個人的には新しいソースほどコメントや関数名などが
わかりやすくなってたりするので、読むなら新しいほうだとは思う。
そういう意味ではDDあたりがちょうどよいのかもしれない。
(新しいほうがさらに英語がわかりやすくなっていたとはやねうら王Blogに書いてあったが
2.1のコメントやコードはそれぐらい自分にはわかりにくい)

ただ、2.1->2.2ですでに弱くなったコミットを発見したこともあるので
なのはMiniの2.1採用がいい結果を生むことを期待したい。
(というか参考サイトにこのBlogが入っていることに気がついたので頑張ってもらいたい)

と、思う一方で、DDなどで弱く感じたのは評価関数の質の問題ではないかという疑念があり
人間で言う一目の手筋の精度が高いとDDでも十分強いのではという推測もしてたりする・・・

NanohaMini 0.2.1.1で時間制限なし検討が動かない [将棋]

diff --git a/src/search.cpp b/src/search.cpp
index f14b856..be20a3a 100644
--- a/src/search.cpp
+++ b/src/search.cpp
@@ -2397,7 +2397,7 @@ split_point_start: // At split points actual search starts from here
                                 || stillAtFirstMove;

 #if defined(NANOHA)
-               if (!Limits.maxDepth) {
+               if (!Limits.maxDepth && !Limits.infinite) {
                        if ((   noMoreTime
                            && (!Limits.maxTime || t >= Limits.maxTime))
                            || (Limits.maxNodes && pos.nodes_searched() >= Limits.maxNodes))


上記のように修正しないと
検討モード時に送られてくる「go infinite」フラグを見ていないので常に3秒ぐらいで打ち切ってしまう

そもそもなんで独自制御にしてるのか不思議に思っていたが
作者のかずさんによると「持ち時間+秒読み」対応らしい。

そういや、byoyomiってUSI独自仕様だったなと思いだした。

http://www.geocities.jp/shogidokoro/usi.html

byoyomi 

これはUSIの原案にはありませんが、将棋特有の秒読みに対応するために追加しました。単位はミリ秒です。先手と後手で秒読みの時間が違うということは想定していないので、どちらにも共通の値となります。
btime, wtime, byoyomiを使って、残り時間と秒読み時間を指定することができます。先手の残り時間が60秒、後手の残り時間が50秒、秒読みが10秒であれば、

go btime 60000 wtime 50000 byoyomi 10000

というようになります。


StockfishのTimeMgrは時間に2種類あると思っていないので、ここらへんも改良ポイントにはなりそう。

boNanoha ≒ bonafish なのか [将棋]

今ガチ勢になろうとしたら、まずはbonafish(bonanza + stockfish)作るところみたいな話がある。
評価関数入れ替えるだけじゃないかなんて思うのだが

・USI処理
・Board Representation
・指し手生成

を全部変える必要がある。
実際本家の差分として作られているGPSでも200箇所ぐらいマクロがあるので
それぐらい余裕だろなんて人は情熱がある人だと思っている(自分はそこまではやる気がしない)

そんなときになのはMiniが公開された。

なのはMiniはぱっと斜め読みしたところ

・探索はStockfishベース
・評価関数部分がbonanza風

となっていて、結構簡単に入れ替わるんじゃないかななんて思ってたら、
誰かもそう思ってたようで即効でboNanohaなるソフトがfloodgateに登場した。

そんな簡単にできるなら俺にもできるだろうと思ってやってみた。

・この間までFV38対応と3次元化したので、それをそのまま使う
・差分計算はとりあえずパス
・make_listはなのはの実装にタダ乗りして純粋にfv(38).binの評価値を返す

とちょっとだけチューンしたバージョンを作成した。
なのはMiniはデバッグビルドでエラーが起きるとか、
ソースも読まずに実装してたら駒割りの正負が逆だったのを発見するとか
初期化忘れた変数使ってたとかの苦難を乗り越えて無事動作

<追記>
他のことやりながら適当に実装してたので、デバッグビルド意外は自分のミス。
あと、quitで終了するとサーチのidle_loopで例外エラーが出るのでそれも修正した。
exitでなぜか0番のスレッドだけ停止処理を動かさずにリソースを開放している。
<追記終わり>

早速動かしてみると、NPSがbonanzaの2倍近く出てきてびっくりする。
(Bonanza 6.0 120万のとき boNanoha 240万前後)
差分評価がないので、むしろ遅いぐらいなのでカウント方法が違うんだと思う。
(すごい昔(2009年頃?)LS3600さんのBlogにも似たようなことが書かれていた)

また、探索の深さも表記が違うのでどう捉えていいかがわからない。Bonanzaは深く読んでいってダメだと手戻りするので14の後11が出てくるみたいなことがあるが、Stockfishはご丁寧に選択探索の深さまで出てくる。
bonanzaの探索深さが11のとき、boNanohaも11/20ぐらいなので実質的にほとんど同じであると思われる。

定跡はよくわからないが、開幕直後に500点近くついていたのがあったので、要調整かもしれない。
(GPSfishも抜けた途端に300点ついてるときがあるのでなんともいえないが)

実際に強いのかというとちょっと微妙だった。
というか、探索深さがBonanzaとほとんど同じなので、かろうじて強いかなー程度の差・・・

なんて思っていたが、100戦やってみたところ71-2-27。
ただ、本当に強くなってるのかはかなり疑問。

floodgateにいるboNanohaはあまりレーティングが伸びていない

bonanza6     R2533
boNanoha     R2590
nozomi_i7-4790 R2841 ※参考

今回の結果だけ見るとbonanza以上Nozomi未満あたりの結果だろうと思うが、伸び悩んでいる。
PCの性能もあるので本当のところはわからないが、評価値見てるとそんなに強そうに見えない。
ただ、傾向が確実に変わった。

・FV38とStockfishの枝刈りのせいか、中盤の拮抗した状態から良くなる手順を選びやすい
・逆に終盤力が確実に劣り、大逆転負けをしやすい
 たまたまFloodgateでbonanza vs boNanohaをやっていたが、boNanohaも盛大に逆転負けを食らっていた

差分評価を実装していないのでStockfish探索の傾向とFV38を組み合わせたのは偶然とはいえ成功だったかもしれない。また、差分評価がなく評価関数が遅いのに少し強いぐらいなので、ガチでビットボードも移植すればもっと強くなる気はする。

LS3600さんのサイトかどこかに書かれていたが
終盤力にチューニングしすぎると強さの指標としては見誤ることになるということだろうか。
終盤力がないので素人的には弱いように思えてしまうのだが・・・

なのでfloodgateにいるboNanohaは妥当な強さではあるが、
bonafish本来の限界値にはまだ差ががあると思われる。

<追記>
・GPSFISHではDFPNがあった場所に1手詰め、3手詰めが入っている。どの程度動いているかは不明。
・なのは独自修正により、検討モードが動作しないのを発見(infiniteオプションが動作しなくなっている)

NanohaMini vs GPSfish [将棋]

2chにNanohaMiniがGPSFishに圧勝しているというような棋譜が貼ってあり、なんでも10回に1,2回は勝てるらしい

386 名前:名無し名人[sage] 投稿日:2015/01/02(金) 17:52:17.19 ID:SkASjRv8
なのはminiが圧勝したのですが、うちのGPSfishの設定がよくないのでしょうか?

先手:GPSfish 0.2.1+r2837 gcc 4.6.3 osl wordsize 32 gcc 4.6.3
後手:NanohaMini 0.2.1.1

▲7六歩 △3四歩 ▲2六歩 △5四歩 ▲2五歩 △5二飛
▲7八金 △5五歩 ▲2四歩 △同 歩 ▲同 飛 △5六歩
▲同 歩 △同 飛 ▲6九玉 △3二金 ▲4八銀 △6二玉
▲6六歩 △7二玉 ▲6八銀 △4二銀 ▲5八金 △5一飛
▲6七金右 △4四角 ▲4六歩 △2六歩 ▲3六歩 △3三銀
▲2五飛 △2二銀 ▲2八歩 △5五歩 ▲3五歩 △同 角
▲3六歩 △6二角 ▲6五歩 △3三桂 ▲1五飛 △4四角
▲4五歩 △6二角 ▲4四歩 △同 角 ▲6六金 △1四歩
▲5五飛 △同 角 ▲同 金 △4九飛 ▲5九銀右 △2九飛成
▲6四歩 △同 歩 ▲5四歩 △1九龍 ▲6四金 △6三歩
▲6五金 △5八歩 ▲同 玉 △5六香 ▲6七玉 △5九香成
▲5三歩成 △1七龍 ▲6六玉 △5三飛 ▲5四歩 △5一飛
▲7五歩 △5八成香 ▲6七銀 △5七銀 ▲7六玉 △6八銀成
▲8五角 △7八成銀 ▲同 銀 △9五金 ▲6三角成 △同 玉
▲6四歩 △7二玉 ▲6六金 △8四桂 ▲6五玉 △4七角
▲5六銀 △3六角成 ▲5五金 △5七成香 ▲7四歩 △5六成香
▲6三歩成 △同 玉 ▲6四歩 △7二玉 ▲6三歩成 △同 玉
▲6四金 △7二玉 ▲2七歩 △1五龍 ▲5六玉 △4五龍
▲6七玉 △4七龍 ▲5七香 △4五馬 ▲6六玉 △3六龍
▲5六香 △同 龍 ▲7七玉 △5七龍 ▲6七銀 △同 龍
まで120手で後手の勝ち

388 名前:名無し名人[sage] 投稿日:2015/01/02(金) 18:17:00.63 ID:ySF5dpcU
>>386
うちのなのはminiも10回に1~2回はGPSFishに勝つ。0.21じゃなく0.05の方だが。
それ以上極端に勝つようならGPS側の設定が悪いのだろう。ただ単になのはが勝つだけなら普通にある。


0.05ってなんだろうか。
それはともかく、SoghiGUIを使って、3秒解析で一致率でみると先手50%、後手80%だったが、要所で手が違う。

自分が適当に試した時はGPSの10-0だったので、まあそりゃそうだなと思っていたのだが、改めて確率的にどうなのか調べてみた。

そもそも、本家で公開されているバージョンはいい加減更新してほしいと思うのだが、あまりに遅い。
いろんな環境で動くようにしているのもわかるのだが・・・

複数のGPSバージョンが入っているうちの環境では何かの手違いが発生する可能性があるので、データがローカルにあるShogiGUIバージョンで試してみた。

https://sites.google.com/site/shogixyz/home/gpsfish


・使用ソフト
 NanohaMini 0.2.1
 GPSfish 0.2.1+r2837 gcc 4.8.1 osl wordsize 32 gcc 4.8.1 64bit (ShogiGUI付属)

・条件
 4スレッド
 1秒
 200手でドロー

こういうのは1秒のほうが出やすいとの本能が告げているので1秒でやってみた

・結果
 15-2-83

見事に一致

Core i7 4770@3.4GHzだったので、1秒だが、一般人が通常使うようなノートPCの場合、ごついCore i5ノートなら2コア、3GHz程度、薄型ノートならCore i7でも2.xGHzなので3秒~10秒ぐらいでも同等の結果だと思われる。
1秒なら、もっとNanohaの勝率は高くなるかもしれない。

ちなみに1コアあたりのNPSで比較すると

・やねうら王(駒得のみ)     100万NPS以上 ※不明
・NanohaMini(KP+PP)    80万NPS ※確かPGOビルド
・Bonanza(KKP+KPP)     35万NPS ※64bit SSE2
・GPSfish(いろいろ)       15万NPS ※ShogiGUI梱包
・Blunder(DANGEROUS)(?) 15万NPS ※配布版AVXビルド

となっていて、評価因子が少ないほど速いという当たり前の状況になっている。
逆に中途局面の評価の正確性は、下に行くほど正確で、一般的には下のほうが強い

また、ビルド方法によっても速度差が出てくる。

・GPSfishone(いろいろ)     17万NPS ※ShogiGUIページからダウンロード
・GPSfish(いろいろ)       15万NPS ※ShogiGUI梱包
・GPSfish(いろいろ)       11万NPS ※公式ビルド 32bit gcc 4.6.3


公式配布版は4.6.xを使っていて、あまり最適化がよろしくない。
gccはCLANGという別のコンパイラが台頭してきて、まじめにやるきになったのが4.8.xなので4.8.x使ったほうが良いと思っている。

GPSfishのソースにはGPSFISHONEビルドという隠し技を持っていて、ソースを全部ヘッダに入れてビルドするという荒業によってコンパイラに最適化を促し、5%~1割の最適化をさせる。
そうするとNPSが1割程度増えるのだが、探索深さが1,2手ぐらい上回る。これによって棋力向上があるかはよくわからない。

将棋の場合、いくらよんでもわからない場合と時間を書けたほうが良い場合があるので、速度と時間のかけかたが重要になるので、時間制御が入った10分切れ負け条件のほうが本当はよいかもしれない。

やねうらおさんもよく言われているが、強さはPCのスペックがモロ影響するので、GPSがちょっと物足りないという人はshogiGUIのほうのgpsfishoneを入れると少し強くなるかもしれない。

<追記>
NanohaMiniのソース見てたところ、KKPだけだと思ってたが、KP+PPになっていた。
KPPよりは精度は落ちるだろうが、軽量化でたくさん読めるのでトータルとして1割勝てるのも納得した。

将棋電王戦リベンジマッチ 森下卓九段 vs ツツカナ [将棋]

3時過ぎに寝落ちして、もうあまり覚えていないが雑感

「継ぎ盤ありなら10冠」という森下九段の発言をうけてエキシビジョンマッチ
持ち時間両者3時間、秒読み10分

・序盤は互角ではあるが、後手番ということもあり、主導権が握れない展開(当然といえば当然だが)
 相矢倉になった。森下九段は序盤は比較的しゃべりながらやっていて、練習で横歩取りになるとあまりよろしくないようなことをいっていたがうろ覚え。

・ツツカナも盛大に時間を使う設定になっていて、3時間の持ち時間はほぼ同等の消費量であっという間に無くなった
・10分の持ち時間がかなり変則的で、Ponder Hitしないとツツカナも10分フルに考えるため、1時間に6手程度しか進まない。
 ここらへんはソフトの作者の作り込み次第次第だろうが、それ以外のところを作るので手一杯なのが現状のような気はする。大体コンピュータ同士の短時間と人との長時間で調整するというのも結構めんどくさそう。しかもレーティングには影響しないだろうし。
 
・休憩も通常の対局ではほどよく入っていたと思うが、指し手が進まない上に休憩30分があることでさらにスローペース。
・しばらくツツカナ側の評価値が高まってたので、途中で寝ようかと思った。

・ツツカナについて
 読み筋と実際に指した手が違うことがしょっちゅうあった。システムの問題なのかどうかがよくわからない。
 最新のGalleriaに使われているCore i7 5880Xはコアクロックガ下がってコア数が増えているので、並列度チューニングがより重要だと思うのだが、マシンが去年のモデルとかパフォーマンスが向上してるとかはあったんだろうか。

・△9七銀あたりで(実は)後手優勢?
 評価値でしか形勢がわからないので、9七銀は耐え切れずにぶっ放したようにしか見えなかった。
 ニコ生でも終わった的な発言が多かった。(ツツカナもいきなり跳ね上がったので)
 が、そこからの受け損なったのかよくわからないが、▲9四歩で明確に逆転模様になった。
 そもそも、ここまでの流れはGPSFishはこの局面はツツカナと大幅に評価値が違う上に、9七銀は5番目の候補手で深く読むときは真っ先にカットされるたため、悪手と判断。ツツカナも全然考えてなかった手に見えた。
 Blunderで評価してみると一発で9七銀が候補に出てきてるのだが、深く読むと5五龍になってしまっていた。
 ツツカナは穴熊の9九玉の位置にいると点が異常に高くなると聞いたが、矢倉でよくある8八玉の点数も高いのかなぁと思った。いわゆるドーピングでチューニングしてたところに9七銀が成立したところに盲点があったのかなぁとか。推測でしか無いけど。

・ソフトごとの形勢グラフ

denou3.3.png

 試しに3ソフトでそれぞれ一手3秒ずつ解析してみたところ
 一番上がGPSFishで先手に跳ね上がった手が9七銀、急激に下がった手が▲9四歩、同香で少し盛り返して、5四角で一気に下がった。
 Blunderの場合、それほど先手がよいとも判断していないが、竜に追われて移動した▲5九飛、△2五銀で形成互角、やはり▲9四歩で悪くなったと判断。
 Bonanzaも似たような感じ。

Ponaxがどうなのか気になるところ。

・ルール
 時間が足りないので中断というのは、朝5時まで見てた人には不評だろう。
 ただ、途中解説も無くなった上に、あとは全駒するような展開になりそうだったので、かなりの人が寝落ちしたようだったが、自分も寝落ちした。
 アンケートも1が60%と低かった。将棋の内容的に80%は堅かったと思うので、中断に不満だった層が2に入れたと思われる。2は20%ぐらいだったので、1,2合わせれば80%ぐらいは満足という感じではあるが。
 そもそも佐藤康光九段がさらっと計算して、終わるのが20時間後ぐらいですかと言っていたが、コンピュータは設定しないと投げないものだし、最初から最悪時間決めて決着がつかなかったら引き分けのFloodgate方式でも良かったと思う。西尾六段によれば当初は秒読み15分だったらしいので、10分にしたのは悪い中ではマシなルールだったといえる。

 人間同士の休憩時間ルールだと、あまりクリティカルなところで相手に手番を渡さないとかで時間の使い方のテクニックみたいなのがあると思うのだが、普段休憩なんて無いコンピュータと人間で戦うと実質的に人間が考える時間が増えているので、これにたいしても何かしらのアナウンスはあってもいいかなぁとは思う。途中で休憩時間直前にPonder Hitしたツツカナが1秒指ししたのも、運が味方したかもしれない。

電王戦タッグマッチはプロ同士しかわからないような感じだったが、今回は進行が遅かったので素人には優しかった。ただ、森下九段が比較的率直に話すのが面白かった面はかなりあるので、今後続くのは考えにくいかなぁと思った。

<追記>

 元々「ミスがない人間のほうがコンピュータよりは強い」という主張の検証が発端だったので、その点に関しては最低限のハードルはクリアーしたと思う。一方で、本当に勝ち切れたかどうかはまた疑問で、あの必勝の場面から100手(16時間)ぐらいさして入玉して勝ちを宣言できるのか、明確に詰ますことができるのかというのは、やはりやってみないとわからない。上の評価値を見てもらえるとわかるが、完全にクソ粘りモードに入り、森下九段に明らかに疲れの色が出ているところで評価値が戻っていることを考えると、やっぱり人間にミスが出てしまうのではないかという疑念は残る。

 人間が安定的に勝とうとしたら、継ぎ盤あり、秒読み10分以上の二日制か、駅伝のような多対一でやる必要があるように感じられた。ただ、今回のような展開だと二日目は入玉阻止だけで1日終わるのでニコ生だったら4や5が多そうであり、視聴者的にはうれしくない。多対一はそれこそなりふり構わずという感じなので、心象もよろしくない。人間がそんな無制限にやるんだったら、コンピュータも無制限にクラスタ化してないとというように泥沼化しそうだし・・・

 「コンピュータが今以上に強くなる余地は確実にある」ということだけが確実にわかったことで、継ぎ盤なら勝てるという話については、時間が無制限にあっても先に疲れるので対策が必要ということぐらいだろうか。

ボナンザを改造して強くする方法、どなたか教えて下さい。 [将棋]

たまにコンピュータ将棋スレみてたら面白い書き込みがあったのでメモ。

206 名前:名無し名人[sage] 投稿日:2014/12/28(日) 22:36:32.04 ID:iVcex75m
ボナンザを改造して強くする方法、どなたか教えて下さい。


208 名前:名無し名人[sage] 投稿日:2014/12/28(日) 22:58:27.39 ID:awd2iOZH
>>206
速く動くように改造する。
R50は強くなる。


そんだけかよ!という感じだが、Bonanzaそのままだとそんな感じ。
3秒対戦ぐらいだと、深く読んでもあまり強くない。
あと毎回3秒対戦してるのは、時間制御アルゴリズムの影響を受けないようにするため。

<追記>
なのはの中の人によると2倍早くして+R150という噂があるらしい。
2割アップでもひーこらいってるのにこっから8割アップとか差分指し手生成とかやらんといかんのかという感じ。
ひよこ将棋の作者によればBonanzaでは2倍早くして6割程度らしいのでコンピュータ将棋界では常識的な数字なんだろう。
http://d.hatena.ne.jp/hiyokoshogi/20111208/1323329347

速くして強くするというのは、にわかはやめたほうが良い気がする。

214 名前:名無し名人[sage] 投稿日:2014/12/29(月) 01:29:12.84 ID:p3mWunby
>>206
 ・kpp テーブル配列の3次元化
 ・kppテーブルインデックスリストの差分生成
 ・ヒストリテーブルのglobal化
 ・並列動作の効率向上
 ・evaluate に SSE命令を適用する
 ・stockfish を参考にして探索部分を一部アップデート
 ・三駒関係から利きや相対位置の同じものを共通化して,特徴ベクトルに加えて学習する
 ・手番考慮eval処理を実装


これを書いた人はなかなか詳しいw
最近試したので覚えているうちにどれぐらい効果があるか私感をまとめてみる。

・3次元化
 NDFが最初に取り組んだ内容。
 また、FV38化をすると、FVIndexがソートされていないので、これをやりたくなる。
 (Aperyの平岡さんもそんなことをつぶやいていたような記憶)
 実際これをやると、1割アップする。
 FV38化+3次元化でNPS2割アップ。
 しかしBonanzaの評価値のままだと勝率に影響はないという予測。(あってもR50程度)

<追記>
 実際3秒100戦で戦わせてみたところ、状況によってはNPSが3割アップぐらいの状況で、43-8-49と有意差はなかった。チョットは有意差ある気がするのだが、残り20戦ぐらいのとこで、PC使い始めたため、NPS差があまりでなくなって急に五分五分になった感じ。そもそも速くしなくても遅くした方と戦わせるとか、3秒じゃなくて1秒にするとかいうほうがよほど差が出るし、検証としては確実だとは思う。

・ヒストリテーブルのグローバル化
 よくわからん。
 ハッシュテーブルについては、せっかくマルチスレッドになっているのに、キャッシュが32MB固定しか使ってないのを最近発見したが、これをZobristHashにして数Gとるだけで実は強くなると思ったが、よくみたら似たような実装になってた。
 サイズが可変になってないのだけが問題っぽいし、対戦中は数%ぐらいしか使わない。
 長時間でもないと意味が無いか?

 ・並列動作の効率向上
  よくわからんが、プロファイラでみるとたしかに待ち時間が多い。
  ただ、CPU使用率的には100%に近いのであまり気にしてもしょうがない気がする。

 ・evaluate に SSE命令を適用する
  適用できるところあるか?
  と思ったが、値を全部ロードして加算はSSEにすると効果あるかもしれない。

 ・stockfish を参考にして探索部分を一部アップデート
  Nanoha-miniの評価値の出方を見てると、これは効果あると思う。
  というか、探索だけでなく、ヒストリー管理もセットで変更かけると効果がでるだけでなく、ソースも見やすいし管理しやすくなると思う。
  Bonanzaの探索というかソースコードは結構テクニカルだと思う。(というかコメントが少なすぎる)

 ・三駒関係から利きや相対位置の同じものを共通化して,特徴ベクトルに加えて学習する
  R3000超のために一番効くのがこれだと思われる。
  やねうら王のやねうらおさんも「探索に時間をかけるなら評価関数」という趣旨のことを書かれていた。
  FV38化にあたり、今更評価値を覗いてみると値がついてないように思われる項目がいっぱいある。
  これもNDF由来。
  <追記>
  探索深さと一致率という面白いエントリがあり、具体的な数値が載っている。
  http://yaneuraou.yaneu.com/2014/12/18/%E5%B0%86%E6%A3%8B%E3%81%AE%E6%8E%A2%E7%B4%A2%E7%A9%BA%E9%96%93%E3%81%AE%E5%BA%83%E3%81%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
  GPSのGPWか何かの論文に6割ぐらいしか一致しないというのを見た気がするが、どういう条件かどうかは覚えていない。そもそも、GPSFishとBonanzaを戦わせると遅いGPSFishが勝ち越すし、BitboardやKPPにこだわらなくても成果は出せていた。実際、遅くてもより正確な評価関数があれば2倍遅くても勝ち越せる。(ただ、GPSとBonanzaのNPSが同一かどうかというのもLS3600さんが指摘していた)
 しかし、NDFの相対化や、AwakeのKPAなど、いかに効率よくKPPに点をつけるかというのが去年ぐらいからの風潮で、速さと正確さを両立させたBitboard/KPP陣営が電王トーナメントで勝ち残った。

 ・手番考慮eval処理を実装
  これは2014年の電王トーナメントの段階ではAperyの平岡さんは効果がなかったと諦めたはず。
  しかし、NDFは2,3年前の段階で取り入れていた。
  この違いは上記の学習方法と学習リソースの違いがあるかもしれない。
  NDFの場合、先に手番+強化学習に相対化したのに対して、
  今相対化してから手番学習だと、やる意味があるのかどうかという話がある。
  そもそもFV.binって後手玉中心の計算もしている以上、ある意味で手番考慮してると思われるのだが、勘違いだろうか。
  同型で手番がある方が勝つというようなのを評価できるようになるが、そんなのはごく一部のような。矢倉や角換わりが強くなる一方で計算コストが増大するような。
  やっぱりわからない。

あと、個人的に必要なのは定跡の整備。GPSなんかは明らかに悪くなる定跡がよく出てくる(笑)

思いついたらまた追記する

こんなしょっぱいBlogよりも成果を出されていてためになるやねうら王のサイトはこちら
http://yaneuraou.yaneu.com/


オチ

215 名前:名無し名人[sage] 投稿日:2014/12/29(月) 10:30:09.69 ID:7MBhfJLt >>214 さっぱり分かりません。


<追記>
・BMI2を使う
 LS3600ブログも更新されていて、BMI2を使うべきですね、と煽っていたが、コメント欄を読むと、やってもしかたないかぐらいのトーンダウン。理由は簡単でBMI2が128bitに対応していないため、81bit必要な将棋には使い方を工夫しないといけない。
 そもそも、元のビットマップ、マスクデータ、結果を元に戻すテーブルかマスク、の3つのデータが必要だが
Bonanzaは回転ビットマップ、インデックステーブル、シフトテーブルで処理できてしまっているので、ぱっと見あまり効果がなさそう。
 角や飛の縦横をまとめて処理すれば、仮に時間が同じだとしても2倍の効率化がされると思うが・・・
 あとBonanzaは伝統的なC言語で書かれているため、改造がやりにくい(ということもLS3600さんのBlogにはかかれているが)
 なので、もしBMI2化するのであれば、先にbitboardのクラス化でコードをクリーンアップする必要があるように思う。


bonanza 6.0のfv38化 [将棋]

Aperyの平岡さんが、githubに変換ツールのソースを公開していた。

https://github.com/HiraokaTakuya/fv38

これをみて、やってみようかな~なんて思っていたところに、
Visual Studio 2013 Communityが無料のニュースでやる気が出たのが2ヶ月ぐらい前。

・bonanza 6.0のソースを落としてくる
・一人git作成
・VSでビルドできるようにプロジェクトを作る
・動作確認
 効果があるかはよくわからないが、PGOもできるようにした

というところまでは順調だった。ソースいじってないし。

昔LS3600さんがBonanza解析Blogにいろいろ変数名とかマクロとか説明していたし
そのときにも軽くみていたので、変数の意味や格納法なども大体わかってる。( ー`дー´)キリッ

FV38にすると手駒の格納法が悩ましかった。
Bonanzaは手駒になった瞬間に枚数で格納しているので、
FV38化するときの効率的な保存方法が結局よくわからず。
結局あまり深く考えずに、単に38駒化がちゃんと動くのかどうかを目標にしてみた。

FV38化が成功すると

・52駒評価から38駒評価になることによる主に序盤の高速化
・適当な実装による手駒リスト作成のデメリット

というのが相殺されてちょっとだけよくなるであろうという予測のもとぼちぼちがんばっていた。

ところが、ニコ生のVリーグが大変面白かったので一ヶ月はほとんど進まず。
さらに、実装ミスだけでなくBonanza 6.0の動作確認のために入れたコードがバグってて無駄に時間がかかった。
あと平岡さんの変換コードが、単に変換するだけでなく、KKPの+ー変えるとか、インデックスをKPPに統一するとか、評価関数の実装が容易になるような変更が入っていたのに気がつくのにも時間がかかった。ソースの斜め読みイクナイ。
結局、12月になり、いろんなハマリポイントの修正方針を思いついたことで無事実装完了できた。

早速1コア同士、3秒で戦わせてみると、手駒0が無駄な序盤5~10%速くなることがある程度の速さだった。
終盤は逆に遅い。手駒のリスト生成は相当うまくやらないといけない感。

FV38化されたbinファイル(fv38.bin)を使えるようにしただけなので、こんなもんだろう。

VS2013コミュニティのパワーでボトルネック解析できないのかと思ったが、未だにどうやればいいのかよくわからない。どうもbonanza 6.0の常套手段であるファイルからのリダイレクトをプロファイル使用時に受け付けてくれない模様。

でもFV38化をやることで、差分評価の理解度は増した(今更)

第2回 将棋電王トーナメント 決勝トーナメント最終日 決勝・準決勝 [将棋]

昨日はでかけていて、あまり見れなかったが大体順当な結果だった
今日は昨日の影響でダウンしていたので流し見だったが、最後のPonanza-Awakeで目が覚めた

いやー、中段玉で何を間違ったんだろうか。
学習しづらい局面はPonanzaぐらい学習をやってても何かあるんだろうか。

・AwakeはKPPならぬKPAを導入しているらしいが、KPAってなんだろう。効きだろうか。
・大会前にFloogdateに参加して安定度を検証。しかもマシンも電王戦モデル。
・FloodgateのPonanzaのログに2手目32金が定跡に入っていたので対策はしていた

とかなりの気合の入れよう。

昨年5位になれなかったAperyも初手は2五歩だけはやって振り飛車にならないようにしていたらしい。
横歩模様からの力戦の将棋が多かったのはそういう理由だろう。

Awakeは去年よりレーティングが500あがったという。
Ponanzaでも150ぐらいあがっていたらしい。

今回の大会はちゃんと見ていないが、ほぼBonanzaのクジラちゃんやほぼBonafishのnozimiがいたことから強さの度合いがわかりやすかった気はする。去年はBonanzaそのままがいたんだが。

Awake、Ponanza>Apery、やねうら王>Selene>Bonafish>Bonanza

「>」1つがR100~200ぐらいだろうか。

上げ方

・高速化
 Bonanzaの評価関数がそのままだとしても、高速化する余地がまだあるらしい
 37項目化とか
 PonanzaはMagicBitboardが初期の基本思想だった。(今はどうかしらないが)

・評価関数
 項目数の増加
・評価関数の学習時の相対評価
 別の見方をすると次元を減らすことに繋がるので結果として高速化にもなる(やり方しだいだが)
 今年レーティングが激しく上がった理由はNDFがこれによってすごい強かったからではなかろうか。
 相対によって棋譜が少ない局面での安定性が上がったため、力戦でもぽかしにくくなったような気がする。

・定跡の選択
 振り飛車の勝率は悪いのでAperyは初手は26歩らしい
 いい勝ち方をした場合はそれを記録しておく(やねうら定跡)

・探索
 Stockfishは最低限。ただ、自分の調査およびやねうらおのBlogからも、最新版は弱い。Seleneの人も一時期(2012年ごろ、Ver.3~4ぐらい?)は弱かったと言っていた。
 今回のAwakeは2分ぐらいで56までいっていたらしい。5960Xを使っていたとはいえすごい数字。
 電王戦のときは他のソフトが選択探索30ぐらいのときにツツカナが40ぐらいですげぇなと思っていたが、それをうわ待っている。やねうら王が40ぐらいらしく、深く読みが入ると斬り合いで負けたらしい
 この選択探索にヒットするような調整というのが上位ソフトはどれもやっているように思うのだが、単に学習時にうまく調整できているのだろうか。


しかし、去年より強くできなかったという習甦がここに来て敗退とか、インフレがすさまじい。
去年の電王戦は対コンピュータなYSSだけが穴を点かれて負けたが、もう今年は誰も勝てない気がする。

<追記>
・KPAのAはAttackで効きだった。Aperyの人はEffectでKPEのほうがよいと主張していたが、やねうらおBlogではKPAのままだったので、そのままKPAが流行りそうな予感
・やねうらおBlogによるとSeleneの人が作った評価関数の高速化がされていないBonafishにSeleneは6割ぐらい勝てるらしいので、強さ比較は概ねあっていたといえるだろう。
・Aperyの人が居飛車しかやらないと対策されるので、振り飛車もがんばるようなことをTwitterで言っていた。期待したいが、やねうらお流で「やっぱ勝率のでやめました」とか言い出しそうな気はしている(笑)
・やねうらおBlogの情報ばっかりだが、5960Xは4771よりも2割遅いらしい。100万nps -> 80万npsだったようだ。コア数がその分多いので、電王戦トーナメントではより並列度でスケールするようなプログラムが有利であったと思われる。ますますStockfish全盛であったのかと思う。
・PonanzaのAkiさんのBlogがプライベートモードになった。はてなにBlog持ってる人は飽きてくるとプライベートモードにする印象。数少ないコンピュータ将棋の知見が部分的にでもわかるBlogだったのに残念である。
・Floodgateにいた謎のTestもAWAKEだった。


公式放送 第2回 将棋電王トーナメント 予選リーグ [将棋]

最近はあまり情熱もなく、流し見視聴。


・やねうら王
 「やれるならすごい」とTwitterでもつぶやいたと思うが、少なくとも未来定跡は切られてしまった。
 他のものも本当にやれるんだったらすごいんだけどっていう部分をどこまでやったのか。
 大体「コンピュータ将棋の技術を使わない」ってどういう意味かと思ったが、Stockfishは使うっていうのでずっこけた。ほとんどの主要技術はチェスのchessprogramming Wiki に書いてあって、それと同じようなのがなんでコンピュータ将棋には無いのかという意味で、考え方そのものは彼の言うことには同感である。それっぽいのはみんな山下さんのHPに行き着いちゃうし・・・
 結果として、アウトプットが結局なんなんだよっていうところがもにょる。ドワンゴ的には絵面的に面白いのだろうが、結果には大変不満であった。

・Selene
 本業が忙しく、やろうとしていたことができなかった模様
 TwitterではBonafishを投入して強さを測った後、地下へ潜るようなことを言っていたが、結局「何か」は生まれなかった。
 今回やねうら王が結果的にやったような、半端なハイブリッドな強化学習はSeleneがやっているし、最近はPonanzaやAperyもこっそりやっているような気がする。Aperyはあまり結果が思わしくなかったようだが。

・Calamity
 予選突破するとは思わなかった。
 ただ、短時間だからこそ入る一発なので、長時間は普通に圧殺されるであろう。

・nozomi
 bonanza+stockfishそのままという話だった。なんだよそれ。しかも予選突破しちゃうっていうね。
 まあ、本人もベンチマーク的な意味合いがあるようなことを言ってた。
 載せ替えてそんな簡単に結果出ちゃうの?っていうのはやねうらおの言わんとする所だとは思う。

・大合神くじらちゃん
 クラスタがメインなので電王戦ルールだとただのBonanza
 そういう意味では遅くなったBonanza 6.0が仮に出場したらというベンチマーク的な意味合いがあったと思われる

・激指
 ぼくがかんがえる強豪になる条件である、「5960Xを使ったことに見合った強さ」になることというのが激指はできていないのではないかと予想していた。販売されているものと同じということで、中身も古臭いという話だった。Bonanzaもそうだが、あまり職人技が入りこむと逆にパフォーマンスが出なくなってCPUがパワーアップしたときに逆に足かせになる場合がある。やねうらおがコンピュータ将棋の技術に否定的なのはそういう意味もあると思う。

・習甦
 相変わらず短時間が弱い。しかし明日、明後日と読む時間が長くなるので今日よりは確実に強くなることが予想される。

・AWAKE
 終盤受けすぎて千日手だったりしてるような感がある。棋風だろうか。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。