根岸の部屋

備忘録がてらに将棋(主にソフトとか角交換四間飛車とか)について書き殴ってます。棋力は絶賛伸び悩み中\(^0^)/ Twitter→@39th_theory

評価関数を自作してみる⑤

 またやらかしてしまった。今更になって重大な不具合が見つかったのだ。

 私は学習用に振り飛車局面集の定跡を作り、それを元に教師局面を生成していた。この定跡は振り飛車棋譜を材料にShogiGUIのsbk形式の定跡ファイルを作り、それをai5氏のBookConvを使いやねうらDB形式に変換して作成したものである。

 だが、こうして作った定跡DBだが、調べてみるとやねうら王のエンジンに読み込ませることができないファイルのようなのだ。試しにこの定跡DBをリネームして検討用のやねうら王に搭載させてみたところ、候補手に定跡手が選択されること無く、自力で探索した手を表示されるのである。これは対局時も同様で、定跡が全く機能しないのだ。これらをみると、定跡コンバーターがうまく動作しておらず、正常なやねうら形式定跡ファイルができていないのだと考えられる。

 つまり、これまで振り飛車定跡で雑巾を絞ったとする「振り飛車絞り」とかなんとか言っていたこれまで作った評価関数は、実は振り飛車のエッセンスなど全く含まれていなかったと言うことである。

 またしても振り飛車評価関数を作ろうという私の目論見が外れ、見当違いの方法で見当違いのことをやってしまい、電気代を無駄に浪費してしまったということになる。いい加減心が折れそうだが、まあでももう一踏ん張りしてみる。

 ひとまず、きちんと機能するやねうら形式の定跡を作らないことには先に進まない。そこでYaneuraOu2017Earlyに標準搭載されたコマンドのmakebookを使って定跡をつくることにする。

 まずaki氏のBlunder.Converterを用意する。次に十分な数の振り飛車棋譜集を用意し、Blunder.Converterでsfen形式に1ファイルにまとめて変換する。

 やねうら王の実行ファイルを開き、コマンドプロンプトから

makebook from_sfen book.sfen standard_book.db moves 16

と入力する。これはやねうら王と同じディレクトリにあるbook.sfenというsfen形式ファイルから16手目までの手を抽出してstandard_book.dbというやねうら形式定跡を生成するという意味である。入力及び出力ファイル名や定跡の手数は任意に変更できる。この動作の詳しい説明はやねうら王のダウンロード先のgithubのdocs/解説.txt、または以下のサイトに詳しい。

やねうら王を使って定跡を作る | やねうら王 公式サイト

 このようにして作られた定跡ならば、間違いなく読み込んでくれるはずである。検討や対局でテストしてみたところちゃんと読み込めていた。これなら学習用に使えそうだ。

 ただし、この方法でできた定跡ファイルは、あくまで「振り飛車局面集」であって「振り飛車定跡」ではないことに注意が必要だ。これは単に振り飛車棋譜を雑にぶっ込んだだけなので、対抗型の居飛車側の手も多分に含まれている。そのためそのような居飛車の手を採用してしまうことが多くあるのだ。

 振り飛車を指させるための「振り飛車定跡」をつくりたいなら、まず振り飛車棋譜を①先手振り飛車対後手居飛車②先手居飛車対後手振り飛車③相振り飛車の3つに分類する。そして①と②の棋譜からBlunder.Converterで一つのsfenファイルに変換する。また、②と③からも一つのsfenファイルに変換する。これでそれぞれ先手が振り飛車にしたsfen棋譜集、後手が振り飛車のsfen棋譜集ができる。これら二つのsfenファイルをやねうら王実行ファイルと同じディレクトリに置き、やねうら王を開いて

makebook from_sfen bw black_book.sfen white_book.sfen standard_book.db moves 16

と入力する。black_book.sfenが先手振り飛車、white_book.sfenが後手振り飛車のsfenファイルだとすると、これで振り飛車側の手のみが登録された定跡ファイルが作られる。もちろんファイル名や定跡手数は任意の値に変えて構わない。この「振り飛車定跡」を使えば、定跡を外されない限りは振り飛車を指すソフトができあがるはずだ。

 なぜこの「振り飛車定跡」を使って学習しないのかというと、この定跡同士が戦うと相振り飛車ばかりになってしまうからだ。ランダムムーブがあるとは言え、相当数の対抗型の棋譜を用意した方が望ましいはずだろう。

 

 というわけで、この振り飛車局面集を使ってまたepoch0からdepth3の1億局面で学習してみる。もうepoch0から学習を回すのも3回目になってしまった。さすがにこれ以上失敗したら本格的に心が折れそうなので、今回こそはうまくいってほしいところ……。