pubDate: 2024-05-09
author: sakakibara
torchrl
強化学習はそのアルゴリズムの多様さから一つ一つを実装するには非常に手間がかかる。
そのため、ライブラリを利用することはコスト削減の一つの重要な手段となる。
torchrlはPyTorchをベースにした強化学習パッケージである。
特徴として外部のライブラリに多く依存しておらず、pytorchのみで動作することが強みだ。
モジュールを組み合わせることで多様な強化学習アルゴリズムを実装することができる。
未だ、メジャーバージョンが0であるため、ドキュメントを探しても404となっていたり、そもそも内容が古かったりすることがあるため、ソースコードを読むことが必要となる。
しかし、実装されているアルゴリズムは多く, オブジェクト指向というよりは論文で提案された関数をそのまま実装することができるようになっている。
並列化もサポートされているため、将来を見越した利益を考えると採用する価値があると言える。
torchrlの主要なモジュールは以下の通りである。
- envs: 環境を扱うモジュール
- data: データを扱うモジュール
- modules: actorなどを扱うモジュール
- objectives: 目的関数を扱うモジュール
- collectors: データ収集を行うモジュール
- record: ログを取るモジュール
- trainers: 学習を行うモジュール
このうち重要なモジュールは
- envs: 環境を扱うモジュール
- data: データを扱うモジュール
- modules: actorなどを扱うモジュール
- objectives: 目的関数を扱うモジュール
である。
実際にプログラムを作成する際にもこの順序で作成していくことが多い。
そしてもう一つ最重要とも言えるモジュールがある。それが
である。
以下ではtensordictについてざっと説明した後、torchrlを用いてCartPole(倒立振子)を解くプログラムを作成しながら、各モジュールの使い方を説明していく。
tensordict
名前から察することができるかもしれないが、tensrodictはテンソルを辞書的に格納するためのモジュールである。
イメージとしては以下のようなdictを高機能にしたものである。(実際のtensordictと異なることに注意)
なぜ、これが強化学習に必要かというとAgentとEnv間でやりとりされるデータをまとめて扱うためだ。
強化学習では、AgentとEnvの間で(observation, action, reward, next_observation)のように多くのデータがやりとりされる。これをバラバラに保持することはコードの見通しを非常に悪くするだけでなく、データの整合性を保つことが難しくなる。
また、やりとりするデータ項目を付け加えたいときにも非常に面倒になる。
tensordictはAgentとEnv間でデータを運ぶデータキャリアとして機能するのだ。
tensrodictを使用することで以上の問題から解法される。
以下の使用例はtensordictのdocumentからの引用であるが、tensordictの使い方を示している。
tensordictが非常に便利なものであると伝わっただろうか。
そして、tensordictを使い慣れてくるとtensordictをnn.Moduleに渡したいシチュエーションに度々遭遇することになる。
実は、nn.Moduleでtensordictを受け取れるように、nn.Moduleとtensordictの間に挟むwrapperがある。
それが次に紹介するTensorDictModuleである。
TensorDictModule
先ほど説明したように、TensorDictModuleはnn.Moduleとtensordictを適合させるためのモジュールで、tensorDictを入力として受け取ることができる。
TensorDictModuleにtensordictのkeyを指定することで、そのkeyに対応するテンソルをnn.moduleに流し込むことができる。
先ほどの例でloss_module
はTensorDictModuleで作成されている。
最もシンプルな例は以下の通りである。(公式から引用)
結果は
このように、TensorDictModuleはTensorDictのkey: “a”を受け取って、“a_out”という項目を新たに追加したTensorDictを返すことができる。
ここで、せっかちな読者のために注意すべきことを先に述べておく。
出力されたtensordictは入力されたtensordictを上書きしたものなので、新しい変数に代入すべきではない。
つまり、
気をつけてほしい。
また、TensorDictにしていするout_keyを[“out_1, out_2”]のように複数指定することで複数出力にも対応している。同様にin_keyを[“in_1”, “in_2”]のように複数指定することで複数入力にも対応している。
以下は2入力2出力の例である。
結果
TensorDictの紹介の最後にProbabilisticTensorDictModuleについて紹介しよう。
機械学習は確率分布をあつかうことが多く、このモジュールは避けては通れないだろう。
ProbabilisticTensorDictModule(確率的TensorDictModule)
結果は
となる。
ここで注目すべきはProbabilisticTensorDictModule
である。
ProbabilisticTensorDictModule
は確率分布を表すノンパラメトリックなモジュールである。
分布パラメータは入力であるloc
とscale
から取り出され、出力はaction
として書き込まれる。
この場合、平均と分散から出力が(対数に変換されているが)サンプリングされる。
この場合はdist.Normal
が指定されているため、正規分布からサンプリングされる。
次回ではtensordictの応用であるtorchrlのmodulesについて説明する。