昨日は関数近似にHMEを使ったSarsa()法の実装を行った。
今日はそれを使って実際に学習を行ってみる。
HMEの構成
学習を行うにあたって、HMEの構成は、TD Learning of Game Evaluation Functions with Hierarchical Neural Architecturesとほぼ同じ構成にした。
すなわち、以下の通り:
- 階層は1階層
- エキスパートネットワークは2つ
- それぞれのエキスパートネットワークは関数近似のためのニューラルネットワークで、中間層のユニット数は64
これで、1,000,000回、2,000,000回の学習を行ってみた。
学習結果
○側の結果
1,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 上、左、下:○勝ち
- 左上、右上、左下、右下:引き分け
- 右:×勝ち
かなりいい感じだけど、2手目右のときだけ相手のリーチを防げずに負けている。
2,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 上、左、右、下:○勝ち
- 左上、右上、左下、右下:引き分け
ちゃんと2手目が辺のときにはダブルリーチをかけて勝っているし、2手目が角のときにも引き分けに出来ている。
×側の結果
1,000,000回学習
初手中央に対する応手は左下。
これに対して、2手目に右上を選んだ場合もそうでない場合も引き分け。
初手角に対する応手は中央。
これに対して対角の角をとったとき、左上-右下の形だと○勝ち、右上-左下の形だと引き分け。
初手中央には対応できているけど、初手角への対応はまだ不十分。
2,000,000回学習
初手中央に対する応手は左下。
これに対して、2手目に右上を選んだ場合もそうでない場合も引き分け。
初手角に対する応手は中央。
これに対して、2手目に対角の角をとったときも引き分け。
どの形でもちゃんと引き分けに持ち込めるようになっている。
まとめと考察
以上のように、関数近似にHMEを使った場合、論文と同じ構成にすると、確かにけっこういい感じに学習できた。
厳密には、他の構成だとどうなるのかも試さないと、評価はしづらいんだけど、ちょっと時間がなくて試せていない・・・
(学習にけっこう時間がかかるので。高速化は課題)
ただ、これは複数のインスタンスを協調して学習できた結果というよりも、HME自体の持つ関数の表現力が、うまく○×ゲームにあっていたからという感じはする。
そうなると、どのような構成がそれぞれのゲームに対して有効なのかというのは、課題とも言える。
試せていないけど、自分が今考えているのは、カスケード式の構成。
これは、規模の異なるニューラルネットワークをフラクタル状に連ねる構成で、例えば次のようなもの:
[64, [32, [16, [8, 8], [8, 8]], [16, [8, 8], [8, 8]]], [32, [16, [8, 8], [8, 8]], [16, [8, 8], [8, 8]]]]
一つの階層は[a, b, b]
の形をしていて、そのbを見たときに、やはり同じように[a, b, b]
の形が出てくるようになっている。
(一番下の階層と一番上の階層は除く)
そして、一つ下の階層のaのサイズは、一つ上の階層のaの1/2のサイズになるようにしている。
こうすることで、適切なサイズのニューラルネットワークが使われるようにならないかな、と。
もちろん、構成の規模が大きくなるので、学習にかかる時間も増えるだろうから、この構成を試すくらいなら、いくつかのシンプルな構成を何度も試した方が、結果的に効率がいいかもしれないけど。
今日はここまで!