2021年9月23日木曜日

回帰型ネットワーク(LSTM1枚からまた2枚へ。あれ?)


 2枚のとは違うのか?

大した違いはないんじゃないだろうか。結局のところ回帰レイヤーは自分の出力が自分に返ってくるのでNユニットの2枚のLSTMでできることは2Nユニットの1枚のLSTMでだいたい可能である。(返ってくるまでに1ステップの時間がかかるので全く同じというわけではないが。)

同じユニット数だともちろん2枚の方が色々なキャパシティが上がるとは思うが、同時に回帰レイヤーのトレーニングは時間ステップを遡りながら行うので重くなりがちである。実際に1枚のものと2枚のものではだいたい3割程度、1ステップの学習速度に違いが出る。

一方シンプルな系(Atariのゲーム)で学習成果を試したところ、1枚のものも2枚のものもだいたい同じステップ数だと同程度のパフォーマンスになる。だとすると1ステップあたりの学習が早い1枚のものの方が有利だということだ。もちろん複雑な系の場合はどうなるか不明である。

最初2枚のものから始めたのは、PyTorchのデフォルトの値が2枚だったからで、特に深い理由はなかった。その後、OpenAIのDota2のAIがLSTM1枚で行われていることなどを知って、1枚の方がよいのではないかと思うようになった。

で、1枚のものと2枚のもの、試したところ実際どちらがよかったのかという話だが、残念ながら結論が出なかった。次の2枚の図を見ていただきたい。


上が1枚のもので、下が2枚のものである。枚数以外はほぼ同じ条件である。2枚のものはゴールラインの0.5を越えたので止めたが、1枚のものは越えなかった。Rewardだけ見ると勿論2枚の方が成績がよいのだが、このあたりの数値はノイズが大きくもある。Lossの値を見ると確かに1枚のものの方が早く収束しているし、値も低く保たれている。Qの最終値も大きいし、何なら先に0に到達したのは1枚のものの方だ。どちらが先に0.5に到達したかというのは、偶然性の寄与するところが大きいように思われる。

問題はこの後だった。2枚にしようかな、と思ってその先に進んだ結果、途中で成長が止まってしまったのだ。次の図はLv2をクリアした2枚のモデルでLv3に進んだ結果である。

まだ順調に進んでいる。Qの値がふらついているのも相手の変化に合わせて再調整したためと読みとれる。そして、Lv4である。
突然勝率を下げ始めたのである。行動にもおかしな様子が顕著に現れていた。自滅の数が極端に多くなったのである。Qも下がりっぱなしで元に戻る気配もない。このあと2枚のモデルでLv3の最後から始めたり、3ストックにしたりLv2まで戻したり、1枚のモデルでやったり学習率を上げたりしたが、結局どのモデルもある段階まで学習すると、そこからパフォーマンスを下げて戻らなくなることのが観測された。回帰ネットワークを導入する前は確かそのようなことはなかったと思うのだが、これはいったいどういうことなのだろうか…。
次の記事では、なぜそうなったかの仮説と、解決策についての議論をする。







2021年9月20日月曜日

回帰型(再帰型)ネットワーク(LSTM2枚)

 強い。

時系列予測などによく用いられる回帰型ネットワークを実装した。英語では Recurrent Neural Network (RNN) と呼ばれ、再帰型ネットワークとも訳される。出力を次のステップの自分の入力に入れることでループを形成し、原理的には無限ステップ離れた過去の情報にもアクセス可能になる。詳しい説明はこちらの記事などを参考にされたい。(英語が読める場合はこっちのブログ記事の方がいいかも。) 今回の実装ではLSTM(Long-Short Term Memory; 長-短期記憶)という型のRNNを用いる。

時系列を認識するタイプのネットワークなので、時間の流れを適切な順序で入れてやる必要がある。今までの学習方法ではランダムな時間を取り出してきてトレーニングしていたので、変更する必要があった。新しい方法では1試合のデータを丸ごと取り出してきて、それを1から試合終了まで順番に入れることになった。バッチサイズは今まで通り32でも大丈夫なようだった。これに伴ってメモリ構造を一から書き直す必要があり、更に Prioritized Memory が(実装が面倒だという理由で)失われた。一応こちらの論文を参考にして、完全にランダムにリプレイメモリから情報を取り出すのではなく、最後にやった試合を必ず一度は読み込むような形の実装にした。

裏でこっそり実験していた Space Invaders や Kangaroo などのゲームは元のRainbowと遜色ないペース(あるいはもっと早く)でクリアしてしまった。AIガオガエンで試してもその強さは健在で、1ストック制の試合だと1日も経たずにLv1やLv2をクリアしてしまう。

これはLSTMレイヤー2枚の結果である。まずはLv1から。

途中でメモリ構造を変えたのでLossとQの値がおかしくなっているが、1200エピソード程度でクリアしたことがわかる。次にLv2のデータである。
Qがおかしくなっていたので最初からやりなおしたものだが、ほぼ同じような振舞いで1600エピソードでクリアしている。ガオガエンの挙動自体も興味深く、ロープスイングから頻繁にラリアットを決めたり速い段階で復帰らしいこともするようになっている。
LSTM2枚のモデルの途中で1枚にする実験などを挟んだが、この記事では2枚の結果だけをまとめて載せる。Lv3の結果は以下の図である。
上の図のLv2からの継続で、2500エピソードほどでクリアラインの0.5に到達している。目覚ましい成果である。このあとLv4に行くのだが、そこで次のような結果を出す。
Lv3での成果はどこへやら、勝率を大幅に落としてしまい、更にQも上がっていかない。これはどうしたことかと思い、一度Lv3終了時に戻ってそこからLv3を継続してみることにする。(ここで自滅が気になったので3ストック制に戻す。)
2700エピソード目あたりからが新しいデータになるが、結局Lv3に戻ってもスコアが伸びることはなく、むしろ下降していく傾向が見られた。

もしかするとLv3に上がってしばらくすると戦術の再調整を迫られることになり、必然的にスコアが下がるのかもしれない。だとすると最適なポリシーを再評価するまで淡々とトレーニングを続けないといけないのかもしれない。もう少し早く学習ができるネットワークで長期間回す必要があるのかもしれない。

次回は1枚レイヤーのRNNについて書く。

2021年9月16日木曜日

Lv4における2週間の停滞

何が成長を阻害している…?

もちろんLv3も順調ではなかったが、無事にLv3を乗り越えて帰ってきたLv4も順風満帆とはほど遠いものだった。Lv3を終えてからの二週間の修行の結果がこちらである。

(Reward: 報酬、 Episode Length: 各エピソードの長さ、 Q: 報酬予測値、 Loss: 予想と現実の差、 それぞれ20試合分くらいの移動平均)

何か変わった? むしろ悪くなってない…? 11000エピソードあたりから少し上昇した気はするけれど、最後下がってるし…。

また何週間かすれば上がってくるのかもしれないし、このまま落ちていくのかもしれない。

この間何もなかったわけではない。このエージェントのコードが公開された。整理するのは大変だったけれど、環境を綺麗にしておくと開発が楽になるので自分のためになる。

そして開発を楽にした結果、実際に開発を始めたのである。リカレント(再帰・回帰)レイヤーを含むエージェントである。これについての詳細は次項に持ち越すことにする。

2021年9月3日金曜日

Lv4 への寄り道と Lv3 への栄光の帰還、そしてまた Lv4へ


 Lv3マルスは倒れた。

前の記事でどうしてもLv3を倒せずに停滞した話をした。作戦会議の結果、Lv4に行ってみることにした。同時にこちらの論文のFigure 4でライフが複数あるタイプのAtariのゲームだと、ゲームオーバーでエピソード終了にするよりも、ライフが1つ失われた段階でエピソード終了にする方がスコアの伸びがよい、という結果が出されていたことを思い出したので、それをスマブラに適用してストックを1つにする変更もした。

その結果がこちらである。

Rewardは微妙に上がった。QはLv3のときのものを引き継いだのでLv4に合わせて下降した。後半も振動は見られるが顕著な上昇は見られない。これが約一週間のトレーニングの成果である。

1ストック制に移行してからゴールをどこに設定していいのかよくわからなかったのだが、3ストックのときに1.5だったので、単純に計算して0.5にしてみた。Lv4では0.0に触れることもかなわなかったわけだが、一週間Lv4で修行した結果、Lv3ではどうなるのか…。その結果が次のグラフである。

なんと、始めてから一日も経たずにゴールラインの0.5を越えてしまったのである。Qの調整が行われてLv3用の戦い方になるのに1500から2000エピソード程度かかった節はあるが、いともあっさりと設定したゴールラインを越えてしまった。

正直なところ、統計的なゆらぎを考えると3ストックで1.5のゴールの方が1ストックで0.5のゴールよりもシビアな気はするので、実際に強くなったから攻略したのか、単純に上振れが激しく起こったからなのかはわからない。しかし、0.5を複数回越えてそのあたりでしばらく滞在している様子を見るとまあ合格点にしてもいいんじゃないかという気はする。

というわけで晴れてLv4に進むことになった。ストック数は1を維持していきたいと思う。既にある程度データがあるので今後どう伸びるのかが楽しみである。

こうなってくるともうひたすら時間をかけてトレーニングさせるより他ない気がしてきた。

トレーニングの様子はずーっと配信しているので、進捗はYouTubeの配信でどうぞ。

https://www.youtube.com/channel/UCTR4c0xE-pIFgSoE6bFVPmw