私はかねてより評価関数ファイルを(評価関数パラメーターを)ゼロベクトルから学習させる必要性があると感じてました。これは、世界コンピュータ将棋選手権のルールにおいては、例えば、Aperyの評価関数から追加学習させるとAperyのライブラリを用いたことになり、ライブラリ申請をするときにAperyと書かないといけないからです。
予告通り、やねうら王で使える評価関数ファイル、弱いものから強いものまで、28バリエーションが用意できたので期間限定で公開します。https://t.co/xICrUWy3te
詳しくは解凍したときのreadme.txtをご覧ください。
— やねうら王 (@yaneuraou) July 22, 2016
(承前) 自作の連続自己対戦フレームワークを用いて勝率見ながらチューンしたものの、これが本当にやねうら王で使えるかだとか何のテストもしてないのでただのゴミファイルであったとしても怒らない、騒がない、慌てないでお願いします。強いのか弱いのかすらよくわからないのでレポート待ってます。
— やねうら王 (@yaneuraou) July 22, 2016
ゼロベクトルから学習させると余計な時間がかかりますし、局所解にハマらないようにうまく学習させるテクニックが必要になります。このへんの技術的なことはまた別の記事で書くとして、今回はこの評価関数ファイルの使い方などを書いておきます。
使い方
やねうら王2016 Midで使える評価関数ファイル28種類です。
やねうら王の思考エンジン設定で、評価関数ファイルを配置するフォルダ名を指定して切り替えてください。
また、SilentMajority(2016年5月版)、Apery(2016年5月版)と同じファイル形式ですので、それらのソフトでも使えるはずです。
棋力
一番強い評価関数ファイルでApery(WCSC26)の評価関数ファイルと1スレッド1手2秒対局においてほぼ互角の勝率であることは確認しました。
どうやって作成したのか?
やねうら王2016Midで6手深さで探索した局面ファイル53億局面を教師として、ゼロベクトルから学習させました。
フリーザ「私の学習対象局面は53億局面です。」
Apery(WCSC26)の評価関数からの追加学習ではありませんので、世界コンピュータ将棋選手権に出場する際に、Aperyをライブラリ申請する必要はありません。
また、強さはApery(WCSC26)と互角と書きましたが、棋風は全く違うはずです。
各ファイルの説明
フォルダ名は以下のようになっています。
500_0000M/
500というのは、教師(深い探索のときの評価値)と値探索のときの評価値の
誤差の平均です。
E = 1/m・Σabs(深い探索のときの評価値-浅い探索のときの評価値)
500であれば評価値が平均的に500ぐらい違ってるということです。
なので、この値は小さいほど強いと言えます。
後ろについている0000Mは、学習に用いた局面数です。
Mは100万の単位(メガ)、Gは10億の単位(ギガ)です。
0000Mは学習に用いた局面は0局面、すなわち、全く学習はしていない状態であるということです。なので、この評価関数を用いると駒得だけしか考慮しない、やねうら王となります。(駒得しか考慮していないのに評価関数の計算をしているのでその無駄のため、純粋に駒得しか考慮しないソフトより弱い状態です。)
ただ、駒得しか見なくともR2000ぐらいはあるはずです。
そこから、学習するごとに強くなっていき、一番強いファイルが入っているフォルダ名は、
181_0020G/
となります。181の評価値の誤差で、0020Gは、20G(200億局面)学習させたという意味です。教師局面自体は53億局面ですが、それを数回回したということです。
ライセンス
NYSLで配布します。二次配布も、自由にしていただいて構いません。
GoogleDriveに置きっぱなしにも出来ないので公開しているファイルはそのうち消すかも知れません。
学習を深くするごとにどのパラメータがどう変動しているかの傾向を見て、
その傾向を先取りしたパラメータを設定することはできないでしょうか?
せっかく機械学習してるのに最後に人のいい加減な手を入れるのも変ですが。
でもここまで順繰りにテーブルが揃ってきたら、テーブル間の関係や差分を人の目で評価して言語化してみたい気がします。
玉が88にいて左銀が77に居るときは左金は78がいいとか。
> その傾向を先取りしたパラメータを設定する
そういう傾向、もしかするとあるのかも知れませんが、機械学習では全体として帳尻が合うようにパラメーターが調整されるので、先取りするならすべての評価因子を同じだけ先取りしないといけないので、それがなかなか…。
評価関数ファイルの中身をいくつか見てみまして、
王手を含むような組み合わせ(例えばKKPで{後手2二玉、先手2三歩}、{後手2二玉、先手1四桂}などを含む組み合わせ)では
パラメータが一律0になっているように見えたのですが、
王手がかかっている局面は意図的に学習対象から除外されているということなのでしょうか?
浅い探索のleaf nodeの評価値を深い探索のそれに近づけるというのが現在の学習手法なのですが、前者は、qsearch()の結果であり、いまのqsearch()では王手がかかっている限り延長されますから、qsearch()のleafでは王手の局面は出現しないので基本的にゼロになります。これがいいのか悪いのかはわかりません。search()のほうで王手がかかっている局面でevaluate()を呼び出すのであれば、そこは適切な値がついているのが望ましいですから、何らか値がついていたほうが良いかも知れません…が、search()でevaluate()呼び出してその値を使うかどうかは…たぶんいまは(そのあと差分計算のためにしか)使ってないような…。
早速ご回答頂きましてありがとうございます。qsearch()のleafの局面を使用されているとのことで納得いたしました。
別の話になりますが、上記takaさんがコメントされておりますように
いくつかのパラメータを200_0011Gから181_0020Gまで並べてみたのですが、
個々のパラメータは必ずしも特定の値に収束しつつある訳ではないのですね…
Aperyの最近の評価関数も同じように並べてみるとこちらも同様で
しかも両ソフトのパラメータは意外なほど異なっており、中には正負すら異なる場合もあるようです。
それにも関わらず評価関数全体としては棋力は同程度になる、というのも奥深いですね…
> 個々のパラメータは必ずしも特定の値に収束しつつある訳ではないのですね…
おお、そうなんですか。私、そのへん何も調べてないです。なるほど、興味深いですね。