若き研究者の日常

技術寄りの事かポエムを書く。

ボードゲーム強化学習をする際に思ったこと/ データセット保存する際にハマった点

最近ボードゲーム強化学習手法を適用しようと試行錯誤しています.

修論発表や他の論文発表準備やら新年度からの金策準備でてんてこ舞いなんですが,なんとか時間捻出して実装してみたいので,1週間弱くらい部屋にこもって風呂入らずにカタカタしています.汚ねえ.

今やってることは論文出したいので大局的なところは書きませんが,実装することでなんとなくこれまではTD学習,Q学習,SARSA,Actor-Criticとか机上で覚えてきたことばっかだっただったのが一部だけでも身に染み付くような感覚になるので,実際の実装の中身をのぞいていじるのはとても楽しいです.

例えば, Online学習とOffline学習の2つの実装を対比して比べることにより, より2つの実装の必要とされている場面を想像できるような気がします.Offline学習手法はミスが許されないような環境にデプロイするというのは授業で習ったことですが,実際に取得したデータからどうstateやrewardを付加していくか考える際にOnline学習が有効になりそう,つまりソリッドなデータセットもない条件で作るプロトタイプにはOnline学習環境を整えるべきとか.

あとは題材にするゲームについて,ボードゲームは駒のルールといった制約付き,行動空間や状態が非常に多いしかし空間は離散的に処理できる,その一方でHalfcheetahとかmujocoっぽいアレらは空間が連続的だけど次元数は少ないとかそういう実装上の常識についても学びました.素人的に強化学習始める前はボードゲームの方がmujocoとかより簡単やない?と思ってましたが,こっちの方が変な制約を考える方に頭が削がれる(行動空間が状態によって可変だし)のでむずくね?って思ってます.分かんないけど.

あとはMuZeroがなんでアルゴリズム無しに勝手にそれぞれのボードゲームのルールを学ぶんだと思ってましたが,あ,Offline強化学習でデータセットから学ばせるのか,とか(そもそも最初はOnline強化学習しか頭になかったので強化学習でデータセットを使うという発想がなかった...はずかし).

今は古典的なDQNでオンライン学習させて,それで得た棋譜とそれに応じた軌跡のデータを収集しようとしている段階です(オフライン学習させてみたいので)

今日引っかかったところですが,observationの保存をミスってTensorで保存してたのですが,1軌跡だけで3.5GBになるくらいデータ量が爆発しちゃいました*.listでやり直したら11MB** (それでも1軌跡としてはデカイ...).(余談,あとでnumpyでやり直したら17.6MB)

tensorで保存したら30分くらいかかりました.一方でlistでobservation保存したら47秒.ちなみにnumpyは30秒.

*中身を覗くと

'observations': array([list([tensor([0, 0, 6]), tensor([0, 1, 6]), tensor([0, 2, 6]), tensor([0, 3, 6]), tensor([0, 4, 6]), tensor([0, 5, 6]), tensor([0, 6, 6]), tensor([0, 7, 6]), tensor([0, 8, 6]), tensor([1, 0, 8]), tensor([1, 8, 8]), ....

**中身を覗くと

'observations': array([list([[0, 0, 6], [0, 1, 6], [0, 2, 6], [0, 3, 6], [0, 4, 6], [0, 5, 6], [0, 6, 6], [0, 7, 6], [0, 8, 6], [1, 0, 8], [1, 8, 8], [2, 1, 8], [2, 7, 8], [3, 2, 8], [3, 6, 8], [4, 7, 7], [5, 1, 7], [6, 3, 8], [6, 5, 8], [7, 4, 8], [14, 0, 2], [14, 1, 2], [14, 2, 2], [14, 3, 2], [14, 4, 2], [14, 5, 2], [14, 6, 2], [14, 7, 2], [14, 8, 2], [15, 0, 0], [15, 8, 0], [16, 1, 0], [16, 7, 0], [17, 2, 0], [17, 6, 0], ....

***中身を覗くと

'observations': array([array([[ 0,  0,  6],
              [ 0,  1,  6],
              [ 0,  2,  6],
              [ 0,  3,  6],
              [ 0,  4,  6],
              [ 0,  5,  6],
              [ 0,  6,  6],
              [ 0,  7,  6],
              [ 0,  8,  6],
              [ 1,  0,  8],...