週末は電王戦の第2局を観戦していました。
人間のプロとコンピュータの対局はこれで最後となりましたが、コンピュータ同士の電王戦は継続されるということで、今後も楽しみです。
検証しているディープラーニングによるコンピュータ将棋ですが、入力層のフィルターサイズについて見直しが必要と思っています。
飛車などの大駒に対して3×3のフィルターサイズは効果的でないので、駒ごとにフィルターサイズを分ける必要があると思っています。
フィルターサイズのバリエーションを自分で試して実験するのは時間がかかるので、Ponanza Chainerが情報公開を行う予定があるということなので、それを待っています。(まだかなぁー)
さて、今回からバリューネットワークの実装方法の確認を行います。
参考にするAlphaGoの手法は以下の通りです。
バリューネットワークの構成
バリューネットワークは、1から13層は方策ネットワークと同じで、出力層のsoftmaxに代わり、256ノードの全結合層の後に活性化関数がtanhの1ノードの全結合層にした構成となる。
出力は状態(局面)の価値(期待報酬)を表すスカラー値となる。
入力特徴
方策ネットワークの入力特徴に手番の色を追加している。
学習方法
損失関数には平均2乗誤差(MSE)を使用する。
RL policyで終局までプレイした結果(報酬)が教師データとなる。
よって、勾配は以下の式で表される。
RL policyで自己対戦した結果(報酬(-1,1)) | |
局面の価値を表す関数(バリューネットワーク) | |
学習率 | |
ミニバッチサイズ |
学習局面のデータセットは、SL policyによる自己対戦によって、1手から450手までランダムに選んだ手数だけプレイした局面から1手ランダムに打った局面が使われる。
ミニバッチサイズm=32として、5千万ミニバッチを学習する。(局面数は1億6千万)
学習データがあれば、学習は普通の回帰問題であり、Chainerなどのフレームワークを使えば損失関数をmean_squared_errorとするだけでよく、実装は易しい。
学習データの生成は、GPUを使えば複数ゲームを並列で進行できるので、探索ベースのプログラムよりは早く生成できそうだが、それでも非常に時間がかかりそうである。
次回はバリューネットワークの実装を行う予定。