Diffusion Policyの話。
ここにあるコードを動かそうとすると、シミュレーターとして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は強化学習をしていない。