TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋でディープラーニングする その20(バリューネットワーク)

週末は電王戦の第2局を観戦していました。
人間のプロとコンピュータの対局はこれで最後となりましたが、コンピュータ同士の電王戦は継続されるということで、今後も楽しみです。

検証しているディープラーニングによるコンピュータ将棋ですが、入力層のフィルターサイズについて見直しが必要と思っています。
飛車などの大駒に対して3×3のフィルターサイズは効果的でないので、駒ごとにフィルターサイズを分ける必要があると思っています。
フィルターサイズのバリエーションを自分で試して実験するのは時間がかかるので、Ponanza Chainerが情報公開を行う予定があるということなので、それを待っています。(まだかなぁー)

さて、今回からバリューネットワークの実装方法の確認を行います。

参考にするAlphaGoの手法は以下の通りです。

バリューネットワークの構成

バリューネットワークは、1から13層は方策ネットワークと同じで、出力層のsoftmaxに代わり、256ノードの全結合層の後に活性化関数がtanhの1ノードの全結合層にした構成となる。
出力は状態(局面)の価値(期待報酬)を表すスカラー値となる。

入力特徴

方策ネットワークの入力特徴に手番の色を追加している。

学習方法

損失関数には平均2乗誤差(MSE)を使用する。
RL policyで終局までプレイした結果(報酬)が教師データとなる。
よって、勾配は以下の式で表される。
\displaystyle
\Delta \theta = \frac{\alpha}{m} \sum_{k=1}^m (z^k - v_\theta(s^k)) \frac{\partial v_\theta(s^k)}{\partial \theta}

z^k RL policyで自己対戦した結果(報酬(-1,1))
v_\theta(s^k) 局面s^kの価値を表す関数(バリューネットワーク)
\alpha 学習率
m ミニバッチサイズ

学習局面のデータセットは、SL policyによる自己対戦によって、1手から450手までランダムに選んだ手数だけプレイした局面から1手ランダムに打った局面が使われる。

ミニバッチサイズm=32として、5千万ミニバッチを学習する。(局面数は1億6千万)


学習データがあれば、学習は普通の回帰問題であり、Chainerなどのフレームワークを使えば損失関数をmean_squared_errorとするだけでよく、実装は易しい。

学習データの生成は、GPUを使えば複数ゲームを並列で進行できるので、探索ベースのプログラムよりは早く生成できそうだが、それでも非常に時間がかかりそうである。

次回はバリューネットワークの実装を行う予定。