NNUEのミソ

bleu48.hatenablog.com

 

Go言語ではSIMD演算ができないと昨日の日記(正確には3月くらいの下書き)で書きおいていたのにNNUEの実装をしていた。

インラインアセンブラとか使えないので,基本的には先日公開したpythonコードの移植になる。

NNUE型の評価関数のテスト - 48's diary

三駒より桁違い(正確には7,8倍くらい)に遅くなった。(20knps弱程度)

まぁ,SIMD無しだとそんなもんかって感じ。

ループ展開して4割弱改善したが三駒の方が明らかに強いわな。

 

ところで,選手権では立ち話でNNUEのサイズ変更をしたかどうかの話をしていたのだがどうも食いつきが悪かった。早々に諦めたチームが多かったのだろう。

うちはギリギリまで多くのパターンをテストしていたため散々な目にあったが,それで得た知識・経験は結構ある。

NNUEのミソは差分更新であるとされているが,ベンチマーク計測をして感じたのは二層目の512要素を32要素にする部分の行列演算も結構な肝である。

8ビット演算で512x32要素の行列演算をするのであるが,この際このサイズに落ち着いたのが昨今32kbで統一されていたL1キャッシュサイズと無関係ではない。(詳細は省く)

 

まぁ,何が面白いのかと言うとインテルの次世代チップであるIce LakeではL1キャッシュの5割増とL2キャッシュの倍増が謳われているし,AMDRyzenの新しいやつもL3キャッシュ増量と若干レイヤーが異なるにしてもキャッシュ増量が見込まれている。

単純な速度調整であっても影響するが計算精度と速度の関係がややこしいモデルではこの調整が難儀なのは間違いない。

 

AMDは追う側なので既存バイナリの実行速度に最適化されているが,インテルは少し姿勢が違う。Ice Lake世代のCore-Xプロセッサが出た時に専用設計をしたものが結構速くなる可能性があると予想しておこう。

 

CUDAとかインラインアセンブラとか得意な人がチームに入ってくれないかなぁとか,誰か私に丁寧に教えてくれないかなぁとか去年くらいから思ってる。

---

6/6追記

YSSのベンチマークではL2キャッシュが効いている旨が述べられている。

Haswell世代までだが計測量が多く結構面白いCPU序列じゃないだろうか。

www.yss-aya.com

 

温故知新(ビットボード)

ビットボードの話。

個人的にはあまり関わるつもりはなかったが,興味次いでに調べていた。

ネット上には色々と情報があるが,適当にかき集めて自分用にきちんとノートを作るのが必要かな。非常に面白いし,CPU命令と絡んで奥が深い。

将棋は高難易度なので,まずはオセロ,次にチェスとやってから将棋のビットボードを実装すべき。個人的には10年以上前にオセロをやってたので比較的理解は早かったように思う。

 

daruma3940.hatenablog.com

 

wain-cgp.hatenablog.com

 

で,自作のGo言語プログラムに組み込もうかと思ったんだが,現時点でSIMD関係のは直接コーディングできないらしくPEXTも使えないんじゃ面白くないなってことで,2019年3月時点では保留。(突発で実装しないとは言ってない。)

 

golang.org

 

ついでの話で適当じゃないかもしれないが,高速化の類は本質ではないかもしれないが実際は結構しかも確実に強くなる。特に近いスペックで類似のソフトと戦うようになると明白である。(もちろん将棋に限らない。)

逆に言うと半端なことをしても有意義ではない。うちでは実験用のコードとして幾つか用意しているが意図的に組み入れたり組み入れなかったりしているアルゴリズムがある。小さな差の比較実験用である。小規模実験が早く終わると有り難いが,これも程度問題であるように思う。

デバッグとまでいかないが不自然な動きがあった場合に,その原因を探るところまでやってないことが多いように思う。この原因を探りやすいコードをひとつ持っておくことは非常に重要に思う。

WCSC29のクジラちゃん養分としての感想戦

今年もWCSCの現場で養分となっておりました。

昨年はRyzenの8コアノート。

今年はi7-8750Hの6コアノートです。(重かったので)

 

不安は色々。

まず,ニコ生の中継の有無すらわからない程度の連絡不足。

そもそも不定期な生主の出現率が低い。

もっともヤバいのがクライアントの更新が(アナウンスすら)無いのが養分勢としてつらい。

 

結局直前でクライアントが更新されたが,あれだけのファイルサイズを直前で落として養分としてつながる人がどれだけいるのかってのが心配の種。

うちでも宿泊先のホテルで落としたくらい。

案の定,二次予選の朝で接続数が昨年に比べ随分少ない。うちのノードは幾分スペックが下がったはずなのに上位3割くらいの位置にいる。

 

ちなみに,うちのテーブルはWCSCのKristallweizenとクジラちゃんに加えて高見永瀬の叡王戦第四局の中継をしてカオスになっていた。

 

結果として予選落ち。

敗因はたぶん養分を集め足りなかったこと。

もう一つコメントするとすれば,NDF戦以外の敗戦は全て入玉形になっており,その辺りの教師データを十分に学習させてなかったんじゃないかと憶測で述べておく。

 

 

人造棋士18号の理屈

「ノーマライザとして機能する」そう松下さんは言った。

一年ほど前の私は正直よく分かっておらず,三駒関係の評価関数の生値を直接弄る謎の魔法としか認識していなかった。

まぁ,出来た評価関数が私の作ったものより強いのだから何の問題もないのだが,理屈を理解しておく必要があるだろうとは思っていた。

 

ここでいうノーマライザってのは音楽CDのマスタリングなどで行われる振幅データの調整だったのですね。振幅レンジを有効に利用していない部分があれば拡大するし,頭打ちして表現力不足になった部分は押さえて再学習が可能な状態にする。

これにより学習が停滞していた評価関数に追加の強化学習が入りやすくなるし,全体としてバランスが崩れていた点なども修正を加えることが出来る。

これが実は非常に効いていたようだ。

 

実際のところで結構面白いのが戦型選択である。色々と野良評価関数が出ているところではあるが,得意戦型ってのがはっきりしていることが多い。特定戦型を重点的に学習させると強くなるのはなんとなくわかる。ところが,人造棋士18号の評価関数は様々な再学習などを加えたためにいつのまにやらオールラウンダー的な対応をする。

もちろん,調整過程で多くの評価関数相手に苦手を作らない調整で選択的に強化したのが理由の一つであるが,戦型選択を迷うような局面で本当に戦型選択を迷う。そしてその後はその戦型を割にそつなくこなす。

具体例は将棋倶楽部24の18号とHefeweizenが同じ評価関数の序盤定跡をわずかに変更しただけということでも理解されると思う。18号が居飛車を好み,Hefeweizenが振り飛車を指す調整が定跡のみでされている。定跡無しだと混在することになる。振った飛車を戻すこともないし,角換わりで69飛車みたいな戦型や地下鉄飛車も得意だ。

また,角換わりの桂が跳ねるタイミングや歩の突き違う手順なども結構ばらけるような仕上がりで他の強い評価関数とは雰囲気がかなり違う。

 

一度学んだ評価値を潰して再学習潰して再学習を繰り返したためかと思われる。苦手戦型が無いってのは特定の相性で圧勝することも減るので必ずしも良い選択とはならないのだが,昨年のHefeweizenはMulti Ponderでの探索優位性があるため評価関数では五分のものがあればよいとの選択であった。むしろ相性の悪い苦手がないことがバランスよく戦えると考えていた。また,これに合わせて序盤定跡も若干マイルドに仕上がている。横歩では青野流一択に絞るなどの特定戦型に絞り込むことはいくつかしているが結局は横歩,角換わり,雁木,穴熊中飛車四間飛車など一般的にはオールラウンダーと言われるレベルである。後手横歩は2コアノートのshotgunに負けて以来完全に封印している。(今後は分からない)

 

で,この延長で評価関数を作成しようとしていたらNNUEの出現で状況が変わってしまった。三駒関係の評価関数は線形和であるのでノーマライザの実装が比較的簡素であったが,ニューラルネットワークとなるとそうは問屋が卸さない。似たようなことをするのにどうしたらいいものか思案中である。

 

---

と,2月か3月くらいに下書きして放置してたのを今頃晒しておきます。

今年のKristallweizenが昨年のHefeweizenの教師データを食わせた後継の評価関数になったのはホント偶然ですが,似たような風味の指し手なのが面白いところですね。

ちなみに評価関数だけ変えた戦いではKristallweizenが7割近く勝ちますね。

未だ「評価関数よく分からん」ってやつです。 

WCSC29の決勝の感想戦

名人コブラ

f:id:the48:20190524153818p:plain

Qhapaq di molto

f:id:the48:20190524153825p:plain

狸王

f:id:the48:20190524153840p:plain

水匠

f:id:the48:20190524153851p:plain

elmo

f:id:the48:20190524153904p:plain

PAL

f:id:the48:20190524153917p:plain

やねうら王

f:id:the48:20190524153929p:plain

  

朝一のコブラ戦は熱かったですね。二次予選でも捩じり合いました。双方Multi Ponder実装の当て合いです。ジョーvsウルフ金串と言った感じでしょうか。(古い)

また,elmo戦は二次予選同様白熱しました。やはり相性があるんでしょうか。嬉しい好敵手ですね。あのガッツポーズは忘れません。

二次予選でPAL相手の敗戦も角換わりだったので何か弱点があるのかもしれません。

最後のやねうら王戦は言うまでもないですが,千日手を後手番で避けるというシチュエーションを全く準備していなかったのが原因です。

クラスタ構成でなければ設定は簡単なのですが・・・

 

WCSC29二次予選の感想戦

朝一でdlshogiとの一戦

f:id:the48:20190524152244p:plain

elmo

f:id:the48:20190524152325p:plain

狸王

f:id:the48:20190524152336p:plain

W@ndre

f:id:the48:20190524152346p:plain

やねうら王

f:id:the48:20190524152357p:plain

PAL

f:id:the48:20190524152415p:plain

名人コブラ

f:id:the48:20190524152425p:plain

NineDayFever

f:id:the48:20190524152436p:plain

Qhapaq di molto

f:id:the48:20190524152500p:plain

 

結果が出てから貼るとこんなもんかって感じすが,朝一のdlshogi戦がシードされた今年の初戦です。すごくドキドキしました。(小並感)

二戦目のelmoに勝ってやっとまともなプログラムを持ち込めた感があって安心したのを覚えております。

ざっと全部の評価値グラフを見て頂くと分かるのですが,この初戦しか逆転がありません。

特にPALとの負け試合でもワンサイドでじりじり負けてます。これが今風のコンピュータ将棋なのでしょう。

真面目に分析しようとは思ったのですがこのレベルの分析をどうやっていいか分からないままなので公表が遅れたという感じです。

プロ棋士界の序列について

将棋のプロ棋士界では序列という考え方がある。

簡単にWebサイトの棋士一覧の順と考えていい。

1.タイトル保持者(その内タイトルにも順がある)

2.永世称号保持者

3.段位者(同段位では昇段が早いものが上位)

 

で,これが主に何に影響するのかというとイベント招致のギャラなどもあるが,対戦時の上座下座問題にもなる。

但し,プロ棋士界は柔軟なので若手のタイトルホルダーがベテラン棋士に上座を譲るような配慮は日常である。

振り駒では上位者側の歩を5枚使い,歩が多い場合に上位者が先手になる。(上座を譲った場合でも記録係は上位者を振り歩先とするのが原則のようだ)

 

例外は順位戦である。

順位戦では同級のものがリーグ戦を戦うが,この際の上座は順位上位者と決まっている。降格した名人はA級1位となるため常に上座である。

これをうっかり間違えた羽生先生(当時三冠か四冠)がベテラン棋士に陰口を叩かれた事件は結構有名になっている。年間の対局の大半がタイトル防衛戦で下座へ座る感覚がなかったのだろう。

 

ちょっとよく分からないのが前竜王という呼称があったとき,これはどういう扱いだったのだろうか。

それとは別に棋士番号というのがあり,これはプロ棋士になった順に数字が振られており引退したからと言って詰められるものではない。

こういうのも気にしてる人とそうでない人がいて温度感も様々なのであろう。

 

実は昨日羽生九段と谷川九段という永世称号保持者同士の対局があった。この両者が無冠で当たるのも実に珍しいことである。

上記2.の中でどう順位をつけるかってことだが,永世称号に関わらず取得日順だそうな。

ということで無事羽生九段が上座につくことになったそうである。

先に到着していた谷川九段が下座に座っていたってのが気配りなのだろうし,実に谷川九段っぽい気がする。

 

ややこしくて分からないなぁって人は棋士一覧の順位を見ると良い。

近頃は若いタイトル保持者も出るが失冠もするので序列の入れ替わりが激しい。

自動更新されているのかと思うが実に対応が早い。

 

www.shogi.or.jp