フロッピーディスクに収まる評価関数バイナリ公開しました

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を入力にして評価値を出力するような小さなニューラルネットを構成するだけでここまで強くなるのだから…。

過去の技術をその後の歴史を知るものが批評するのはフェアではないことは承知しているが、ここ近年でそれほどの技術革新があったという証左になればと思い、書き留めておく次第である。

フロッピーディスクに収まる評価関数バイナリ公開しました” への33件のコメント

  1. 質問です
    教師局面はどのソフトで生成したか
    学習コストはどの程度であったか
    強化学習のみに頼った場合、NNUEだけで強化学習するのと、rezero系を強化学習してNNUEの教師にするのではどのように差が出るか(想像でいいです。学習コストの違いやレートの上昇曲線なんかが個人的には気になります)

    後記
    なんでこんな小さいネットワークでそんな精度が出るんですか!わけわかめです!流石!(褒めている)

    • > 教師局面はどのソフトで生成したか

      やねうら王のgensfen2018コマンドで生成しましたが、gensfenコマンドでもそんなに変わらないはず…。

      > 学習コストはどの程度であったか

      NNUE、OpenBlasを使う実装になっているのですが、Windows版だとここがマルチスレッドにならないようで、1億局面に2時間ぐらいかかります。40億局面回したので80時間かかりました。(他のjobも並列で回しているので良いのですが..)

      > 強化学習のみに頼った場合、NNUEだけで強化学習するのと、rezero系を強化学習してNNUEの教師にするのではどのように差が出るか

      直感的には自分自身で生成した教師がベストのような気がするのですが、いまのところ、どうもそうでもなさげです..(´ω`) 深いですね..

  2. 1MBに満たない評価関数でelmo_wcsc27に⊿R-30とは凄いですね。ラズパイとかでも捗りそう(拡張命令がNNUEと微妙そうなのはおいといて…)

    質問というか妄想なのですが、学習オプションと教師局面を同じにしtnk_wcsc28と同じネットワークで学習させた場合、もっと強くなったりするのでしょうか?

      • このツリーにぶら下げるべきかよくわからなかったのですが、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はあまり関係ないのでしょうか。

          • むむむ、Shivorayで遊んでるだけの一般人にはOpenMPやらOpenBLASとやらはどこから攻略すれば理解できるのかわからぬ呪文のようです(´д`)。
            あと調べたらTNKさんが既にOpenMPあまり意味ない旨をツイーヨしてました(https://twitter.com/nodchip/status/1000523457342263296)、わざわざ重複して訊いてしまってすいません。

          • OpenBlas → (主に)行列計算を並列化してくれるライブラリ
            OpenMP → (主に)ループを並列化してくれるライブラリ
            ぐらいの理解でよろしいかと思います。

            NNUEはニューラルネットを用いていて、そこには行列計算が使われているので、OpenBlasを使うとお手軽に並列化できるということのようです。

  3. 探索部は既存のnnue用で動作しますか?
    ShogiGUIで試しましたが初期化エラーが
    表示されストップしました
    エンジン設定を変更すれば動きますか?

  4. そして、みんな必死でフロッピーディスクとドライブを探してそうな件w
    私は、Windows Me世代のPCがまだ現役なので、問題なしw
    製造終了間際に慌てて買い込んだようなフロッピーディスクは、全盛期に製造されたものに比べて、未使用でもうまく読み書きできなくなってしまっている事が多いような気がする。
    ついでにMDは、PCのデータ用としての用途に解放するのが遅過ぎて死んだバカメディアだと思ってるw 取り外したままの状態ではどこかに失くしそうなSDメモリよりも少量データの受け渡しなどに扱いやすそうだったのに。

      • 音楽のMDです。DS-HMD1のようなドライブが一応存在していたらしいw
        MOとかDVD-RAMとか、外殻を付けたままドライブに入れるようなメディアは、どれもこれもオフラインで物理的に渡すときに渡しやすいと思うのにw

  5. K-P-256…をPS4等のゲーム機用アプリに移植したら
    小銭を稼げるかも(そんな時間がなければ仕方が無いが)

    • いまどきのゲーム機なら普通のNNUEのほうでメモリ的には余裕で足りますね…。今回のやつは、いまどきの炊飯ジャーとか電子レンジに搭載されているCPUで動作するレベルかと。(炊飯ジャーで将棋をする光景はシュールですね)

    • 今回の評価関数の場合、全体に占める評価関数の計算時間の割合が減るので、評価関数がAVX2の特定の命令を駆使してCPUを極限まで使うNNUEの場合、相対的にCPUへの負荷は下がるのでCPU温度は少し下がるはず…。

  6. K-P-256…の棋力がelmo_wcsc27に対して-R30と
    紹介されていましたが私のCPUの異なる3台のPCに
    1手3秒又は5秒で千局近く対局させましたが何れも
    K-P-256…の勝率が55%前後でした +R30が正当な
    勝率ではないでしょうか 私がチェックして感じた
    のはCPUがRyzenのPCの方がi7に比べK-P-256…の
    勝率が少し良いかないうことでした

      • 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の出るものを選べば良いのでは…。

  7. 質問ですが、この関数はライブラリとして使えますか?追加学習したものをWCSC29で参加したいと考えてるのですが・・・。

    • その「登録」とその後の「アップデート」とは別なのではないでしょうか。(私はそう解釈しています。)

      というのも、やねうら王のGitHub自体を数年前にCSAライブラリとして申請して、その後、追加の登録手続きはしていないですし、しかしGitHubのほうはどんどん更新してますし、その更新に対して登録時点のものでなければ使ってはならないということにはなっていないはずで…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です