素人による評価関数自作記---ゼロから自分好みの評価関数を育成
リゼロ関連でやねうら王開発者磯崎氏(以下やね氏と略)が従来方法でもゼロから出発して評価関数を強くできるという記事を書かれました。この記事によると私が使っているような普通のPC(4c8t)でも評価関数の学習はできるらしく、しかも記事の検証用に評価関数の作成手順が書かれていました。この手順、素人の私でも実行可能で評価関数を数時間で自作することができました。
個人的にはゼロから出発して究極まで強くしたときにどんな将棋を指すかということにも興味があるのですが、別の方向性としてゼロから出発して自分好みの将棋を指す評価関数を鍛えられたら面白いかと発想し実験してみることにしました。アイディアとしては定跡ファイルとして自分が育てたいと思う棋譜から作ったものを与え、それを用いて自己学習させたらどうかと考えました。
まずは評価関数生成
手順は上記の記事の通りですが、一部試行錯誤した部分もあるので全部書いておくと、
(1)まず全く内容がない評価関数(ゼロ評価関数)をやねうら王githubからダウンロード
(2)やねうら王本体を同様にダウンロード
(3)evalフォルダにゼロ評価関数を入れ、bookフォルダに自分が方向づけたい定跡ファイルを置く(今回はやねうら王の標準定跡standard_book.dbを用いた)以上は通常のやねうら王のセットアップと同じ。
(4)やねうら王本体をダブルクリックして起動。DOS窓と呼ばれる黒い窓がでるのでそこで設定する。定跡を標準的なもの以外を使う場合はその窓の中で次のコマンドを入力:
BookFile book.bin (まふ定跡などAperyの定跡を使うとき)
BookFile no_book (定跡を使わないとき)
使用できる設定コマンドはusiとタイプしてリターンを押すと色々出てくるのでそれに従う。
オプション名 設定値
という形式で良いようです。(実は知らなかった)
(5)その窓の中で教師ファイル生成のコマンドを打つ
gensfen depth 3 eval_limit 32000 loop 100000000
(depthの後の数字は探索深度、loopの後の数字は反復回数)上記のコマンドの場合、私の手持ちのPCでは4時間程度で教師ファイル生成が終わる。
追記:途中で定跡から外れるような動きをさせたいときには上記コマンドでgensfen とdepth
3の間に次のオプションを追加
random_move_minply 16 random_move_maxply 32 random_move_count 5
(6)次に教師ファイルから学習する。まず評価関数の生成場所を指定
evalsavedir rezero0.1
この場合rezero0.1というフォルダ中の0という名前のフォルダに評価関数が生成されるので対応する名前のフォルダを作っておく。(これを忘れると評価関数を書き込んでくれない。)評価関数生成は次のコマンドで行う。
learn batchsize 300000 eta 30 lambda 0 loop 1 generated_kifu.bin
以上でApery型評価関数の3つのファイルが指定のフォルダに作られます。(私のPCではここは1時間程度)
追記:elmo絞り相当にするためにはlambda 0.33, またはlambda 0.5
(lambdaを大きくするほど結果重視になるらしい)
(7)更に雑巾絞りを継続するには、生成されたファイルをevalフォルダに入れて(3)から同じプロセスを行う。
どんな評価関数ができたのか
(できた評価関数や棋譜はこちらに置くことに致します)
まず、現在のやねうら王(私が使っているのはV4.70)はたとえ評価関数がゼロであっても(探索が優れているため)十分強く、以前の記事で検証したようにBonanza1と同等の棋力(R2100程度)を持っています。ここが基準でそれからどれくらい伸ばせるのかという問題になります。
以前の記事で書いたようにリゼロ系の評価関数の将棋はほとんど囲わないでコマの配置のバランスを絶妙に取りながら指し進める独特な棋風です。一方やねうら王のstandard_book.dbはプロ棋士の棋譜をベースに作られた定跡であると認識しています。ゼロ評価関数から出発して自己対局に定跡を用いてどんな評価関数になるのか、どの程度定跡に評価関数が影響を受けるのか見てみました。(今のところ第2世代V0.2まで)
まずは、各世代の対局結果から(一手一秒4スレでやっています。定跡は切り)
V0.1 vs V0 170-1-29 R差307 V0.2 vs V0.1 178-1-21 R差371
結構強くなっているではないですか!ゼロからの出発ですので進歩が半端ないです。やね氏のサイトでは最初の雑巾絞りで定跡を使わない場合R100程度の改良とありましたので、定跡を使って教育すると上昇幅がずっと大きいように思われます。自己対局ではレーティングが正確に理解できないので他のソフトと対局させたところ(一手一秒、双方定跡on)
V0.2 vs Bonanza 4 (R2550) 32-1-24 (R差49)
対局数少ないので正確な評価ではないですがV0.2でR2600くらいあるようです。(R500くらい強くなっている!)
やっている将棋は棋譜を見る限り、Bonanza時代の普通のコンピュータ将棋で(囲い方がやや癖があってまだ少しおかしい)、リゼロ系のものとは大きく異なり、評価関数への定跡の影響は甚大です。従来の手法は、これまでにあったプロ棋士などの膨大な棋譜を学習させて評価関数を作っていたと理解していますが、この方法だと必要なものは定跡ファイルのみですので、棋譜を自分のターゲットに応じて大幅に絞りこ込むことができるのではないでしょうか。また、やねうら王氏のブログを見る限り、elmo絞りなどを使えばR4000近くまで(やね氏のリソースを使うと)数日で到達できるようですので、私の非力なPCでも一ヶ月くらいかければ結構なラインまで到達できるような気が致します。また、アマチュアにとって十分な棋力(例えばR2800位)に到達するのは一週間もかからないと思われます。その程度の時間でカスタマイズされた評価関数が得られるのだとすると、この手法、もしかしたら評価関数の開発手法の一つを与えているように思えるのですがいかがでしょうか。
その後の飼育日記
6/22 V0.3: いつも同じ定跡で飼育するのは不安になったので今回は定跡ファイルなし(野良発育)で教育する。
前バージョンとの対局 V0.3 162-38 V0.2 R差251
Bonanza6との対局 V0.3 28-1-12 Bona6 R差147
対局少ないけどBona6より強くなったと考える。ゼロ評価関数との差はR700~800程度なのでelmoやリゼロ8のR1800~R1900というゼロ評価関数からの差と比べるとまだ小学校低学年レベル。逆に言うとまだまだ当分伸びしろがあって飼育するのは楽しそうだ。
そろそろまともな将棋を指すようになったので私と対局してみる。探索エンジンがやねうら王だと勝負にならないのでノード数有限の設定ができる浮かむ瀬改(浮かむ瀬をmerom686さんがノード数や乱数で弱くできるように書き換えたもの)に換え対局。ノード数2千くらいだと楽勝だけど2万にすると勝てない。(乱数は切るように設定)結構強いかなと思って他の将棋ソフトに当てるとレサ改には楽勝、Bonanza6 Depth2には勝ち越し、Depth3に負け越しで評価適当だけど多分R1100位。ノード数を増やせば強くなるし減らせば弱くなるので級位者にはちょうどいいかもしれない。
Kazuteru Suzuki様:すみませんが匿名でやっている都合上Facebookアカウントは持っておりません。>学習深度というのは探索深さのことでしょうか?
おっしゃるとおりです。どうもありがとうございました。改訂いたしました。
6/23 V0.4 今回も野良飼育(定跡なし)
前バージョンとの対局:V0.4 136-7-57 V0.3 (R差145)
これまでの勢いから比べると若干伸びが落ちてきた?しかし、前回Bona6に大きく勝ち越していたのでGPSFish(R2886)よりは大分強いと思っていたが、
V0.4 23-1-17 GPSFish (R差52) 対局数少ないがR2900強か?
やねうら王のソースファイルを見ていると上記のコマンドのlambdaを0.33にするとelmo絞り相当になるようだ。同じ生成棋譜からパラメータを変えて評価関数を生成。(これをV0.5と呼ぶ)これとGPSFishと対局させたところ
V0.5 32-0-11 GPSFish (R差185)
やっぱりelmo絞りすごいのではないか。このあたりでR3000を超えたのかもしれない。ゼロから比べてR900ほどの成長か。elmoを大人として比べると小学校4年(10歳児)くらいまで成長したのかもしれない。わずか数日でここまで大きくなるとは。評価関数驚くべし。
6/24 V0.51 (育成4日目)
少し違う定跡も学ばせてみようと思い、技巧2についている四間飛車定跡をShogiGUI作者が作っておられる定跡コンバータでやね形式に変換、棋譜生成に用いてみた。この定跡、比較的サイズが小さく同一局面が多数現れたせいか(?)対局データ生成、学習とも一瞬で終わり評価関数学習には適していなかった模様。しかし、多少は評価関数に影響を与えたと思って、このバージョンをV0.51とした。
V0.6
気を取り直して、再びstandard_book.dbを用いて棋譜生成し再度教育。elmo絞りで作られた定跡をV0.6とする(なんか迷走している、、)一手一秒での対局結果は
V0.6 74-4-22 V0.51 (R差200)
V0.6 33-1-16 Apery WCSC25 (R差125)
Apery WCSC25はR3156なので額面通り捉えればR3280程度となる。元のゼロ評価関数との差はR1100を超えた。そろそろ鑑賞に耐えるような領域に入ってきたのかもしれない。年齢的には中学生くらいか。たった4日で中学生まで育ってしまうなんて。
6/25 V0.7 (育成5日目)
今回は定跡なし。前バージョンとの対戦成績は
V07 44-2-31 V06 (R差59)
ついに収束フェーズに入ってきたか!
V0.71
同じ方針で自己学習をしても同じような棋譜しか集められていないのではないかと考え、技巧2の「全戦型」の定跡をやねうら王型定跡に変更してstandard_book.dbと名前を変え、こちらを用いて学習させてみる。棋譜生成が80%くらいで止まるというアクシデントに見舞われたが、とりあえずそれで学習させてみる。(V0.71とする)
V0.71 112-9-79 V0.7 (R差58)
今回も前回とほとんど同じ。しかし、V0.6→V0.71ではR100くらいは絞れているのだろうか。
6/26 昨日作った評価関数、どのあたりまで成長したのか、今日から暫く仕事のため育成ができなくなるので大樹の枝と一手五秒対局を行いレーティングの評価を行いました。
結果は
V0.71 52-3-26 Apery_twig (R差117)
大樹の枝は私のレーティング表で基準にしているソフトでR3250に固定してあります。それから測ってR117差ですのでこの評価関数のレーティングはR3400弱というレベルだと思う。結局一週間弱でレートをR1300位上げたことになりました。やね氏の学習アルゴリズム大変優秀だったおかげと思います。おかげさまで、私の作った評価関数も中学校卒業くらいには育ちました。
6/27 後日談
今回のブログ記事で提案したアイディアは、まふ氏ややね氏にもインパクトを与えたようで、より洗練された開発方法も提案され始めました。この記事によれば、まふさんはご自身の定跡を用いて自然に穴熊を指す評価関数に成功されたとか。また、一度生成した棋譜を何度も学習に使えば、より早く強くなるとのこと。また、やね氏によれば途中で定跡から離れるように棋譜生成を工夫すると定跡周りの良い手を自然に学習して、その戦法を指しこなす評価関数ができるとのことでした。今後この手法がより洗練されて、様々な棋風の評価関数が発表されていくことを期待してこの記事を終えたいと思います。
雑巾絞りの過程で得られた評価関数は、使いみちがあるのかもしれません。その一つは級位者~有段者向けの対局に使うことです。定跡で勉強させているので比較的人間的な指し方をします。暇を見つけて、そんな方向性も考えていきたいと思っています。あと、評価関数を作る上で痛感したのは、評価関数教育用の定跡があまりないという点です。誰か適当なものを出してくれないかなと待望しています。