今週はDecision Transformerの実装をしていたが、あまり上手くいっていない。
題材としては先週と同じで丸をクリックさせるタスクをやっており、ランダムエージェントで動かした100MステップのデータからDecision Transformerを学習させて、Returnに応じた方策が学習できている事自体は確認できた。
しかし、動かすときにReturn1を目標として動作させると、Return1を得られる場合の行動しか取らないようになってしまう。つまり、カーソルが丸の中に入っていないのにクリックを連打している。確かに、最終的にはクリックで報酬が入るのでクリック動作自体が強くReturn1と結びついてしまうのはそうなのかもしれない。
どうもTransformerが画像情報を上手く拾えていない気がする(のでReturnだけに依存した振る舞いをしている)。系列長を小さくするためにだいぶ大きいパッチサイズにしているのが良くないのかもしれないし、画像部分の位置エンコーディングとして学習可能なものではなく三角関数ベースでのx,y位置を指定するものの方が良いのかもしれない。あるいはCNNで埋め込みにいくか。このあたり結局どうした方が良いのかというのが難しい。
簡単な題材から始めているつもりだったが、これでも全然簡単でなかったということがわかってきたので、さらに簡単にするためGUIから離れてグリッド世界でのActor-Criticからやり直している。
3x3のグリッド世界で、これまでと同じように上下左右移動 + クリック動作で、自己位置とターゲット位置が重なっているときにクリックした場合だけ報酬を与えるということにする。3x3ならテーブルに乗っけられるのでそれでActor-Criticを書いて、ひとまずこれは1ステップのオンライン学習で上手くできることを確認した。
ここからまた(1)CNNベースニューラルネット、(2)Transformer で、それぞれどうなるのかというのを見ていくことになるだろうか。グリッドを適宜広げていくと簡単にスパース報酬タスクになるので、この状態でいろいろ試行錯誤することになりそう。
競技プログラミング
本当は日曜のコンテストまで終わってから書きたいところだったが、今日はAGCだったので原理的に無理だった。
- ABC333 : パフォーマンス2190 レート1770(+58)
前回に続いての成功で戻ってきた。これくらいが今の適正値なのではないか。もう少し下かな。
FのDPがわりと早く解けているかもしれず、自分はひょっとしてDP得意な部類に入るのだろうか? まぁ競技プログラミング歴で言ったら長い方ではあると思うので、典型DPというのはまだ戦える分野なのかもしれない。