以下の続き。
前回は上手くいかなかった学習をなんとか多少は改善することができた。修士論文としてはとりあえずこの方針の結果で許してもらいたい、という気持ちです。
基本的な手法は冒頭で示した前回と変わらず、事前学習したモデルのPolicyが示す確率に従って行動をサンプリングし、局面の系列を得る。このときルート局面から3回動かしたらまたルート局面まで戻す。全体の系列長は10で行ったため、3回動かした局面の系列が3個+1回動かした局面という10個の表現ベクトルがTransformerのEncoder側に入力される。TransformerのDecoder側には常にルート局面の表現ベクトルが入力される。
前回から変えた点は、
- LibTorchの1.7.0リリースにより公式のTransformerが使えるようになったのでそれを利用するようにした
- Positional Encodingをランダム初期化した学習可能な値を用いるようにした
- 損失計算で今までは10回の系列入力について毎回損失を計算していたが、10系列まとめて入力した最後にだけ損失を計算するように変更した
の3点である。おそらく重要だったのが一番最後の点であり、これにより一気に傾向が変わったような印象がある。また損失計算を最後だけにすると計算も速くなり、事前学習のない場合もなんとか2日程度で学習ができるようになった。
結果
実験はどれもオセロで行った。
事前学習あり
まずシミュレータを行うための普通のFeedforwardネットワークを教師あり学習で学習させた。検証損失は以下の通り。
最終的に値は0.774083となった。
パラメータを固定したこのモデルを用いて局面系列のサンプリングおよび入力する局面のエンコードをし、Transformerを学習させた結果が以下となる。(これらは同じ棋譜を用いて同じように検証損失を計算している)
オレンジ色の線が事前学習で得られたモデルであり、それより性能が良くなった。
学習後、最終ステップ時点のモデルにおいて各系列長(探索回数)の時点で切り上げてTransformerに損失を計算させると次のようになった。
わりと最後の方でも系列が増えることによる性能向上が見られているので悪くないように思える。
事前学習なし
事前学習なく、Transformerの学習と同時にサンプリング、エンコード用のモデルも学習させ、Transformerの勾配もエンコーダ側まで流すようにして実験を行った。
先程と異なり探索なしのオレンジ線も学習に伴って下がっていくが、事前学習よりも少し悪い程度で留まった(これは事前学習の方がステップ数が多かったという理由が大きそうではある)。Transformerの方の学習も事前学習ありの場合とそこまで変わらない。
同様に学習済みモデルについて、各系列長(探索回数)の時点でTransformerに損失を計算させると次のようになった。
0回の時点でもそこまで悪くないのが多少異なる点ではある。単なる学習のブレか、本質的な違いかはわからない。
ちなみに事前学習ありのものでも同様だが、系列長10で学習させたものに、学習後無理やり系列長20までサンプリングして与えてみたところ、当然のように性能は悪化した。
Positional Encodingのランダムなところが学習されてないので当たり前なのだが、これは本家Transformerの三角関数を用いたPositional Encodingに戻せば汎化できるのだろうか。
今後やること
- 系列長を20で学習した場合にどうなるか(学習コストが大きいのでやれても30くらいまでかなというところ)
- そもそもTransformerではなくてLSTMではダメなのか
- Positional Encodingを三角関数を利用するものに戻してやりなおす
なにか疑問点があればコメントいただければ僕の修士論文が少しだけ良くなるかもしれません。