自分で自分好みの評価関数を作って遊んでみたいという人のために『Shivoray』(シボレー)という全自動雑巾絞り機を公開しました。
内容はただのバッチファイルとやねうら王の実行ファイル(OpenMP有効)とやねうら王の標準定跡ファイル + リゼロ評価関数epoch0(すべてのパラメーターがゼロである評価関数)のセットなんですけども。
やねうら王のGitHubのトップページの『Shivoray』のところからダウンロード出来るので興味のある人は、遊んでみてください。解凍するとreadme.txtがあるので詳しい内容はそちらをどうぞ。
このバッチファイルは1回限りの学習ですが、無限に回すには、元の評価関数フォルダに上書きで評価関数ファイルを書き出すように変更して、goto命令で永久ループになるようにしておけば良いかと。
1 2 3 4 |
:loop YaneuraOuV471learn.exe threads 8 , hash 128 , bookmoves 32 , bookfile standard_book.db , evaldir eval_zero_epoch0 , gensfen depth 3 loop 100000000 eval_limit 32000 output_file_name generated_sfens.bin , quit YaneuraOuV471learn.exe threads 8 , hash 16 , evaldir eval_zero_epoch0 , evalsavedir eval_zero_epoch0 , evalshare false , learn save_only_once batchsize 300000 eta 30 lambda 0.5 generated_sfens.bin , quit Goto loop |
シボレー(やねv4.71)についてバグ?報告
【使用バイナリ】
YaneuraOu-2017-early-sse42-4.71(リネーム)
【シボレー編集内容】
YaneuraOuV471learn.exe threads 1 , hash 128 , bookmoves 70 , bookfile book.bin , BookDepthLimit 0 , ConsiderBookMoveCount True , gensfen random_move_maxply 0 random_move_count 0 depth 6 eval_limit 1500 loop 20000000
私はbook.binの定跡を使用しているため、
ConsiderBookMoveCount(定跡の指し手を採択率に比例させる)をTrueにしていますが教師局面生成後に
getoptionでオプション設定の確認をするとfalseになっています。
手打ちでConsiderBookMoveCount Trueとして、
getoptionでオプション設定の確認をするとTrueと変更されています。
trueの一文字目を大文字にするから認識していないのでは…。
小文字にしたら出来ました。
(エンジン設定のオプションスペルをそのまま書いたのがダメだったのか)
途中経過となりますが「教師局面生成時のランダムムーブについて」のコメントのようにver11まで終わって、
Depth3=1億局面(一部再利用)×11回elmo絞り
定跡込みでelmoにいくらか勝ちますね。
実質Depth3=11億局面しか学習していないので、4コア8スレッドのPCだと2日でWCSC273位くらいのレートまでいけるみたいですね。
ここからはDepth6でやってみますが、私のPCだと1億局面生成に3日かかるようなので報告は遅くなるかと。
とりあえず今言えるのは、やね学習部はチートツール並みの威力があるので、Depth3とかで上手い使い方を練習してからDepth6で始めても遅く無いだろうと
> Depth3とかで上手い使い方を練習してからDepth6で
はい、そうですね。depth 3から6にしてもプレイアウトの質ってそんなに上がらないですしね…。
USIプロトコルではsetoptionそこを設定するときは「trueまたはfalse」と規定されているので、ShogiGUIの思考エンジン設定の画面が無用の混乱を招いている気がしますね。ShogiGUIの掲示板に修正要望を書いておきました。(`・ω・´)b
SSE4.2でのバグ、原因わかったので修正しときました(´ω`)
たぶん修正されている…ような…(あまり確認まで出来てません)
あとbook.bin絡みのバグの修正と、それから、gensfenのときに、定跡関係のオプション設定が2017Earlyと全く同じ挙動になるように修正しときました。大改造になったので何かエンバグしてるかもです…。
elmo開発者と類似になるかもしれませんが、
sse4.2verでも教師局面生成時に私の環境で1000万局面を超える辺りで生成速度があきらかに鈍化します。(約30%程度)
6回やって6回共そうなりましたので報告しておきます。(エンジン停止することは無い)
あと2スレッド以上で不安定になっていた現象はv4.72で直っていました。
あれ?そうなんですか…。だとしたらもしかするとLinux関係なくてSSE4.2絡みで生じるバグなのかも知れませんね。ご報告、ありがとうございます!
私の手元でSSE4.2版で1000万局面生成してみましたが、遅くはならないようです。うーん。何かいじったときに直ってしまったのかな…。(^^ゞ
私も初めて教師局面生成停止(sse4.2)を確認しました。
【生成速度】
0~1000万までは問題無い
1000万~1500万で10%低下
1500万~2000万で20%低下
2000万~30%低下
こんな感じでだんだん落ちてくるので、私は出来るだけ1000万までの生成やり直しで局面数を稼いでいます。
【生成停止】
まずエンジン停止ではなく、生成がそれ以上進まなくなる現象でした。
バックアップから確認すると、
容量9.6G辺りで挙動が変
容量11G超え辺りで生成が進まなくなる現象の確認(局面数で言えば2億9千万程度です)ここから先を生成しようとすると、すぐ止まったり20万局面で止まったりと不安定になることを確認。
そうなんですか…。
・やねうら王の最新版で確認。
・メモリが逼迫しているということはない。
という条件ですよね…。
ちなみにそれは局面数に比例するのでしょうか?depth 3ではなく2や1でも同じような動作になりますか?
であれば私のほうでも簡単に現象を再現できるかと思うのですが…。
depth3のときは特に生成が止まることは確認出来ていません。(やねv4.70の時代だったのでほぼ1スレッドでやってました)
確認につかった教師局面(バックアップから複数確認)はすべてdepth6生成だと思います。
やねv4.72sse4.2の2スレッドdepth6生成時に停止確認。
メモリの空きは初めて停止したときは見てなくて、2回目のときは4G以上空いてました。
学習まわしちゃったので、また夜に確認しておきます。
手元で現象が再現できたので修正できそうです。色々ありがとうございます。(`・ω・´)b
bookフォルダの中身を空にすれば定跡ファイル必要なく、雑巾絞り出来るでしょうか?
思考エンジン設定のオプション項目使えますので
bookfile no_book
とするのが本来のやり方ですけども。
例)
YaneuraOuV471learn.exe bookfile no_book , threads 8 , …
いやはや
すごいものを公開してくれました
本当感謝します
惜しみなく私にウィッシュリストの商品をプレゼントしてくださってもいいんですよ?
いろいろ改良お疲れ様です。
学習時に特徴的な現象が確認されたので報告と質問です。
【現象報告】
uuunuuun氏の評価関数R3400相当に、私の評価関数がR3600相当になったときの教師局面=1億局面を学習させた所、逆にR-30程度弱くなりました。
【考えられる原因】
私は最初から定跡を用いて学習を続けていたので、後半はピンポイントで修正したい箇所周辺の教師局面を定跡で生成し修正を行っていました。
また、定跡選択手数を70手と長く設定していたため、uuunuuun氏の評価関数と性質が違いすぎて上手く学習出来なかったと考えています。
【質問】
まったく同じ教師局面をひと手間入れて違う結果が得られるのであれば、ひとつの実証が出来ると思うので質問させて下さい。
おそらくパラメタが違いすぎて局面のつながりが無いことが原因だと思うので、
①uuunuuun氏のレート計測の棋譜を接着剤の要素として使用してみる。(浮かむ瀬以上でも26000局の400万局面相当がある)
targetdirオプションで対応可能でしょうか?出来ればやり方を教えて下さい。
②シャッフルが必要だと思う。
いままではデフォルトで1000万局面ごとにミニバッチサイズでシャッフル学習になっていたと思うので気にしていませんでしたが、この条件だと再シャッフルが必要だと思う。
learn shuffle basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAMEのコマンドでしょうか?
generated_kifu.binの置く位置や、棋譜ファイルの置く位置は何処が適切なのでしょうか?
(basedir BASE_DIR と targetdir TARGET_DIR と output_file_name OUTPUT_FILE_NAME とは省略できる。とあったので、単純にlearn shuffleとやるだけだと0バイトのshuffled_sfen.binしか生成されませんでした)
> ①uuunuuun氏のレート計測の棋譜を接着剤の要素として使用してみる。
棋譜をやねうら王の標準定跡ファイル形式に変換してbookfileとしてそれを指定してやる感じですかね。
> ②シャッフルが必要だと思う。
> learn shuffle …
それですね。
> generated_kifu.binの置く位置や、棋譜ファイルの置く位置は何処が適切なのでしょうか?
やねうら王の実行ファイルのあるフォルダから相対pathで書きます。basedirは指定しなくて良くて、targetdirは棋譜入れているフォルダがsfens/ だとしたら targetdir sfensと指定します。
> 単純にlearn shuffleとやるだけだと
1) 棋譜の入ったフォルダ丸ごとを指定する場合→targetdirを使う
2) 棋譜ファイルを個別に指定する場合 → そのファイル名をすべて書く
2)の場合、targetdirを省略できるだけで、この場合は棋譜ファイル名は書かないといけません。なので、
learn shuffle learn_sfen.bin
ならいけるような..。
だいたい原因が分かりました。
最初から最後まで定跡を使用して学習したことが原因のようです。定跡を切って対局すると変なことに気が付きました。
私のほうは定跡使用を前提に作成し、定跡がヒットしている進行は(その部分の評価関数がおかしくても)何も問題が無く、定跡が外れたパラメタは勝率の高いパラメタで学習されていたので、むしろ良い方向で出ています。
これが少ない教師局面でレートが高く出ていた原因のようで、定跡を使用しなかった場合はものすごく変な動きをする場合があります。
つまり、こんな評価関数から生成した教師局面を他の評価関数に使っても、ある程度到達したレートを持つ評価関数には悪影響しか無かったようです。
だからと言って出来ませんでは芸が無いので何かいろいろ模索してみます。
シャッフルのやり方を教えて下さってありがとうございます。
ファイルネームも入れて試してたのですが「従来手法に基づくプロの棋譜を用いない評価関数の学習」で書かれていた名前がgenerated_kifu.binで、シボレーのバッチ生成の名前がgenerated_sfens.binと微妙に違うのを見落としていました。
>棋譜をやねうら王の標準定跡ファイル形式に変換してbookfileとしてそれを指定してやる感じですかね。
例えば、tanuki-さんの定跡ファイルはDepth24で評価値付きの定跡ですが、それを使って教師局面を生成すると学習対象になるみたいなイメージで合っていますか?
> それを使って教師局面を生成すると学習対象になるみたいなイメージで合っていますか?
常識的には、定跡ファイルでは初手から連続して登録されているはずなので、教師局面の生成時にも定跡の指し手を辿ってある程度の局面までは進むはずではあります。ただし、途中で指定回数のランダムムーブが入るのでそのときに定跡の局面から離れることはかなりの確率であります。なので定跡の周辺の局面が全般的に開始局面(学習対象局面の一つ目)となるようなイメージで合ってるかと思います。詳しくは、棋風を覚える将棋ソフトが完成してた件を…。
そういうことですか。今私はランダムムーブ無しで4つの定跡を使って教師局面を生成しています。
ConsiderBookMoveCountの入り切りによって、将棋ソフトが間違いやすい局面を任意で生成して悪手率を調整しています。
分かったことは、こういった条件で作成した教師局面はシャッフル後にepoch0で学習すると、シャッフルによってエントロピーロスが結構違うことを発見したので、ロスが大きい評価関数と小さい評価関数のどっちが強いか実験してみます。
ついでにこれをキメラしてみます。
まふさんの発言、すでに開発者より開発者っぽいですよw
定跡で学習させる場合(順不同でいいとして)、まふ定跡で学習させたあと、「やねうら王の定跡」というふうに、段階を得て学習させていけば強くしていけるかと思いました。
1つの定跡のみで強くしようとすると強くならなかったりするのかなと思います。かえって弱くなったり。
過学習とでもいうのかな。
> 段階を得て学習させていけば強くしていけるかと思いました。
まあ、そのへん人間が何かを学習するときに似ていて面白いですね。
定跡を使う場合、定跡ファイルに登録されている局面からランダムに1局面取り出してきて、それを初手にしてランダムムーブを行うんでしょうか?
例えば16手目の局面を読み込んでそこから局面作成スタートになるとか?
もしそうならば定跡ファイルを使う場合は、沢山局面が登録されている方が局面パターンが増えるという解釈で良いのでしょうか?
それについて詳しい説明は、棋風を覚える将棋ソフトが完成してた件にあります。
かなり詳しく説明されてますね。申し訳ありません。
ということは最初は初手から定跡どうり(ランダムムーブ入れながら)進み、定跡から外れてしまえば、終盤まで定跡が登録されていても局面の生成に現れる事は無いという事ですね。
ですです(`・ω・´)b
シボレーを開き、使用する定跡を変更しようとして、文字を入力しようとしても入力出来ません。どうすれば良いですか? それともやり方が間違っていますか?
> シボレーを開き
「開き」とは、どのファイルを何を使って開いているのでしょう?実体は拡張子が「.bat」のファイルなので「開く」なら、テキストエディタ(メモ帳など)を使うことになりますが、このファイルをメモ帳で開いているのでしょうか?メモ帳で開いたなら「bookfile」(定跡ファイル名)を指定している箇所があるかと思うのですが…。
windows 32bitで動かすにはどうすればいいですか?
32bit版は用意してないです…。(学習に必要なメモリが確保できないため)
Shivorayでlambda可変絞りやeta可変絞りを使ってみたいのですが、
これらのオプションを使用することで学習時間はどのくらい変わるものなんでしょうか。
今手元にあるパソコンは2c4t,RAM4GBなので、1億棋譜の生成に12時間、その学習に”learn batchsize 300000 eta 30 lambda 0″で16時間程度かかるようで、気軽にいろいろ試すわけにもいかず…
一応↓を読んで、学習時hashを減らしたりしてますが、あまり時間が変わらない印象
https://goo.gl/fKCPXM
ゼロから学習させるときの初回に差がつく程度で、そのあとはあまり変わらないですね…。(どうせ、その評価関数の表現力の限界があるので)
なので、比較実験する環境がない場合は、普通にデフォルト値がお勧めです。(eta = 30 , lambda = 0.5)
なるほど、スタートダッシュで少しの差がつくぐらいで、何epochか周すとそんなに変わらないんですね。
デフォルト設定でうまく空き時間にやってみます。
(`・ω・´)ゞはい
やねうら王4.82でバグ?
学習が途中で止まってしまいます。
どうすれば良いですか。
追記
どのようになれば学習は終わるのですか。
学習が止まるというのは画面上はどうなっているのでしょうか?
4.80→4.82で学習まわりはいじってないのですが、4.80のほうでは、うまく動いていますか?
> どのようになれば学習は終わるのですか。
与えた教師局面に対して、指定したloopの回数だけ回れば終了します。100億局面で40コア(80HT)のPCで1周に10時間ぐらいです。4コアのPCですとその10倍ぐらい…。
学習が止まる時の画面は全くepochが更新されません。
10時間も待っていたのですが更新されませんでした。
自分は4.79を使っていたので4.80の事はわかりません。
うーむ、、そんなところは特にいじってないのですが、私のほうでいま学習のテストをしている時間がないのでとりあえず4.80を使ってくださいということで…。
今更で申し訳ありません…
私はコンピューターに疎いのですがねloopさせるためにはどのようにしたら良いのでしょうか
バッチファイル(拡張子が .bat )のなかで goto XXX (XXXのところは適当なラベル名。LOOP とかで良い) ってすると、XXXのというラベルが書いてあるところにジャンプします。詳しくは「MS-DOS バッチファイル goto」などでググってくだされ。
loopのコード間違ってませんか?loop:ではなくて:loopだと思うのですが。
またこのリゼロ評価関数は定跡が強ければ強いほど関数も良いものになる感じですか?そのようでしたら100Tショック定跡を利用しようと思うのですが
ほんまや!(゚д゚) > :loop
間違ってました。本文修正しました。
> 定跡が強ければ強いほど関数も良いものになる感じですか?
与えた定跡の局面を開始局面として対局シミュレーションを行うので、与えた定跡局面周辺の局面での良い駒のポジションを学習する感じです。(対局シミュレーションは詰みまで行うので、終盤の学習自体はなされますが。)
なので実戦でその類似局面に行かないことには、その与えた定跡が生きないように思います。
なるほど。類似局面にならないと意味ないのでは振り飛車を進んで指すソフトを作るのも難しそうですか……。定跡で振らせて評価が落ちないソフトならできそうですね
振り飛車を好んで指させるためには、振り飛車で勝っている棋譜だけを選りすぐって与えるなどすれば簡単にできるかと…。(たややんさんがされている方法ですね) 例) 振り飛車側が負けたときに50%の確率でその教師データを破棄するようにして教師を生成する。
質問なのですが、この方法で評価関数をNNUEにしても学習できますか。
実行ファイルをNNUE評価関数用のものにすれば…あ、NNUEだとetaを1以下にしたほうが良いのでそこは修正しないと。
分かりました。返信ありがとうございます!
遅まきながら、評価関数の学習を試みてみました。
はじめは、このページで紹介されている”Shivoray”で学習しました。
それから、KPP_KKPT型評価関数をV.4.76で作成しました。
次に、同じKPP_KKPT型の新しいバージョンを使ってみようと思い、V.5.40で教師局面を作りました。その時に気づいたのですが、
V.4.71やV.4.76では、
gensfen depth 3 loop 100000000
で、一億局面の4Gバイトのファイルが作成されたのですが、
V.5.40では、約3倍のサイズのファイルが生成されました。
サイズが大きくなるせいなのか、後半は処理時間が2倍以上になりました。
そのあと学習させたときに、最後に表示された局面数は3億弱でした。
gensfen depth 3 loop 100000000
を指定して、約3億弱の局面が作成されたらしいのですが、このことについて説明をいただければ幸いです。
> V.5.40では、約3倍のサイズのファイルが生成されました。
指定する時に桁間違えている可能性があるような…。
生成されるデータの大きさは、局面数×40バイトになります。(なるのが正しいです)
お返事ありがとうございました。
>>指定する時に桁間違えている可能性があるような…。
loop の値はゼロが連続するので間違えやすいと思い、気を付けました。
100000000 (ゼロが8つ、一億) です。
さて、現在、リリースされたばかりのV.6.00で再度教師局面を作成中です。
六千万局面を超えたあたりで、教師局面ファイルのサイズが2.5Gバイトくらいなので今回は順当に4Gバイトになりそうです。
当初は20万局面あたり30秒くらいで作成していましたが、いまは3分余りかかっています。V.4.71が一番速かったのですが、ノートパソコンのファンの音がかなり大きくなりヒヤヒヤしました。処理速度が遅くなるのはCPUには優しいので気長に待つのがよいかな、と考えています。Giuhubの更新履歴を読んでも、学習関連で何度が修正があるようなので最新版を使おうと思います。
先の件ですが、一億局面生成直前、
99800000 sfens
で止まりました。
メモリは16Gです。
10分待ってバッチジョブを終了しました。
追記です。
V.4.80(KPP_KKPT型用)で教師局面作成を試みたところ、処理速度も最後まで安定して一億局面作成することができました。
補足です。エンジンはAVX2用のものを使いました。