重み共有40ブロックモデルの学習

 ここのところeasy-to-hard論文の再現に執着している。

 重み共有をしたResNetで、「学習時のループ回数よりも検証時のループ回数を大きくしたときに、学習データにはないような難しい問題に対する正答率が上がる」ということを主張している論文である。重み共有ResNetとは、残差ブロック数個だけ生成し、それを複数回ループさせて適用するネットワークのことを指す。元論文では同じ2個を20回ループさせる、合計40ブロックで学習を行っていた。

 実験では2次元迷路を解く問題や、チェスの「次の一手」的な問題について学習・推論が行われている。

 個人的には厳密な再現というよりも、「学習時のループ回数よりも検証時のループ回数を大きくしたときに性能が上がる」という現象を得たいと思っている。別に簡単なデータで学習して難しいデータで検証したいというモチベーションはない。

 小さいネットワークでいくらか試していたが、再現する気配がなかったので、大きさが重要と見て40ブロックのモデルを学習させた。元論文では各ブロック512chだったが、流石に重いので手元では256chで行った。

 学習データはAobaZeroのもので、検証データはfloodgateのもの。難易度に大きく差があるとは思わないが、やや戦型などの傾向は違うと思われるので、多少は汎化性能が重要になるタスクだと思っている。

結果

 そもそも以前試した20ブロック(10ループ)よりも精度が出なかった。

f:id:tokumini:20210819211346p:plainf:id:tokumini:20210819211349p:plain
左: Policy損失 右: Value損失

 検証時にループ回数を変えてfloodgateの棋譜を与えてみたが、学習時の20より多くした方が良いという性質は得られなかった。微差ではあったが、むしろやや少なめの17ループあたりが一番良い結果であった。

f:id:tokumini:20210819211542p:plain

 他の実験として、今回はLibTorchで生成したパラメータで学習したという理由があり、検証時に中身を調べやすくなったので、いくらか気になっているところを調べてみた。

 まず、こういった重み共有モデルでは、ネットワーク内での推論が進んでいくにつれて表現が変化しなくなっていくということが報告されていたりする。

 手元でもそれを試してみたところ、同様の傾向であった。floodgateの適当な10局面をそれぞれ20ループまで推論を進めて、各局面のループi回目通過時の表現ベクトル(256×9×9)とi-1回目通過時の表現ベクトルについてコサイン類似度を計算した結果が以下になる。

f:id:tokumini:20210819211654p:plain

 局面によらず10ループもすぎれば類似度がほぼ1になり、つまりほぼ表現が変わらなくなっていることがわかる。

 これらは不動点だと見なすことができるだろうが、各局面で同じ(近い)不動点に来ているのか、それとも全然違うところへ行っているのかという疑問が生じたので、適当に選んだ2局面について各ループ回数での表現同士でコサイン類似度を計算した。結果は次のようになった。

f:id:tokumini:20210819211847p:plain

 縦横の2つの局面について、両方ループ回数20まで行った右下が一番類似しており、つまり近い不動点に来ているのだということがわかる。最初は類似度が低いので、出発点は違うところから、近いところへ収束していくような振る舞いだと思われる。

所感

 まぁパラメータは同一なのだから、不動点になりえるようなところはそこまで多くないのではないかと直感的には思う。つまりいろんな局面が収束していってしまうのは当たり前のようなことにも思えるが、局面の違いをきちんと認識するにはあまり嬉しくない性質なのではないか。

 ループが探索的に働くとすると表現が収束するというよりも、様々な局面を調べつつ記憶を更新していくという形になるのが望ましい気がする。どうすれば良いのだろうか。