データ駆動型制御(FRIT、VRFT)を図的に理解する

# はじめに
制御器のパラメータチューニングにかかわる内容として、データ駆動型制御が注目を集めています。
中でも特に、VRFT(Virtual Reference Feedback Tuning)とFRIT(Fictitious Reference Iterative Tuning)という手法が注目を集めていますが、これらの図的な理解を試みてみたいと思います。

私自身はデータ駆動型制御について詳しくなく、歴史的なところは踏まえず初学者目線でバッサリまとめているのでご了承ください。

図的に解釈すると、両手法の違いは逆モデルの作り方の違いにあることが見て取れるかと思います。

![FRIT_block-VRFT vs FRIT.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/193b686a-f07a-cdf1-17d1-cd1583f4b7b2.png)

 - FRITは制御対象の閉ループの逆モデルを使って制御器をチューニングする。出力信号の差で評価する。
 - VRFTは理想とする特性の逆モデルを使って制御器をチューニングする。入力信号の差で評価する。

という対比を確認していきます。

なお、両手法では通常、実験データにある種のフィルタリング(プレフィルタ)をしてから最適化を実行することが推奨されているようです。この点については私自身よくわかってないので、最後の方にまとめて記述することにしました。

この記事では、全体的に文献[^1]を参考にしました。

VRFT、FRITそれぞれ個別の内容については下記の記事を参考にさせていただきました。どちらもPython/MATLABでの興味深い検証を行っていて、シミュレーション等々はそちらを参照いただければと思います。

https://qiita.com/EngineerNiwaka/items/bfbfb5b9ac7492df938f

https://qiita.com/larking95/items/50b0f70ca5a2458428f2

# 問題設定
データ駆動型制御では、下記の系の$r_0$から$y_0$までの特性$T(\rho_0)$を、理想モデル$T_d$に近づけることを考えます。$\rho$は制御器のパラメータベクトルで、$\rho_0$はその初期値を表します。例えばPID制御なら、PIDそれぞれのゲインを表しています。

このとき、制御対象$P$についてはその特性が詳しくわかっていないものとします。一方、すでにある程度動く制御系が組まれていて、制御器$C(\rho)$の次数、構造などはあらかじめ決まっているものとします。
また、制御入力の時系列$u_0$、出力の時系列$y_0$が得られるものとします(通常、指令の時系列$r_0$のデータは使うことが無いようです)。
![FRIT_block-FRIT.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/865179e3-d2b4-03ee-f5f3-4e3a330be837.png)



閉ループ特性$T$を具体的に表すと、$T(\rho_0)=PC(\rho_0)/(1+PC(\rho_0))$となります。
もし$P$が既知であればパラメータ$\rho$を操作し、$T_d$と$PC(\rho)/(1+PC(\rho))$との係数比較などで$T_d \approx T(\rho)$とすることも考えられます。しかし、$P$がわからない以上、データ$y_0$と$u_0$のみを使って$\rho$を調整するしかない、という状況になっています。


この問題設定は、産業界の現場でよくあります。特に、
 - 過去の技術者が勘と経験である程度動く制御系を構築してしまい、今となっては制御対象のモデリングが重要視されない。
 - 開発リソースが限られていて、モデリングに時間を取れない。
 - 過去にモデリングしたが、製品のマイナーチェンジで特性が変わってしまった。
 
というような状況が想像されます(一部は私の実体験によるものです)。そんな中でも性能をある程度向上させたい場面は頻繁にあります。

もっとポジティブな内容だと、
 - 経年劣化、環境変化などで特性が変わった制御対象でも同じ性能を維持したい

という状況で、ゲインの自動チューニングの仕組みを構築する場合などもこの問題設定の範疇と考えられます。
(なお、制御対象がわかっていて変更前後の物理パラメータが直接計測できるなら、こういった場合にはゲインスケジューリング制御も有効です。)

## 記号の定義
ここで、本記事での記号のだいたいの定義を述べておきます。というのも、データ駆動型制御では似て非なる変数がたくさん登場して混乱することが多い印象があるからです。本記事では
 - 最初の実験データから得た、またそれらから解析的に求まる信号・パラメータの添え字には 0 をつける
 - 理想的な信号・特性には添え字に $d$ (desired)をつける
 - 最適化で更新される信号には ~ をつける
 - 最適化の結果得られた、最適値を表すパラメータには * をつける
 - 大文字の記号は離散時間伝達関数を表す。通常$z$や$q$で表されるような、伝達関数のシフトオペレータは省略する。
  
としたいと思います。細かいところは違ってしまってるかもしれません(特にVRFT)が、おおよそこんな気持ちで図を書きました。


# 素朴な発想での制御器チューニング(IFT)

素朴な発想、と言い切ってしまうのは気が引けますが、自然に思いつくであろう方法がIFT(Iterative Feedback Tuning)と呼ばれる方法です。

最初に、現状のパラメータ$\rho_0$での出力$y_0$を得ます(最初に載せた図との違いは、$r_0$を一か所にしただけです)。
データを得た後、$y_0$と$y_d$の時系列としての偏差にもとづいて、次に試すべきパラメータ$\rho_1$を計算します(具体的には、ガウス・ニュートン法を用いるようです)。
![FRIT_block-IFT.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/13c16902-cd26-fa52-72e2-b927aae5b9e0.png)


次に、先の実験結果から算出した$\rho_1$をもとに、また実験を行います。パラメータ$\rho_1$での出力$y_1$を得たので、$y_1$と$y_d$の時系列としての偏差から、再び次の$\rho_2$を計算します。これを$y$と$y_d$が満足いく程度に合うまで繰り返していきます。
![FRIT_block-IFT.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/3ecf64a0-a9ea-9c4f-35a1-c0a3c84405ec.png)


この発想は直感的にはわかりやすいものの、何度も実験を繰り返す必要があります。何度も実験する時間があるなら、そもそも制御対象のモデリングから頑張りたいところです。その他にも、ほぼ稼働しっぱなしのプラントに対してのチューニングを考えたとき、稼働しながらにせよ、稼働を止めるにせよそれほど実データは何度も得られないという状況もあります。

そこで、1組の実験データから適切な制御パラメータを求める手法が、VRFTとFRITです。それぞれどちらにも良さがあり、賛否はわかれるところのようです。歴史的にはVRFTの方が先に発表されたようですが、まずは個人的に説明しやすいFRITからその発想を述べていきます。

----
後日追記：ちなみにこうしたIFT的なアプローチが非実用的かというと、そうではありません。最近は、ベイズ最適化などを使って効率的に実験しつつ制御対象の出力を所望に近づける…というやり方も多数あります。参考記事↓

https://qiita.com/KariControl/items/669a4cc53fbac296eeca

----
# FRITの発想

出発点は、記事の最初に載せた図です。
![FRIT_block-FRIT.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/d9548d1a-c2e5-aa7b-dd67-37f16586354a.png)


ここで早速唐突ですが、$T$の逆モデルを作ることを考えます。もともと$r_0$→$y_0$という流れだったブロックを反転させ、逆向きの$y_0$→$r_0$という特性を記述しています。
![FRIT_block-FRIT.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/ffbf6655-7315-6247-28ae-c7b1ea086eea.png)



上記の図で重要なのは、制御対象$P$が図中に表れなくなった点です。$u_0$は実験データとして得られているので、わざわざ$P^{-1}y_0$を求める必要がなく、データ$u_0$で事足りるためです。また、上図で$\tilde{r}_0 = C^{-1}(\rho_0)u_0 + y_0$という記号が表れてきました。これが疑似参照信号(Fictitious Reference Signal)と言われる信号です。ひとつ前の図を見返してみると明らかですが、この$\tilde{r}_0$は逆システムから求めただけなので、もとの$r_0$とおおよそ一致するはずです。

同じ信号だったら繋げて良いだろう！ということでこれらを接続すると、下記の図になります。これがFRITで最適化の対象となるブロック図です。
![FRIT_block-FRIT.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/d48cdd0f-0b09-7288-e510-fa170b7b823b.png)



(なお最後の方にまとめて話しますが、実際には$\tilde{r}_0$の因果関係を考えると、$r_0$と完全には一致しない場合もあります。一方、$\tilde{y}$には$y_d$を初期値としてセットした、のような意味合いになるため$\approx$と$=$を使い分けてます)

この図に対し何を最適化するかというと、$y_0$と、$\tilde{y}$(疑似参照信号を理想特性$T_d$に印可した出力)との差を最小化します。つまり、$\rho_0$を変更させていくと$\tilde{y}$の波形が変わっていくので、それを$y_0$に一致させるようにしていきます。最適化問題ふうの表現で書くと、下記となります。$J$が評価関数です。
```math
\begin{align}
 \min_{\rho} J(\rho) &=  \min_{\rho} \left\| y_0 -\tilde{y}  \right\| \\
&= \min_{\rho} \left\| y_0 - T_d \tilde{r}_0  \right\| \\
&= \min_{\rho} \left\| y_0 - T_d (C^{-1}(\rho)u_0 + y_0)  \right\| \\
\end{align}
```

最後の式で、$\tilde{r}_0$が代入によって無くなりました。つまり、疑似参照信号はあくまで概念的な信号で、実際の最適化には登場しないことにご注意ください(疑似、という名前もそのあたりから来てると想像します)。最後の式は、実験データ$y_0$、$u_0$、理想モデル$T_d$からなっており、$\rho$を変えていけば最小値を追求することができます。
ただし、$C(\rho)$ではなく$C^{-1}(\rho)$のかたちで表れているので、たとえ単純なPID制御器だったとしても、非線形関数としての最適化が必要となってきます。

この段階では、なんで$y_0$と$\tilde{y}$を一致させようとするの？とは思いますが、とりあえず最適化を実行し下図のようになったとします。(図中の$\tilde{r}_ * $はもし存在するとしたらこんな感じ…のイメージです。実際にはこの信号を生成せずとも最適化が行えます)
![FRIT_block-FRIT.drawio (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/e803cf44-d2fb-d543-9afa-f5b05043e3c8.png)



上図の何がうれしいかというと、この図で$y_0 \approx \tilde{y}_ * $となっているということは、つまり$T_d T^{-1}(\rho_ * )=1$となる特性が得られているということです。言い換えれば、$T_d = T(\rho_ * )$が得られています。
逆向きだった$T^{-1}(\rho_ * )$の向きを戻すと、得られる図は下記です。
![FRIT_block-FRIT.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/1627a593-d9fc-3fe5-3e0b-6d9c18758177.png)


上図は、変な信号(最適化後の疑似参照信号)を最適化後の系に入れたら、最初の実験データ$y_0$が復元された、ということを表しています。

この様子だけだと何がうれしいかわかりませんが、この時点で、すでに$T(\rho_*) = T_d$となっていることを思い出してください。したがってちょっと不思議に感じられるかもですが、もともと入れたかった参照信号$r_0$を印可すると理想的な$y_d$に近い波形が得られます。
![FRIT_block-FRIT.drawio (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/67e53a51-3dc8-8613-e098-05aa150e37b5.png)

以上がFRITの概要です。

ポイントは制御器＆制御対象からなる閉ループ特性$T(\rho)$に対し、逆モデル$T^{-1}(\rho)$を考えた点です。逆モデルが生成する信号(要するに$r$)は、制御対象$P$が無くても、実験データ$y_0$、$u_0$があれば復元できます。そのような逆モデルの生成信号を使い、$\rho$を変えていくことで$T_d T^{-1}(\rho_ * )=1$となるような最適化を行い、$T(\rho_ * ) = T_d $を得たということです。


# VRFTの発想

再び、出発点は一番最初に載せた図です。
![FRIT_block-FRIT.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/6df88efc-00b4-5cb0-d6ea-082f79a1289c.png)

今度は、理想モデル$T_d$の逆モデルを作ることを考えます。下図のとおり、もともとのブロックの向きを反転した様子を$T^{-1}_d$であらわします。再び、参照信号を復元するような$\tilde{r}_0$があらわれてきました。私自身あまりよくわかってないですが、この信号のことは仮想参照信号(Virtual Reference Signal)と呼び、疑似参照信号とは区別されるようです。ので厳密には同一視するのはよくないかもしれないですが、ほぼ同じ位置づけなので同じ記号にしています。


$r_0$→$y_d$は実験データではなく机上の(理想の)シミュレーションデータと言える内容なので、やはりおおむね$\tilde{r}_0\approx r_0$と言っていいだろうということで、同じ信号だとみなして繋ぎます。 
![FRIT_block-VRFT.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/cdfcc484-8ced-fbc8-64e6-01a01c383f48.png)

上の図に対し、FRITのようにある種の最適化を考えます。FRITでのやり方を参考にすると、$T^{-1}_d$への入力に、もともとの信号$y_d$ではなく、$y_0$を印可してみるのが良さそうです。こうして$y_0$を印可して、$T(\rho^ * )$の出力が同じような波形になったとすれば、再び$T(\rho^ * )T_d^{-1}=1$から$T(\rho^ * )=T_d$にもっていけそうです。

しかし、そうは上手くいきません。$T(\rho^ * )$の出力を得るためには未知の$P$を知っている必要があり、データ駆動型制御の問題設定でそれは叶いません。

そこで、制御入力$u$の部分に着目します。$u_0$を制御対象に入れたら出力が$y_0$だった、というのは実験で得られた事実なので、$y_0$ではなく$u_0$にだけ着目すれば良い、という風に解釈すると良いと思います。これを意識して、$u$の部分を分割して書き直すと下図となります。
![FRIT_block-VRFT.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/fb287b01-6597-784e-c595-39d43f5776ef.png)

ここで、あらためて$T^{-1}_d$に$y_0$を印可してみます。これがVRFTによる最適化の出発点です。
(FRITと同様、信号$\tilde{r}$を実際に生成する必要はありません。あくまで、この端子から信号を取り出すとしたらこんな波形…というイメージ図です)
![FRIT_block-VRFT.drawio (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/44907573-5bc1-2e36-efe9-a199c975ee62.png)


上の図では$y_d$ではなく$y_0$を印可したことで、$\tilde{r}$はもともとの参照信号とは異なる波形になっています。それによって、$u$ももともとの制御入力データ$u_0$とは違った波形になります。上図の右の方で$P$の出力のあたりを点線にしているのは、実際にはここはすでに切り離して考えているからです。
なお、仮想参照信号$\tilde{r}$は最適化前後で波形が変わったりはしませんが、FRITに合わせるためにて一応記号~をつけています。

上の図で$\rho_0$を変更すると、$\tilde{u}$が変わっていきます。そこで$\tilde{u}$と$u_0$を一致させるように最適化をかけていきます
最適化問題として書くと、下記となります。$J$が評価関数です。

```math
\begin{align}
\min_{\rho} J(\rho) &= \min_{\rho} \left\| u_0 -\tilde{u}  \right\| \\
&= \min_{\rho} \left\| u_0 - C(\rho) (\tilde{r} -  y_0) \right\| \\
&= \min_{\rho} \left\| u_0 - C(\rho) (T^{-1}_d y_0 - y_0)  \right\| \\
\end{align}
```

この式もFRIT同様、最後の式で仮想的な信号$\tilde{r}$が代入によって消えました。最後の式は実験データ$y_0$、$u_0$、理想モデル$T_d$からなっており、$\rho$を変えていけば最小値を追求することができます。

FRITと異なるのは、$C(\rho)$が逆モデルとなっていない点です。例えばPID制御のような簡単な制御器であれば、最小二乗法などで各ゲインを簡単に求めることができます。(分母分子に多項式を持つような、より一般的な制御器だと結局非線形最適化が必要です。)

最適化が終わると下図のようになります。
![FRIT_block-VRFT.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/d6f5a98e-b81a-4a4c-50aa-651596dc1967.png)

これは、FRITのときと同様、変な信号$\tilde{r}$(仮想参照信号)を入れたら$u_0$が復元される、という様子を表しています。$u_0$が復元されたということは、当然それを制御対象に入れた場合は$y_0$が復元されます。

あとはFRITのとき同様です。やはり最適化が終わった段階で$T(\rho^*) T^{-1}_d =1$が得られているため、もともと入れたかった参照信号$r_0$を入れると理想的な$y_d$に近い$y$が出力される、という流れです。

# 図的に解釈したFRITとVRFTの違い
上述のとおり、FRITとVRFTの発想を図にしてみました。並べてみると下記のようになります。
なお、右図の$\tilde{r}$は$\rho$によって変わらないので、*をつけてません。また、FRITもVRFTも、時系列データ$\tilde{r}$を実際に生成する必要はありません。

![FRIT_block-VRFT vs FRIT.drawio (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/193b686a-f07a-cdf1-17d1-cd1583f4b7b2.png)


こうしてみると、
FRITは
 - 閉ループ特性の逆モデルを求め、理想特性と接続して最適化する。
 - 出力データ$y_0$と理想モデルの出力を比較し、最適化する。
 - 閉ループ特性の逆モデルを考えるため、制御器も逆モデルとなる。

反対にVRFTは
 - 理想特性の逆モデルを求め、閉ループ特性と接続して最適化する。
 - 入力データ$u_0$と、理想制御器の出力(つまり制御入力)を比較し、最適化する。
 - 閉ループ特性の順モデルを考えるため、制御器も順モデルとなる。

となっています。こうして並べるとVRFTの方が優れているように見えますが、一概にそうとは言えないようです。この点、申し訳程度ですが関係ありそうな項目を述べたいと思います。

## 本記事でスルーしたこと
本記事では、大きく2つのことを深堀せずに比較しました。
 1. 各信号の因果律について
 2. プレフィルタの適用について

### 各信号の因果律について
普通、$y=Tr$という特性に対し、安易に$r=T^{-1}y$で元信号が復元できるわけではありません。ステップ信号を入れたら1次遅れの波形になった、という状況で、1次遅れの波形をもとにステップ信号を復元するのは因果関係的に不可能です。

したがって、本来$C^{-1}(\rho)$や$T^{-1}_d$はプロパー性を意識しながら設定する必要があります。ただ、疑似(仮想)参照信号$\tilde{r}$を実際に生成することはないので、FRITの場合$T_d C^{-1}(\rho)$が、VRFTの場合$C(\rho)T^{-1}_d$がプロパであればOKです。
![FRIT_block-VRFT vs FRIT.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701220/e8c274d7-7465-1823-2ddf-3019f3d354bc.png)

### プレフィルタの適用について
一般的に、VRFTでもFRITでも実験データ$y_0$、$u_0$にプレフィルタと言われるフィルタを通してから最適化を実行することが推奨されています。
特に、VRFTはプレフィルタがほぼ必須、開ループデータでの最適化を推奨、というような記述を見かけます。この点が私にはよくわかりませんでした。わかる限りだと、
 - VRFTは入力信号を比較する。制御対象は普通ローパス特性を持っているので、出力信号を比較するFRITより高周波信号の誤差を評価する必要がある。
 - 一般的に、閉ループでのシステム同定は開ループよりも難しい([参考記事](https://qiita.com/HppyCtrlEngnrng/items/563a43cd293a923357d6))。閉ループでの入力信号の周波数成分には出力信号の周波数成分が多分に含まれており、同定上厄介になる。

などと何か関連があるのかなと思いました。さらに、文献[^2]で
 - FRITのプレフィルタは目標値信号$r_0$と出力信号$y_0$のパワースペクトル密度の比で決める
 - VRFTのプレフィルタは制御入力信号$u_0$のパワースペクトル密度と、ある種のフィルタ(設計者が決める。つまりプレフィルタのためのフィルタ。)から決める

ことがまとめられていて、VRFTは設計者が選ばなければならないパラメータが1つ多いようです。
([EngineerNiwakaさんの記事](https://qiita.com/EngineerNiwaka/items/bfbfb5b9ac7492df938f) によれば、これも理想モデルから決めて良いようですが・・・)

また、データ駆動型制御では基本的に制御器の構造は決まっているので、無茶な理想モデルを与えた場合、制御器内のパラメータチューニングをどう頑張っても応答を理想に一致させることはできません。この点も文献[^2]のプレフィルタである程度考慮がなされるようです。

# おわりに
VRFTとFRITの図的な解釈についてまとめました。間違い、ご意見等あればコメントください。
ご覧いただきありがとうございました。


[^1]: 「閉ループデータに基づく制御系の直接的設計法」、金子 修、山本 透、2013年、計測と制御、
https://www.jstage.jst.go.jp/article/sicejl/52/10/52_841/_pdf/-char/ja

[^2]: 「一回の閉ループ実験データを用いた最小二乗法に基づく制御器パラメータチューニング ― Fictitious Reference Iterative Tuningの拡張」、金子 修、吉田 恭子、松本 和之、藤井 隆雄、2005年、 システム制御情報学会論文誌、https://www.jstage.jst.go.jp/article/iscie1988/18/11/18_11_400/_pdf/-char/ja