前回 TensorFlowによる将棋ソフトの開発日誌(ゆっけさんの場合) #1
目次 TensorFlow将棋ソフト開発日誌 目次
将棋の盤面を見て勝敗を予測するマンを作ろう その1
前回アプローチを説明したとおり指し手モデルの学習の序盤は勝敗予測モデルが合格を出す手を学習する。というわけで勝敗予測モデルを作っていく。
この記事では使用するデータについて記述する。ネットワークの話は次の記事に書く。
使用データ2chkifu
コンピュータ将棋とか1ミリも知らんので棋譜データも手探りで探すことになる。これだけコンピュータ将棋だ電王戦だAIだディープラーニングだと言っているのだからデータやフォーマットやライブラリも整備されているのかと思ったが全然そんなことはなく「ここは1999年のインターネッツですか?」というような状態だった。
棋譜データは 棋譜データベース作成プログラムの使い方 (geocities!) でCSA形式の棋譜が大量に入手出来た。学習用に変換していてわかったのだが10件前後持ち駒から成駒を打っている棋譜がある。(当たり前だが)人力入力らしいし非公式なので仕方がないが成駒以外にも入力間違いがあるかも知れない。まだ手探りなのでデータ量でカバーできているということにする。
各種フォーマットで収録された日本将棋連盟公式のデータ集があれば10000戦につき1000円くらい出してもいいが虫のいい話か。
入手したデータは6万戦超の棋譜が1ファイルにマージされている。これを個別のファイルに分割する。そして駒の動きを読みだして python-shogi に投入することで sfen 形式の文字列を得る。sfenでは勝敗にかかった総手数、その盤面からの次の手、勝者を記載しないので元ファイルから読みだして追加する。結果として以下のようなカンマ区切りの文字列を手ごとに記述する。
# sfen,総手数,次の手,勝者(b: 先手, w: 後手, チェスの流儀に倣う)
l3g3l/3s2ks1/p1nppp2p/2p2b3/1r7/2PB5/PP1P1P2P/2G1K1S2/LNS2G1NL b 2PNG4pr 45,110,6f4d,b
1ファイル1戦、1戦は上記の表記で1手1行の羅列になる。入玉、千日手についてはよくわかってないのでCSAが%TORYOで終端しているもののみを抽出している。
なぜsfenが必要なのか。それは自分のアプローチでは1戦を時系列データとして扱わず1手の盤面のみに着目して学習するからである。またニューラルネットの学習においては1イテレーションごとに入力データがほどよくばらけている方が良い。そうであるから1戦の系列を順次投入するよりはランダムに対局を選びランダムに何手目を抽出する方が良い。ランダムに行を選んだ時に行の情報だけで盤面を再現できるsfen形式が最適であったしありがたいことにpython-shogiでは主にsfenで入出力をしていた。
ここまでの変換を全て終えたところ入手した全戦の変換後の行数は約723万行となった。しばらくはこのデータで遊ぶことになる。