自分のブログを見ていると、一年前の8月に動かそうとしているので、大体一年かかってようやく動く所まで来た。
去年の8月の記事
いろいろと気になったところをまとめてみる。
全体の感想。
一年かけてこの程度しかできなかったか・・・というのが正直なところ。もう一回やるとしたら二人がかりで3ヶ月あればいけると思う。Diffusion PolicyでなくPPOですむならPPOでやった方が良い。PPOはどんなシミュレータでもだいたいサポートしているし、報酬与えればそれっぽく動く。超簡単。
最初の失敗は、シミュレータ無しでいきなり実機を動かそうとしたところ。Diffusion Policyは拡散モデルを使った模倣学習なので、お手本となるデータがあれば学習時にはシミュレータは不要。手持ちのロボットでデータを集めて学習して、実機で動作確認しようとした。結果、学習が上手くいったのかどうなのかもさっぱりわからず挫折。多分、そのまま押し切っても動かなかったと思う。これで半年は無駄にしている。
昨年末にGenesisがガッとでてきて、ワールドトリガーで麓郎がヒュースに正論パンチを浴びて、方針を見直した。まずはシミュレーションをちゃんと動かす、一気にDiffusion Policyに行かず少しずつ刻む、正月にそういう思いでやり直したのが良かった。目標が高ければ小さく刻もう。
五月にロボティクス勉強会で発表して、ここでいろいろ教わったのも良かった。
みんなもロボティクス勉強会参加しような。外で発表するとモチベーション維持につながる。
試行錯誤しながら、データ生成、学習、結果確認までできるようになると、進捗がでるようになった。まずはそこまで行くのが大事。このまとめに加えてアルゴリズムも整理したら、勉強会の恩返しにはなっていると思う。
進め方について
ロボットの強化学習、模倣学習は一人でやる開発じゃない。シミュレーション側と、学習側で2人体制は欲しい。例えば、シミュレーションの動作確認のために、決まった値を出力するようなダミーのポリシーはほしいし、逆にシミュレーションは何もしないようなダミー環境で学習の環境構築を加速するようにしたい。
シミュレーションもGenesis単体で動く時はTorchのTensorだけでよいけど、Diffusion Policyの環境と合わせようとするとnumpyで返してほしかったり、動き見るだけのGPUを使わない環境で動く物が欲しかったり、いろいろやりたいことはあるが、一人でやってるとどうしてもめんどくせーになってしまう。
振り返ってみるとシミュレータは必須。動作確認と学習データの生成に使う。実機でデータも集められるが、今回やったようにロボの初期値をランダムに振った状態のデータを作り直すとかは、シミュレータないとだいぶ辛いと思う。
新しいことをする前にPPOを動かす。分類タスクだと簡単なMLP、画像系ならとりあえずResnetみたいなのりで、まずはPPOを動かす。PPOを動かしながら、ログの取り方等を整備していく。PPOも動かないようだとタスクの設定がおかしい可能性がある。心が折れそうなときにPPOで動いた動画を見返し、僕はできる子と自信を取り戻すのにも使える。
PPOが動いたら、次はなんとかデータ生成、学習、結果確認までできるようにする。仕事では1パス通すと呼んでいる。1パス通すためにはタスクをできる限り単純にしていく。ピッキングロボットであれば何かしらのカメラで取りに行って欲しいが、難易度を下げるために対象物の座標はわかっていることにして数値で与える。一回動いてから難しくしていくのが重要。
1パスが動いたら
あとはソースを整理しながら、データの入力から順番に確認していく。最初にやったのが、データのフォーマットをcsvからjsonに変えたこと。csvは作業の間が空くと何のデータかわからなくなる。個人でやる模倣学習ならデータはせいぜい数千の単位なのでjsonでも特に問題ない。一回は見ているはずけど、念のために学習環境で期待通りのデータが読めているか見ていく。
後は動かない事について仮定を立て仮定が正しいかどうかを順番に確認していく。ここのモチベーション維持がきつかったが、幸いにしてどんどん良くなっていたので最後までいけた。このときもタスクの難易度を下げられるなら、下げてちゃんと動く状態を作っていく。最初のアイドルっぽい動きを無くしたり、まずは角度は無視してロボが手をコンスタントに下げるようにした。その後に角度を合わせるようにし、順番に良くしていく。
結局Gym
Gym環境が鬼門で、そもそもGym環境はPPO的な1stepで1observationを返すことを想定していて、なかなかモダンな手法がそのままでは動かない。そこを補うために独自Wrapperを使って拡張しているんだけど、そこがよくわからなくて困った。情報も多くなくAIに聞いても試行錯誤を繰り返した。 Gymのバージョンも0.21.0しか動かず、古いバージョンのノウハウ貯めるのも乗り気がしなかった。
この後
順当に行くと
- OctaとかDiffusion Policy Policy Optimization等の新しい手法を試す
- タスクの難易度を上げていく。カメラ付けるとか。
- 手持ちのロボ(実機)で動かせるようにする。
- エネルギーベースモデル等、使われている数式と実装を押さえていく。
等が思いつく。どれも大事。
ただ、一年やってきてちょっとモチベーション下がっていて、しばらくいろいろ積んである本を読みたい。