やねうら王の学習部を刷新したときに、この学習部にバグがないかを以下の手順で判定した。将棋ソフトの学習部をフルスクラッチで書いている他の開発者の参考になると思うので、その手順やデータを公開する。
まず、やねうら王の最新版のLearner::search() + tanuki-さんの教師局面生成部 + tanuki-さんの学習部で学習の実験をしてもらった。
教師局面の生成 : Apery(WCSC26)からdepth8で5億局面生成、
学習 : 5億局面×4周。Apery(WCSC26)に追加学習。
tanuki-さんによると、これで1スレッド1秒対戦で+R63.85の増加らしい。
T1,b1000,582 – 15 – 403(59.09% R63.85) win black: white = 50.66% : 49.34%
Apery(WCSC26)を用いたのは、雑巾絞りによる伸びしろがそこそこある評価関数ファイルなので、棋力の伸びを計測するのにとても適しているからである。
学習部がきちんと動作しているかの検証には、上記の条件が今後スタンダードになるのではないかと思う。depth 8とは言え、5億局面ならすぐに生成できるし、4周回すだけなら手軽だし、1秒対戦なので検証も容易だからである。そんなわけで他の開発者の皆様も、活用していただければと思う。
また、以上の実験により、やねうら王の最新版(V4.61)のLearner::search()がバグっていないことが証明された。
次に、やねうら王の最新の学習部でも同じ条件で学習させてみた。
重み配列の型はfloat(4バイト)とdouble(8バイト)とを選択できるが、まずfloatで行なった。以下の4条件で試した。いずれもtanuki-さんの+R63.85を上回った。
1) LOSS_FUNCTION_IS_CROSS_ENTOROPY , eta = 30
T1,b1000,1757 – 89 – 3154(35.78% R-101.64) win black : white = 51.27% : 48.73%
2) LOSS_FUNCTION_IS_CROSS_ENTOROPY , eta = 15
T1,b1000,1779 – 102 – 3119(36.32% R-97.54) win black : white = 50.33% : 49.67%
3) LOSS_FUNCTION_IS_WINNING_PERCENTAGE , eta = 30
T1,b1000,1823 – 94 – 3083(37.16% R-91.27) win black : white = 50.18% : 49.82%
4) LOSS_FUNCTION_IS_WINNING_PERCENTAGE , eta = 15
T1,b1000,1841 – 100 – 3059(37.57% R-88.21) win black : white = 50.45% : 49.55%
学習率(eta)が大きいと収束が早くなるが、収束が早いほうが十分に回したときに最終的にいい値にいくとは限らないので、+R63.85より強くなっているから単純にそちらのほうが学習手法として優れているとは限らないことを指摘しておく。
いずれにせよ、これだけ棋力が向上すれば、正常に雑巾絞りが出来ていることは間違いないし、新しい学習部は、省メモリ化、高速化の恩恵もある。
また、上の学習は学習時の重み配列の型をfloat型にして行なった。次に、比較実験として、これをdouble型にして行なった。ちなみに配列の型がfloatのときも、AdaGradでの更新式の計算自体はdouble型でやっている。
1) T1,b1000,1780 – 82 – 3138(36.19% R-98.49) win black : white = 51.83% : 48.17%
2) T1,b1000,1830 – 111 – 3059(37.43% R-89.25) win black : white = 49.4% : 50.6%
3) T1,b1000,1820 – 80 – 3100(36.99% R-92.52) win black : white = 49.31% : 50.69%
4) T1,b1000,1845 – 98 – 3057(37.64% R-87.72) win black : white = 50.63% : 49.37%
float型とdouble型とで有意な差は見られなかった。将棋ソフトの機械学習において重み配列の演算精度が学習にどの程度の影響を及ぼすか、従来はデータがあまりなかったが、今回、意味のあるデータが出せたように思う。AdaGradでは、float型とdouble型とでほとんど差が出ないと言えそうだ。
やねうら王の学習部はfloat型に固定しておくことにした。
雑巾絞りに関しては以上。次回はelmo絞りについて書く。(かも)
追記 : 2017/05/27 24:00
おまけで、Apery(WCSC26)からdepth 8で5億局面生成したものをここにおいておきます。やねうら王(V4.61)の教師局面形式で40バイト×5000万局面で2GBのファイルが10個入っています。
https://www.isus.jp/others/half-precision-floats/
さらに精度を落して半精度浮動小数点にしてみるというのはいかがでしょう?w
C++でhalf float扱いにくいので…。(´;ω;`)
いやしかし、Weight構造体が小さくなるのは魅力的だな…。考えときます。
いつも楽しく読んでます。最近AI方面でブームの兆しがあるint 8でどうなるかも気になります!
誰かと思ったらピースオブケイクの社長さんではないですか?!
匿名でコメント残すつもりが、アイコンが普通に出てましたw 将棋ソフト以前のずっと前からブログ拝見してます。やねさんの本も何冊か持ってます。
ありがとうございます!これは是非、cakesに何か書かせていただかなければ!w