TadaoYamaokaの開発日記

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

コンピュータ将棋におけるディープラーニングの考察

先日の日記で、コンピュータ将棋とAlphaGoについて言及したが、次のPonanzaがディープラーニングに成功したということで、どのように適用しているのかが気になっている。

そこで適当に考察してみる。

電王戦のインタビューでもプロの棋譜との一致率について言及していたことから、学習しているのは評価関数ではなく方策(policy)であると思われる。

入力に盤面の情報を与えて、出力に指し手の確率を出力する関数である。

入力

ポイントとなるのが、入力の盤面の情報の与え方であると思う。

AlphaGoでは19×19の各座標の白石、黒石、空きで3チャンネル(2値)の情報と、アタリやシチョウなどの若干の囲碁の知識を特徴量として各チャンネルに割り当て、合計で48チャンネルのデータを入力としていた。

将棋では、駒の種類が多いため、成りを含めた14種類のコマ数分のチャンネルが必要になる。
また、持ち駒もあるため、9×9の座標の他に、持ち駒の表現が必要になる。

畳み込みでは、位置の情報が重要であるため、なんらかの方法で位置に対してノイズとならないように入力してあげる必要がある。

また、AlphaGoでは盤面の情報の他にアタリやシチョウの場所なども与えているので、将棋の知識から2歩の場所などは与えた方がよさそうである。

出力

出力は、AlphaGoでは石を置く場所を表す19×19の1チャンネルで良かったが、将棋では座標の他に、どの駒が移動するか、成るのか、持ち駒から指すのかという情報が必要になる。

インタビューで、ルールを教えなくても正しい結果がでるようになったと言っていたので、移動については考慮せず、座標と駒のみを出力して、どこから移動したかは後からロジックで見つけているのかもしれない。
その場合、移動元が一意に決まらないケースがたまにあるという問題がある。

移動元と移動先の座標をそれぞれのチャンネルとして出力しているのかもしれない。

ネットワーク構成

ニューラルネットワークの構成は、AlphaGoではプーリングなしの13層の畳み込みニューラルネットワークだったが、似たような構成でよいかもしれない。

学習

以上の入力と出力、ネットワーク構成の設計ができたら、AlphaGoと同様にプロの棋譜から指し手を教師データとして誤差逆伝播で行うことができる。
AlphaGoのSL policy networkでは50GPUで3週間かかっているので、おそらく収束にはかなりの計算リソースが必要になると思われる。

方策改善

AlphaGoのRL policy networkと同様の方法で、自己対戦により強化学習の手法で、方策改善を行うことができる。

AlphGoの論文では以下の論文が引用されている。
Williams, R. J. Simple statistical gradient-following algorithms for connectionist reinforcement learning. Mach. Learn. 8, 229–256 (1992).

この論文で提案されているのは、REINFORCEアルゴリズムという、関数近似手法を使い強化学習を一般化したものである。

価値関数の学習

AlphaGoのValue networkと同様の方法で、方策から価値関数を学習することができる。

大量の異なる局面からRL policy networkの方策に従い最後までプレイしたときの報酬から、価値関数を回帰により学習する。

対戦時の方法

AlphaGoでは、モンテカルロ木探索の着手予測にSL policy networkを使い、プレイアウトの結果とValue networkの結果の平均をとることで、うまく従来の手法と組み合わせている。
ディープラーニングでは読みの部分で弱点があるので、プレイアウトで補っているものと思われる。

将棋は、囲碁以上に読みが重要なゲームであるため、ディープラーニングのみで指しても強くないと思われる。
探索とうまく組み合わせる必要がある。

先日の日記で書いたように、従来の探索を使用し、学習した方策を枝刈りに使用し、学習した価値関数を探索の末端の評価関数に使用することでディープラーニングを従来の探索と組み合わせて使えると思う。

以上、1行もコードを書かずに勝手に考察してみました。

PonanzaもAlphaGoのように論文を書いてくれることを期待してます。

そうしたら来年のコンピュータ将棋はディープラーニング一色に染まりそうですね。

追記

上で書いた内容は、専門家でない私の勝手な考察なので、おそらく全くの的外れです。
あまり参考にしないでください。

チェスでの先行研究の情報を追記しておきます。

チェスでのディープラーニングの実装があるようです。
Deep learning for... chess · Erik Bernhardsson
これは、方策ではなく評価関数を学習しています。

この論文では、評価関数と実現確率を学習しているようです。363個の特徴を入力しており、入力特徴の設計の参考になるかもしれません。
[1509.01549] Giraffe: Using Deep Reinforcement Learning to Play Chess

このサイトで研究がまとめられています。
https://chessprogramming.wikispaces.com/Deep+Learning

追記その2

後日、実際に実装して試してみました。
将棋でディープラーニングする - TadaoYamaokaの開発日記
将棋でディープラーニングする その2(ニューラルネットワークの構成) - TadaoYamaokaの開発日記
将棋でディープラーニングする その3(棋譜から学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その4(ネットワーク構成の変更) - TadaoYamaokaの開発日記
将棋でディープラーニングする その5(入力特徴に手番を追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その6(BatchNormalizationを追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その7(最適化手法の変更) - TadaoYamaokaの開発日記
将棋でディープラーニングする その8(出力に移動元を追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その9(王手を入力特徴に追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その10(入力特徴から盤面の空の位置を削除) - TadaoYamaokaの開発日記
将棋でディープラーニングする その11(Kerasの実装) - TadaoYamaokaの開発日記
将棋でディープラーニングする その12(Wide ResNetを試す) - TadaoYamaokaの開発日記
将棋でディープラーニングする その13(ハイパーパラメータの調整) - TadaoYamaokaの開発日記
将棋でディープラーニングする その14(floodgateの棋譜で学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その15(強化学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その16(対局できるようにする) - TadaoYamaokaの開発日記
将棋でディープラーニングする その17(強化学習の実装) - TadaoYamaokaの開発日記
将棋でディープラーニングする その18(報酬に応じた勾配) - TadaoYamaokaの開発日記
将棋でディープラーニングする その19(報酬に応じた勾配 その2) - TadaoYamaokaの開発日記
将棋でディープラーニングする その20(バリューネットワーク) - TadaoYamaokaの開発日記
将棋でディープラーニングする その21(elmoの学習データ) - TadaoYamaokaの開発日記
将棋でディープラーニングする その22(評価値と勝率の関係) - TadaoYamaokaの開発日記
将棋でディープラーニングする その23(バリューネットワークの実装) - TadaoYamaokaの開発日記
将棋でディープラーニングする その24(歩の持ち駒の上限) - TadaoYamaokaの開発日記
将棋でディープラーニングする その25(C++でミニバッチ作成) - TadaoYamaokaの開発日記
将棋でディープラーニングする その26(学習の高速化) - TadaoYamaokaの開発日記
将棋でディープラーニングする その27(対局できるようにする) - TadaoYamaokaの開発日記
将棋でディープラーニングする その28(学習の高速化その2) - TadaoYamaokaの開発日記
将棋でディープラーニングする その29(強化学習【修正版】) - TadaoYamaokaの開発日記
将棋でディープラーニングする その30(探索アルゴリズム) - TadaoYamaokaの開発日記
将棋でディープラーニングする その31(DNNのスループット) - TadaoYamaokaの開発日記
将棋でディープラーニングする その32(転移学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その33(マルチタスク学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その34(強化学習【成功】) - TadaoYamaokaの開発日記
将棋でディープラーニングする その35(マルチタスク学習(補足)) - TadaoYamaokaの開発日記
将棋でディープラーニングする その36(PUCTアルゴリズムの実装) - TadaoYamaokaの開発日記
将棋でディープラーニングする その37(利き数を入力特徴に追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その38(学習継続中) - TadaoYamaokaの開発日記
将棋でディープラーニングする その39(ブートストラップ) - TadaoYamaokaの開発日記
将棋でディープラーニングする その40(入力特徴に履歴追加) - TadaoYamaokaの開発日記
将棋でディープラーニングする その41(モーメントありSGD) - TadaoYamaokaの開発日記
将棋でディープラーニングする その42(ValueNetの出力をtanhにする) - TadaoYamaokaの開発日記
将棋でディープラーニングする その43(ValueNetの出力をtanhにする2) - TadaoYamaokaの開発日記
将棋でディープラーニングする その44(L2正則化) - TadaoYamaokaの開発日記
将棋でディープラーニングする その45(高速化) - TadaoYamaokaの開発日記
将棋でディープラーニングする その46(出力ラベルの表現方法) - TadaoYamaokaの開発日記
将棋でディープラーニングする その47(全結合) - TadaoYamaokaの開発日記
将棋でディープラーニングする その48(ResNet) - TadaoYamaokaの開発日記
将棋でディープラーニングする その49(再学習) - TadaoYamaokaの開発日記
将棋でディープラーニングする その50(ブートストラップ【訂正】) - TadaoYamaokaの開発日記
将棋でディープラーニングする その51(ディリクレノイズ) - TadaoYamaokaの開発日記
将棋でディープラーニングする その52(自己対局で教師局面生成) - TadaoYamaokaの開発日記