NNUE評価関数は、ネットワーク構成を簡単にカスタマイズできるようになっている。
そこで、入力をK(玉のいる升)とP(どの升にどの駒がいるかに対応する値)だけにして(81升 + 1629通り = 1710)、hidden層の1層目を256×2、2層目・3層目を32にして学習させた。(K-P-256-32-32) NNUEを知らない人のために書くと、各層は全結合。
※ 補足 : ニューラルネットの入力は、駒が存在するところを1、存在しないところを0とした1710次元のベクトル。
教師はdepth 8で生成した10億局面から学習させてみたところ、elmo – R30程度になった。
ファイルサイズは873KB。(zipで圧縮して400KB程度)
教師をもう少し深いdepthで生成すれば、まだ強くなるはず。
とりあえず公開しておいた。
https://github.com/yaneurao/YaneuraOu/releases/tag/20190115_k-p-256-32-32
elmoと言えば言うまでもなく2017年のWCSC27で優勝したソフトであり、1年半余りの技術的な革新により、これとほぼ同等のものがフロッピーディスクにも収まるサイズになったのってすごくないですか?elmoのおおよそ1/1000っすよ?
しかも、入力がKとPだけってなんですか。hidden層の1層目が256×2しかないので、3駒関係どころか、2駒関係すら表現できているか怪しいというのに…。
従来、小さな評価関数バイナリと言えば、GPS将棋が代表格であり、軽量なので開発のテスト用に使うことが多かった。(『将棋神やねうら王』も開発のテスト時にはGPS将棋を用いていた。) そのGPS将棋よりも断然小さな873KB。今後、GPS将棋をテストに使わずに済みそうだ。
ちなみに、GPS将棋のソースコードはいま見ても驚愕に値する。C++ templateを駆使して書かれた、計算しやすくて効果がありそうな特徴因子をひたすら記述してあり、それを機械学習により学習させていた。特徴因子を考える職人と、C++の達人的プログラマが非常に長い時間をかけて試行錯誤した痕跡がある。
しかし、いまにして思えば、それらは全く無駄な作業であった。なにしろ、何も考えずにKとPを入力にして評価値を出力するような小さなニューラルネットを構成するだけでここまで強くなるのだから…。
過去の技術をその後の歴史を知るものが批評するのはフェアではないことは承知しているが、ここ近年でそれほどの技術革新があったという証左になればと思い、書き留めておく次第である。
質問です
教師局面はどのソフトで生成したか
学習コストはどの程度であったか
強化学習のみに頼った場合、NNUEだけで強化学習するのと、rezero系を強化学習してNNUEの教師にするのではどのように差が出るか(想像でいいです。学習コストの違いやレートの上昇曲線なんかが個人的には気になります)
後記
なんでこんな小さいネットワークでそんな精度が出るんですか!わけわかめです!流石!(褒めている)
> 教師局面はどのソフトで生成したか
やねうら王のgensfen2018コマンドで生成しましたが、gensfenコマンドでもそんなに変わらないはず…。
> 学習コストはどの程度であったか
NNUE、OpenBlasを使う実装になっているのですが、Windows版だとここがマルチスレッドにならないようで、1億局面に2時間ぐらいかかります。40億局面回したので80時間かかりました。(他のjobも並列で回しているので良いのですが..)
> 強化学習のみに頼った場合、NNUEだけで強化学習するのと、rezero系を強化学習してNNUEの教師にするのではどのように差が出るか
直感的には自分自身で生成した教師がベストのような気がするのですが、いまのところ、どうもそうでもなさげです..(´ω`) 深いですね..
1MBに満たない評価関数でelmo_wcsc27に⊿R-30とは凄いですね。ラズパイとかでも捗りそう(拡張命令がNNUEと微妙そうなのはおいといて…)
質問というか妄想なのですが、学習オプションと教師局面を同じにしtnk_wcsc28と同じネットワークで学習させた場合、もっと強くなったりするのでしょうか?
> tnk_wcsc28と同じネットワークで学習させた場合
256(x2)-32-32ですね。そっちのほうは、elmo + R30程度になります。
このツリーにぶら下げるべきかよくわからなかったのですが、NNUE K-Pのビルドに躓いたので報告です。
私もk-p_256x2-32-32で学習させてみようと前の記事(http://yaneuraou.yaneu.com/2018/12/30/nnue%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%81%AE%E5%AD%A6%E7%BF%92%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
を参考に環境を真似し(Visual studio)、更にオプションでOpenMPを有効にしビルドを試みたのですが、以下のエラーが出てビルドに失敗しました。
yaneuraou-master\source\eval\nnue\trainer\trainer_feature_transformer.h(94): error C3016: ‘b’: OpenMP ‘for’ ステートメントのインデックス変数は、符号付きの整数型を含んでいなければなりません (ソース ファイルをコンパイルしています eval\nnue\evaluate_nnue_learner.cpp)
yaneuraou-master\source\eval\nnue\trainer\trainer_feature_transformer.h(257): error C3016: ‘j’: OpenMP ‘for’ ステートメントのインデックス変数は、符号付きの整数型を含んでいなければなりません (ソース ファイルをコンパイルしています eval\nnue\evaluate_nnue_learner.cpp)
OpenMPを有効にしてない状態ではビルドが通ったのですが、NNUEはOpenMPはあまり関係ないのでしょうか。
NNUEの学習部はOpenMP使いません(`・ω・´)b
OpenBlasで行列計算だけが並列化されています。そのため学習に時間かかるようです。
むむむ、Shivorayで遊んでるだけの一般人にはOpenMPやらOpenBLASとやらはどこから攻略すれば理解できるのかわからぬ呪文のようです(´д`)。
あと調べたらTNKさんが既にOpenMPあまり意味ない旨をツイーヨしてました(https://twitter.com/nodchip/status/1000523457342263296)、わざわざ重複して訊いてしまってすいません。
OpenBlas → (主に)行列計算を並列化してくれるライブラリ
OpenMP → (主に)ループを並列化してくれるライブラリ
ぐらいの理解でよろしいかと思います。
NNUEはニューラルネットを用いていて、そこには行列計算が使われているので、OpenBlasを使うとお手軽に並列化できるということのようです。
探索部は既存のnnue用で動作しますか?
ShogiGUIで試しましたが初期化エラーが
表示されストップしました
エンジン設定を変更すれば動きますか?
これ用の実行ファイルをビルドする必要があるです。。。
そして、みんな必死でフロッピーディスクとドライブを探してそうな件w
私は、Windows Me世代のPCがまだ現役なので、問題なしw
製造終了間際に慌てて買い込んだようなフロッピーディスクは、全盛期に製造されたものに比べて、未使用でもうまく読み書きできなくなってしまっている事が多いような気がする。
ついでにMDは、PCのデータ用としての用途に解放するのが遅過ぎて死んだバカメディアだと思ってるw 取り外したままの状態ではどこかに失くしそうなSDメモリよりも少量データの受け渡しなどに扱いやすそうだったのに。
MDではなくMOではなく?MOは大容量化が遅すぎましたね…。
音楽のMDです。DS-HMD1のようなドライブが一応存在していたらしいw
MOとかDVD-RAMとか、外殻を付けたままドライブに入れるようなメディアは、どれもこれもオフラインで物理的に渡すときに渡しやすいと思うのにw
ほほー..MD用のドライブって発売されるのが遅かったせいか(存在自体は知っているものの)私は現物を見たことないです(´ω`)
K-P-256…をPS4等のゲーム機用アプリに移植したら
小銭を稼げるかも(そんな時間がなければ仕方が無いが)
いまどきのゲーム機なら普通のNNUEのほうでメモリ的には余裕で足りますね…。今回のやつは、いまどきの炊飯ジャーとか電子レンジに搭載されているCPUで動作するレベルかと。(炊飯ジャーで将棋をする光景はシュールですね)
K-P-256…のピーク時のCPU温度は普通のNNUEに比べ
少し位低くなるのですか?
今回の評価関数の場合、全体に占める評価関数の計算時間の割合が減るので、評価関数がAVX2の特定の命令を駆使してCPUを極限まで使うNNUEの場合、相対的にCPUへの負荷は下がるのでCPU温度は少し下がるはず…。
K-P-256…の棋力がelmo_wcsc27に対して-R30と
紹介されていましたが私のCPUの異なる3台のPCに
1手3秒又は5秒で千局近く対局させましたが何れも
K-P-256…の勝率が55%前後でした +R30が正当な
勝率ではないでしょうか 私がチェックして感じた
のはCPUがRyzenのPCの方がi7に比べK-P-256…の
勝率が少し良いかないうことでした
一応、私のほうでは1000局×1,2,4秒で調査しましたが、まあ、持ち時間や用いる定跡などによって多少の差はあるかも知れないです。
私の方式はNO Book NO Ponderです
定跡なしですと似た進行になってしまうような…。
以前は定跡を使用していましたが
バラツキが大きいので使用を止めて
います この方が中盤以降の実力が
測りやすいと思います
横歩取りばかりにならないですか?(^^ゞ
https://github.com/mizar/YaneuraOu/releases
上記にupされているK-P-256…の探索の中で
一番強いと思われるのはどれですか?
全部同じなのでは。(Windows用とAndroid用、評価関数がバンドルされているもの・されていないもの、があるだけで…)
YaneuraOu-2018-tnk-k-p-msys2-gcc-
evallearn-avx2
YaneuraOu-2018-tnk-k-p-msys2-gcc-
tournament-avx2
YaneuraOu-2018-tnk-k-p-msys2-gcc-avx2
YaneuraOu-2018-tnk-k-p-msys2-clang-
evallearn-avx2
YaneuraOu-2018-tnk-k-p-msys2-clang-
tournament-avx2
YaneuraOu-2018-tnk-k-p-msys2-clang-avx2
avx2版だけでもこれだけありますが具体的に
違いを教えてもらえれば助かりますが…
evallearnは評価関数の学習用でしょう。tournamentは余分な機能を削いで少しばかりのスピードアップをするバージョンです。
gccはgccでコンパイルしたもので、clangはclangでコンパイルしたものでしょう。いずれにせよ、ご自分の環境でnpsの出るものを選べば良いのでは…。
質問ですが、この関数はライブラリとして使えますか?追加学習したものをWCSC29で参加したいと考えてるのですが・・・。
やねうら王のGitHubで公開してあるものは、やねうら王ライブラリなのでライブラリとして使えます。(`・ω・´)b
なお、本日ぐらいに新しいものを…。
返信ありがとうございます。了解しました!
ルール確認中のおっさんなのでコメントします。
2019年1月15日時点で登録されているライブラリと規定されてますよ。
http://www2.computer-shogi.org/wcsc29/cfp.html
私も最近気づいたんで
その「登録」とその後の「アップデート」とは別なのではないでしょうか。(私はそう解釈しています。)
というのも、やねうら王のGitHub自体を数年前にCSAライブラリとして申請して、その後、追加の登録手続きはしていないですし、しかしGitHubのほうはどんどん更新してますし、その更新に対して登録時点のものでなければ使ってはならないということにはなっていないはずで…。