ときどき出てくる「KKP16bit化」の意味について(何度も聞かれるのも嫌なので)詳しく書いておきます。
もともと、AperyではKKPは32bitでした。32bitあれば、符号つき整数として、-21億なにがし〜+21億なにがしまで表現できます。16bitだと、符号つき整数としては、-32,768〜32,767までしか表現できません。
Apery(2015)以前は、この後者の範囲だとKKPの値が収まっていなかったのです。なので32bitにして保持する必要がありました。これが今回の大規模学習により、値が小さくなっていき、後者の範囲に収まったので「KKPは16bitでいいやん?」という話となりました。(しかし、いままでの評価関数ファイルと互換性がなくなってしまうので、Aperyもやねうら王も実際はまだこの変更をやっていません。)
ちなみに、KPPは16bitなので、KKP(含むKK)さえ16bitに収まれば、全部16bitで済むことになり、KPPのコードと共通化できて、ソースコードがすっきりします。
ところで、なぜ、Apery(2015)以前においてKKPが16bitに収まっていなかったのでしょうか。
これは、当時、入玉棋譜が少なかったので、入玉に対して加点する必要があり、人工的に敵陣にいる玉(Kの位置)に対して加点していたからです。その加点している値が10万とか非常に大きな値だったので、16bitに収まらなかったのです。
評価値として10万って非常に大きな数字だと思う方もおられるかも知れませんが、この生のKKPの値は、最終的には、FV_SCALEという定数で割ったものが評価値となります。このFV_SCALEは32となっています。なので10万と言っても実際はその1/32です。とは言え、評価値としてはかなり大きな値ですけど…。
2016/11/05 8:30 追記
平岡さんのほうから補足があったので以下にツイートを貼り付けておきます。
AperyのKKPが32bitなのは、最大52回の可変数ループを38回固定ループに変換した時に16bitに収まらなかったからです(´・_・`)大樹の枝の時点で一旦ゼロから学習し直しているので16bitで表現可能になっています(´・_・`)
— 平岡 拓也(´・_・`) (@HiraokaTakuya) November 4, 2016
評価関数ファイルの先頭にバージョン文字列を入れるか、ファイル名に規則をつけて、
16ビット格納かどうかを示させてはいかがでしょう。
でも今更16ビット、、、スカスカでも整数は全部DWORDでええやんと思いますが。
> でも今更16ビット、、、スカスカでも整数は全部DWORDでええやんと思いますが。
評価関数テーブルの要素が32bitだとCPU cacheに載りにくくなってnpsが結構低下します。(´ω`)
なるほど。CPU演算じゃなくてキャッシュ、、、
それならファイルフォーマットは現状で、メモリ格納は16ビットに切り詰めて、、、
それだとバイナリイメージを読み込んで即解釈といかなくなるのか。うーむ。
> それならファイルフォーマットは現状で、メモリ格納は16ビットに切り詰めて、、、
まあそれでもいいんですけど、以前のKKPが16bitに収まっていない値がある評価関数ファイルを読み込まされたときに挙動がおかしくなってしまうので…。あと書き出しのほうは逆に32bit化しないといけないのも二度手間的な…。