ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Diffusion Policyの学習にはシミュレーターが要らないという話

Diffusion Policyの話。

github.com

ここにあるコードを動かそうとすると、シミュレーターとしてGym環境が必要。論文を読んでいても、拡散モデルで軌道生成まではわかったが、それと強化学習が結びつかない。NNは次のActionを出力するから実質Policyなんだけど、どこでPolicyを学習しているのか、その学習方法は何なのかがわからず困っていた。

結果を言うと、Diffusion Policyではシミュレーターを使った強化学習は行ってない。拡散モデルを使って軌道を生成ししているだけ。シミュレーターは学習後の評価にのみつかっている。

確認するためにシミュレーターをいじってみる。

一番簡単なPush-Tであれば、pusht_env.pyがシミュレーター部分の実装になる。 ここのstep関数を置き換える。

   def step(self, action):
        #natu
        obs = np.array([220.35896549,376.36618479,186.64523911,486.46340961,115.90777847, 387.19133526, 173.2922699,
                         421.48437703, 260.59202287, 376.4185838, 156.51945005, 385.22763402, 202.13263356, 449.69142947,
                         213.30533348, 413.37675723, 137.2927573,  417.84081363, 239.71375082, 224.04484566,   1.,
                         1.,           1.,           1.,           1.,   1.,           1.,           1.,           1.,
                         1.,   1.,           1. ,          1.,           1.,           1.,   1.,           1.,           1.,
                         1.,           1.,        ])
        info = {'block_pose': [305.66986769, 150.93339659,  -0.92194449], 'goal_pose': [256.,         256.,           0.78539816], 'n_contacts': 1, 'pos_agent': [296.81839434, 147.6821614 ], 'vel_agent': [782.25953338, 299.67773711]}
        return obs, 0.0, True, info

一回動かして、その時の値を常に返すようにして、一回目でdoneをTrueにして返すように修正する。

これで一回でもstepが呼ばれるとエピソードがいきなり終了して、もし学習に使っていれば上手く学習できなくなる。

この状態で学習をしても、ちゃんと学習は進む。step関数を元に戻してevalしてもちゃんと動くpush-tが見れる。

つまり、Diffusion Policyは強化学習をしていない。