昨日はドロップアウトの実装を行った。
今日はそれで実際に学習を行ってみた。
中間層のユニット数: 128、ドロップさせるユニット数: 32
まず、中間層のユニット数を128、ドロップさせるユニット数を32にして、1,000,000回、2,000,000回、3,000,000回、学習させてみた。
○側の結果
1,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 左、右:○勝ち
- 左上、下、右下:引き分け
- 上、右上、左下:×勝ち
2手目左と右に対しては勝てているけれど、2手目左上と左下に対して対応できてない。
2,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 左上、右、左下、下、右下:引き分け
- 上、右上、左:×勝ち
2手目左下に対しては引き分けに出来るようになっているけど、2手目左と右に勝てていたのが勝てなくなっている。
3,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 左上、右、左下、下、右下:引き分け
- 上、右上、左:×勝ち
2,000,000回のときから変化していない。
まとめ
学習が安定していなくて、あまりちゃんと学習できていない感じがある。
これは、ドロップした状態だと中間層のユニット数が96と減ってしまっているので、関数近似自体が上手くいっていない可能性が高いからだと思われる。
×側の結果
1,000,000回学習
初手中央に対する応手は右下。
これに対して、
- 左上以外は引き分け
- 左上は○勝ち
初手角に対する応手は中央。
ただ、3手目に対角の角をとると、○勝ち。
いずれの場合も、3手目に対角の角をとる手に対応できてない。
2,000,000回学習
初手中央に対する応手は右下。
これに対して、2手目に左上を選んだ場合もそうでない場合も引き分け。
初手角に対する応手は、
- 初手が左上、右上、左下の場合は右下で、これは○の勝ち。
- 初手が右下の場合は中央で、3手目に対角の角をとると、対応できていなくて○勝ち。
初手中央に対しては対応できるようになっているけど、初手角に対してはまだ対応できていない(むしろ悪化している)。
3,000,000回学習
初手中央に対する応手は右下。
これに対して、2手目に左上を選んだ場合もそうでない場合も引き分け。
初手角に対する応手は、中央。
ただ、3手目に対角の角をとると、○勝ち。
2,000,000回のときに比べるとよくなっているけど、まだ対応しきれていない。
まとめ
こちらもあまりちゃんと学習できていない感じ。
初手中央には対応できるようになっているけど、初手角に対しては(おそらく初手中央の学習に引っ張られて)場合によっては弱くなっていることすらあった。
中間層のユニット数: 160、ドロップさせるユニット数: 32
中間層のユニット数を128でドロップさせるユニット数が32だと、ドロップさせた状態では中間層のユニット数が96と減ってしまっているので、うまく学習できていない感じがあった。
そこで、次は中間層のユニット数を160、ドロップさせるユニット数を32にして(こうすれば、ドロップさせた状態で中間層のユニット数が128になる)、同様に1,000,000回、2,000,000回、3,000,000回、学習させてみた。
こちらは2回試したので、それぞれの結果を書いていく。
○側の結果(1回目)
1,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 下:○勝ち
- 左上、上、左、左下、右下:引き分け
- 右上、右:×勝ち
やはり安定していない感じがある。
2,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 左上、上、右上、左、左下、右下:引き分け
- 右、下:×勝ち
右上は引き分けに出来るようになっているけど、一方で下は勝ってたのに負けになっている。
3,000,000回学習
初手は中央。
それに対して、2手目によって以下のような結果に分かれた:
- 左上、上、左下、下、右下:引き分け
- 右上、左、右:×勝ち
下は引き分けになったけど、右上と左が負けるようになってしまってる。
まとめ
学習が安定していない。
学習を進めるほどに弱くなってる。
×側の結果(1回目)
1,000,000回学習
初手中央に対する応手は左上。
これに対して、2手目に右下を選んだ場合もそうでない場合も引き分け。
初手角に対する応手は中央。
ただ、3手目に対角の角をとると、○勝ち。
初手中央には対応できているけど、初手角には対応できていない。
2,000,000回学習
初手中央に対する応手は左上。
これに対して、2手目に右下以外なら引き分けになるけど、右下をとると○の勝ち。
初手角に対する応手は中央。
これに対して、
- 初手が左上/右下の場合、対角の角をとると○勝ち
- 初手が右上/左下の場合、対角の角をとると引き分け
初手角に対しては少し強くなっているけど、かわりに初手中央が弱くなっている。
3,000,000回学習
初手中央に対する応手は左上。
これに対して、2手目に右下以外なら引き分けになるけど、右下をとると○の勝ち。
初手角に対する応手は中央。
これに対して、
- 初手が左上/右下の場合、対角の角をとると○勝ち
- 初手が右上/左下の場合、対角の角をとると引き分け
2,000,000回のときから変化していない。
まとめ
初手中央と初手角の一方に強ければ他方が弱くなるという感じになってしまっている。
○側の結果(2回目)
1,000,000回学習
初手左上。
それに対して、2手目によって以下のような結果に分かれた:
- 上、左、右、下:○勝ち
- 右上、中央、左下、右下:引き分け
2手目辺に対してはちゃんとダブルリーチに出来ているけど、角に対してはダブルリーチに出来ていなかった。
2,000,000回学習
初手左上。
それに対して、2手目によって以下のような結果に分かれた:
- 上、左、右、下、右下:○勝ち
- 右上、中央、左下:引き分け
2手目右下に対してもダブルリーチをかけられるようになった。
3,000,000回学習
初手中央。
それに対して、2手目でどのように対応しても引き分けになった。
まとめ
正直、2,000,000回と3,000,000回の間に何があったのか謎すぎる・・・
1回目に比べれば負けはなくなっているのでマシだけれど、あまりうまく学習しているとはいえない感じ。
×側の結果(2回目)
1,000,000回学習
初手中央に対する応手は左下。
これに対して、2手目にどの手を選んでも○の勝ち。
初手左上に対しては、2手目中央で引き分けに出来る。
けど、初手に右上、右下の場合、2手目に中央を選べず、○勝ち。
また、初手に左下には2手目で中央を選べているのだけど、3手目で右上を選ぶと○勝ち。
全体的に学習が進んでいない。
2,000,000回学習
1,000,000回のときと同じ。
3,000,000回学習
初手中央に対する応手は左。
なので、○がダブルリーチをかけて勝ち。
初手角に対する応手は中央。
これに対して、3手目にどんな手を選んでも引き分けに出来ている。
初手角に対しては対応できるようになったけど、初手中央に対してはまったくダメ。
まとめ
あまり学習が進んでいない。
最後は初手角には対応できるようになったけど、初手中央に対する学習が全然進んでいない。
まとめ
結果が細かくなっていることからも分かる通り、全体的に学習が安定していない。
同じ角を選ぶにしても、左上を選んだときと右上を選んだときで結果が違ったりする。
これは、手を選択するごとにニューラルネットワークの構造が異なっているので、言うなれば、1手目はCOM1が、2手目はCOM2が、・・・と、異なるインスタンスが手の選択を行っているような状態になっていることが関係していると思う。
そのせいで、各構造ごとに同じ角でも左上と右上の出現確率が変わってくるため、判断が異なってくる、と。
もちろん、本当にたくさん学習を行えば、どの構造についても左上と右上の出現確率は等しくなってくるので、いずれは収束してくるのだろうけど。
けど、単純に考えると、160のユニットのうち32のユニットを使わないようにした場合、構造は通りあるので、学習回数はかなり多くしないといけないと考えられる。
それに、×側の学習を見ていると、初手中央に対する強さと初手角に対する強さは、この学習回数でも振動しているような感じがある。
もちろん、さらに学習を行うことで、この振動が落ち着いて、どちらにも強いようになるかもしれないけれど、やはりかなりの学習回数を要しそう。
あと、ドロップアウトさせる分だけ、中間層のユニット数を増やす必要があると考えられるので、1回の学習にかかる時間も増えている。
そのうえで、さらに学習の回数自体も増やさないといけないことを考えると、少なくとも、Rubyで学習を行うことは実行速度的に厳しい・・・
以上のことから、テーブル型である程度学習したあとそれを教師データとしてミニバッチで学習を行うようなオフライン学習では有効かもしれないけど、オンラインで学習していくにはあまりよくないかもしれない。
今日はここまで!