Closed shigeyukioba closed 4 years ago
@shigeyukioba 承知しました。ご指摘ありがとうございます。 修正いたします。
@shigeyukioba
ご指摘いただいたようにmpcenv.pyの中からシステムノイズに関する部分を消す修正をmpcenv_fix_system_noise
ブランチにて行なっています。
前向きシミュレーションの中にシステムノイズを入れたい場合は、 dynamics のインスタンスの step の中に入れるのがよいと思います。
これに関してなのですが、こちらはこの様に、dynamics.value()の中にノイズの値を入れ
iLQGのfoward処理中に、求めたuを元にトラジェクトリを生成する時に
ここで呼び出すdynamics.value()の中でも正規分布からサンプリングされたノイズを付加する、という意味になりますでしょうか?
それも違います。
MPCで考えるダイナミクスモデルには、
(1) 実世界の制御対象ダイナミクス (2) シミュレーション実験における制御対象ダイナミクス (3) iLQRを行うときのダイナミクスモデルに基づく前向きシミュレーション
の3種類が考えられます。
いま、実ロボットは当面想定していませんので、ここで考えるのは (2)と(3)です。
(2) では、正規分布からサンプリングして加えることによって、前向きシミュレーションの軌道をつくります。
(3) で行う前向きシミュレーションは 現状態の事後確率 q( x ) = N( mu, Sigma ) に対して、ダイナミクス x(t+1) = F x(t) + epsilon(t) を適用することによって、 次状態の事後確率 q( x' ) = N( mu', Sigma' ) を求めます。 ここで、 mu' = F mu, Sigma' = F Sigma F^T + Q です。 Q はシステムノイズの共分散です。
ただ、ちょっと僕のほうに誤解があったかもしれないのですが、 iLQR の前向きシミュレーションの実装では、 各時刻における事後確率の共分散を求めて更新してゆくステップが含まれないようです。
おそらく(未確認ですが)、これに対応する計算を後ろ向き計算のなかでやっているのではないかと思います。
補足します。
1. シミュレーション実験において、 (2) と (3) のダイナミクスは同じものとする場合が多いかもしれませんが、 一般には異なってもよいです。
2. 後ろ向き計算のなかでシステムノイズの共分散Qを加えてゆくとしたら、このあたりに入りそうなのですが、入っていないように見えます。引き続きもうちょっと検討してから、あらためて回答します。
承知いたしました。
(3)でサンプリングしたノイズを入れるのは自分もおかしいように思い、ご説明いただいた様な次状態の分散計算時に与える付加をイメージしていました。
ご説明ありがとうございます。
後ろ向き計算のなかでシステムノイズの共分散Qを加えてゆくとしたら、このあたりに入りそうなのですが、入っていないように見えます。引き続きもうちょっと検討してから、あらためて回答します。
ありがとうございます!
@miyosuda
https://github.com/shigeyukioba/matchernet/blob/de426f6ee87d8057fdf2055f5a177427ad433a22/matchernet/control/mpcenv.py#L74-L77
ここは削除したいです。
前向きシミュレーションの中にシステムノイズを入れたい場合は、 dynamics のインスタンスの step の中に入れるのがよいと思います。
状態空間モデルは、未知対象を推定してモデルを構築するさいに、対象のわからなさ具合をシステムノイズ共分散 Q で表現しますが、これはあくまでもモデルの一部としてのシステムノイズであり、前向きシミュレーション対象となる真のダイナミクスのなかに含まれるものではありません。