読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋でディープラーニングする その5(入力特徴に手番を追加)

世界コンピュータ将棋選手権を参加者の生放送の方で見ていました。
開発者の話が聞けて、大変面白かったです。

Ponanza Chainerの手法については、後日公開予定ということなので、公開されたら拝見させていただきたいと思います。
生放送でもだいぶ中身について言及されていて大変参考になりました。
私の理解では以下の通りです。

  • CNNを使用して、ネットワーク構成はAlphaGoを参考にした
  • レイヤー数は13(19とうろ覚えのようでしたが、AlphaGoを参考にしたということなので13だと思われる)
  • 将棋は遠くまで効く駒があるのでその点考慮した(フィルターサイズの話と思われる)
  • 合法手の情報は入れていない
  • 駒の効きの情報は入れていない
  • 入力特徴は局面の盤面情報と、将棋の知識で唯一入れているのは王手があるかだけ
  • ディープラーニングは指し手のオーダリングに使用している(手の候補の順番リストを用意する)
  • 探索は既存のPonazaベース+クラスタリング
  • 評価関数部分は既存のPonanzaベース
  • ディープラーニングのみだと序盤が強い、終盤が弱い
  • オーダリングだけで初段は超えてる
  • ディープラーニングでオーダリングすると既存のPonanzaより6割くらい強くなる
  • 学習はPonanzaの自己対戦データ5億局面を使い、1GPUで1.5か月学習したものを使用した
  • 128GPUで並列で学習したものより1GPUで長時間学習の方が強かった

個人的には、フィルターサイズについて詳しく知りたかったが、後日公開されると思うので待つことにします。

Ponanza Chainerは結果は優勝を逃しましたが、今回導入したのは、AlphaGoで言うSL Policy networkの部分のみで、優勝したelmoの方は勝敗の結果を評価関数に反映する強化学習を行っていたようなので、Ponanza ChainerもAlpahGoで言うRL Policy networkで勝敗の結果から方策改善を行うことでさらに強くなる余地があると思います。

さて、私が検証を行っている将棋のディープラーニングについて、前回変更したネットワーク構成の入力特徴に手番を加えて精度が上がるか試してみました。
本日他にも試して効果があったことがありますが、記事を分けて書きます。

手番の入力特徴について

AlpahGoでは手番(Turns since)を8枚の入力特徴としている。
将棋では1手から200以上の手数があるため、8枚で表すには手数を分割して割り振る必要がある。
分割する手数を10、15、20としてOneHotエンコーディングした場合と、1枚の入力特徴で0~1の連続値で入力した場合、先手・後手を入力特徴とした場合で実験を行った。

実験結果

プロの棋譜422852局面を3エポック学習した結果
train loss test accuracy
手番なし 3.35 0.26
10ごと 3.39 0.27
15ごと 3.37 0.29
20ごと 3.43 0.27
連続値 3.42 0.26
先手・後手 3.34 0.27

どれも誤差の範囲であり、手番の情報は結果には影響がありませんでした。
この結果からは手番は入力特徴には不要のようです。

2017/5/7 追記

以下のNDFのアピール文書を読んでいると、今の将棋プログラムの機械学習で使われている「手番」の意味は、上記の手番(Turns since)とは異なり、探索時の先手か後手かという意味合いのようで、「手番」を持っている側へのボーナスを評価するようです。
http://www.computer-shogi.org/wcsc24/appeal/NineDayFever/NDF.txt

将棋プログラムの経験が浅く十分に理解しきれていませんが、ここで言う「手番」であれば効果的かもしれません。
しかし、学習しているのは方策であるためここで言う「手番」の考慮は不要そうです。

また、NDFの相対KPPや相対PPの考えは、未知の局面への対応力を増やすためあえて関数の表現力を落として、汎化性能を上げています。(※KPPやPPのK、PはそれぞれKing、Pieceの略)
DCNNは表現力の高い関数なので、学習局面が増やせない入玉のような局面への汎化性能が得られるか、今後実験する上で興味があります。