データ駆動制御のご紹介（その１）

　こんにちは、(株)日立製作所  Lumada Data Science Lab. の中川です。普段は人工知能を制御に適用する研究に従事しています。近年、機械学習が注目される中、機械学習理論および機械学習を使った技術開発環境は急速に進歩すると共に、多くの方がデータサイエンスに関わるようになってきました。すでにデータサイエンスに携わっている方や、これからデータサイエンスに関わってみようと思っている方の中で、理論の大切さをあらためて知りたいあるいは感じたいという方がいらっしゃいましたら、それをできるだけわかりやすく伝えられたら、という思いから基本的な内容で記事を書きます。今回は、統計学や機械学習のお話から少し離れて、データ駆動制御と呼ばれる文字通りのデータ駆動アプローチの制御についてご紹介します。



# 1. はじめに

　今回は、制御分野のお話をしようと思います。とは言っても、「データ駆動制御」と呼ばれる理論についてのご紹介で、その名称にありますように、データ駆動アプローチの制御理論で、数理的には機械学習などのデータ駆動アプローチ手法と無縁のものではないと考えています。<br>　ところで、制御という言葉を聞いて、みなさんはどのようなイメージを持つでしょうか。広義には、いろいろなモノやコトを所望の状態や動きとなるようにすること、という意味がありそうですが、ここでは、制御工学の文脈での、機械・システムなどを望むとおりの運転状態にすることを指します。<br>　機械・システムなどを望むとおりの運転状態にするための機能を制御器と呼ぶことにします（ソフトウェアのイメージで捉えて下さい）。この制御器は、機械学習と同じようにパラメータを持っており、制御したい対象である機械・システムを望み通りに動かすためには、パラメータ値を最適な値にする必要があります。データ駆動制御とは、制御器のパラメータ値の最適化方法に関する理論で、自動チューニングであること（パラメータ値が自動的に最適化される）、チューニングに必要なデータが少なくて良いこと、最適化は制御対象を動かさずにパソコン上で可能なこと、が挙げられます。図1は、データ駆動制御の考え方を示しています。データ駆動制御には、さまざまな形態がありますが、今回は、特にFRIT(Fictitious Reference Iterative Tuning)と呼ばれる方式を取り上げ、以下の内容で御説明していきます。<br>・フィードバック制御とPID制御<br>・データ駆動制御(FRIT)<br>・シミュレーション結果<br>



![Fig_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/89892a6d-ced0-fee5-4d65-e58ba93527a7.png)




# 2. フィードバック制御とPID制御

　制御は、フィードフォワード制御とフィードバック制御に分類されます。フィードフォワード制御とフィードバック制御の考え方を図2に示しています。フィードフォワード制御は、制御した結果を考慮せず、制御器から制御対象へ一方的に（決め打ちで）信号を送ります。一方で、フィードバック制御は、制御した結果を考慮して、制御器から制御対象へ信号を送ります。フィードフォワード制御は、相手の出方を見ずに、決められた信号を相手に送り続け、フィードバック制御は、相手の顔色を窺いながら、次に自分がどのような信号を出すかを決めているといったところでしょうか。なお、制御信号は一定間隔で送ることが一般的で、その周期を制御周期と言います。制御周期は制御対象に応じてまちまちで、μsから数分あるいはもっとも長時間周期のものもあり、さまざまです。



![Fig_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/6e9d972e-2ffe-4c5f-283d-602bef45a45b.png)


　制御した結果を考慮して、次にどのような信号を出すかを決めているフィードバック制御の方が、制御対象の状況に応じて、臨機応変に対応できるため、フィードフォワード制御と比べて、制御対象を望み通りに動かせそうです。このフィードバック制御の中でも、最たるものとしてPID制御と呼ばれるフィードバック制御があります。図3にPID制御の考え方を示しています。例として、モーター電流を用いて電気自動車の速度をフィードバック制御する場合を示しています（わかりやすいように簡単化しています）。このとき目標速度と実際の速度の誤差に基づいて、モーター電流の大きさを決めます。直感的には、目標速度より実際の速度が低ければ、モーター電流量を大きくすることで、モーターの回転数が上がりますので、実際の速度は目標速度に近づいていきそうですし、逆に、目標速度よりじっさいの速度が高ければ、モーター電流量を小さくすることで、モーターの回転数が下がりますので、実際の速度は目標速度に近づいていきそうです。電流量の補正する方向はそれで良さそうですが、さらに、電流量をどの程度変更するかも合わせて決めることで、より精度良く自動車の速度を制御できそうです。PID制御は、目標速度と実際の速度の誤差（以下、誤差と呼称）に応じて、モーター電流をどの方向にどの程度補正するかのルールを表していると言って良いかと思います。具体的には、図3にありますように、PとIとDの3つの補正量（以下P分、I分、D分と呼称）を演算し、それを足した値をモーター電流量とします。



![Fig_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/29cf3323-8855-a9b5-2b35-534897db59a1.png)




　P分、I分、D分のモーター電流はそれぞれ以下のようなルールで演算されます。<br>P分：最新の誤差の大きさに応じて、モーター電流を決める。より具体的には、誤差に、ある係数（以下、ゲイン値A）を掛けた値をP分のモーター電流とする。<br>I分：過去の誤差の総和（積分値）に応じて、モーター電流を決める。より具体的には、過去の誤差の総和にある係数（以下、ゲイン値B）を掛けた値をI分のモーター電流とする。<<br>D分：制御周期において、一つ前の誤差から最新の誤差への変化量（微分値）に応じて、モーター電流を決める。より具体的には、一つ前の誤差から最新の誤差への変化量にある係数（以下、ゲイン値C）を掛けた値をD分のモーター電流とする。<br>　P分は瞬間、瞬間の誤差に対応し、I分はベース分の誤差に対応し、D分は突発的な変化に対応する役割になっていると言えます。この3つの役割であるP分、I分、D分を足した値をモーター電流として制御周期毎に更新することで、目標速度と実際の速度の誤差を少なくし、実際の速度を目標速度に合わせていきます（制御していきます）。<br>　以上、フィードバック制御の最たるPID制御をできるだけわかりやすく(?)説明してみたつもりです。なお、PID制御は産業界では、よく用いられており、産業界の制御の８割はPID制御とも言われているほど、ポピュラー(?)な制御です。




# 3. データ駆動制御(FRIT)　
### 3-1. FRITの特徴


　前章でPID制御をご説明しました。ところでゲイン値A、ゲイン値B、ゲイン値Cは、どのように決めるのでしょうか。この3つのゲインの値をどのように設定するかによって、制御性能が大きく変わりそうです。従来は、この3つのゲイン値は、図4に示されるように、制御対象（ここでは自動車もしくはモーター）を実際に何度も動作させながら、所望の制御性能となるように試行錯誤で決めることが多いです。この場合、実際に使うときの状態を作らないとなりませんので、制御装置および制御対象を用意して結線するなど、準備も大変です。今回の例ではモーターが制御対象ですが、工場のプラントなど制御対象がもっと大規模になってくると用意するのも簡単ではありません。また、試行錯誤によりゲイン値を決めるので、手間も掛かりますし、得られたゲイン値が客観的にどの程度最適化されたのかを知ることも難しいと言えます。



![Fig_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/e3b39d9d-b50c-2687-c544-9ae30ec19abd.png)




　このような問題を解決するのがデータ駆動制御です。データ駆動制御にはさまざまな形態がありますが、本記事では、FRITと呼ばれるデータ駆動制御をご紹介します。図5にFRITの特徴を示しています。以下です。<br>・制御対象が所望の動きをするようなゲイン値に自動的に調整<br>・自動調整には制御対象を1回だけ動作させたデータがあればよい<br>・実際に使うときの状態を作らなくてよく、パソコンで所定の計算式を処理することで調整できる<br>



![Fig_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/75fe2d65-6310-8f4d-af35-4992b9853ed5.png)




　制御対象が所望の動きをするようなゲイン値に自動的に調整できますので、ゲイン値の最適化に人が介在しません。自動調整には制御対象を1回だけ動作させたデータがあればよく、また、パソコンだけあれば調整できますので、過去に制御対象を1回でも動作させたデータがあれば、ゲイン値の調整のために、制御装置および制御対象を用意して結線するなど、実際に使うときの状態を作る必要もありません。このようにデータ駆動制御FRITを用いることで、実際に使うときの状態を作って、人が制御対象を実際に何度も動作させながら、所望の制御性能となるように試行錯誤で決める必要も無くなりそうです。また、後述しますように、ゲイン値を最適化するための目的関数が定義されていますので、得られたゲイン値がどのような考え方で最適化されたのがわかるため、ゲイン値の最適性が客観的に担保されると言えます。<br>　次に、もう少し、FRITを詳しく見ていくと共に、目的関数の定式化を行います。



### 3-2. FRITの原理

　従来の人によるゲイン値調整法とFRITによるゲイン値調整法のブロック図をそれぞれ示して、FRITの原理を御説明したあと、FRITを定式化します。<br>　図6は、従来の人によるゲイン値調整法のブロック図です。



![Fig_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/f06f966b-d916-2668-6cec-3db239875298.png)



ここに、<br>　$\mathbf{\rho}$：ゲイン値A、ゲイン値B、ゲイン値Cを表すベクトル<br>　$C(\mathbf{\rho})$：制御器(PID制御)<br>　$G$：制御対象<br>　$u$：制御対象への入力信号系列<br>　$y$：制御対象からの出力信号系列<br>　$r$：制御目標<br>　$e$：誤差<br>です。<br>　従来のゲイン値調整法は、制御目標 $r$ の値を固定し、人がPID制御 $C(\mathbf{\rho})$ のゲイン値 $\mathbf{\rho}$ を変えて、そのときの制御対象からの出力 $y$ のプロフィールをみながら試行錯誤で ゲイン値 $\mathbf{\rho}$ を最適化しています。なお、制御器 $C(\mathbf{\rho})$ のボックスに斜め上から刺さっている矢印は、チューニングの意味を表します。<br>　一方、図7は、FRITによるゲイン値調整法のブロック図です。



![Fig_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/eb682766-de4a-7806-7745-d851b35d8ed9.png)


ここに、<br>　$\mathbf{\rho}$：ゲイン値A、ゲイン値B、ゲイン値Cを表すベクトル<br>　$C(\mathbf{\rho})$：制御器(PID制御)<br>　$G$：制御対象<br>　$T_d$：所望の応答特性を表すモデル（伝達関数で表す。人が決める。）<br>　$Tuner$：FRITによるゲイン値自動調整機能<br>　$u_{ini}$：制御対象への入力信号系列（過去に制御対象を動作させたときのデータ。１回分のデータでよい。）<br>　$y_{ini}$：制御対象からの出力信号系列（過去に制御対象を動作させたときのデータ。１回分のデータでよい。）<br>　$\tilde{r}(\mathbf{\rho})$：制御目標（疑似参照信号）<br>　$e$：誤差<br>　$y_d(\mathbf{\rho})$：制御目標が $\tilde{r}(\mathbf{\rho})$ のときの所望の応答特性を表すモデルからの出力<br>です。<br>　従来のゲイン値調整法は、制御目標 $r$ の値を固定しましたが、FRITによるゲイン値調整法では、使うデータは1回の動作データだけですので、当該データである $u_{ini}$ と $y_{ini} $ を固定して、PID制御 $C(\mathbf{\rho})$ のゲイン値 $\mathbf{\rho}$ を変えたとき、$u_{ini}$ から $e$ を逆算し、逆算した $e$ と $y_{ini}$ から制御目標（疑似参照信号）$\tilde{r}(\mathbf{\rho})$ をさらに逆算して求めます。逆算しました疑似参照信号 $\tilde{r}(\mathbf{\rho})$ を所望の応答特性を表すモデル $T_d$ に入力して、そのときの出力 $y_d(\mathbf{\rho})$ を得ます。そして、$y_{ini}$ と $y_d(\mathbf{\rho})$ との差違（後述しますが二乗和誤差）が小さくなるように、PID制御 $C(\mathbf{\rho})$ のパラメータ $\mathbf{\rho}$ を調整していきます。<br>　実際の出力 $y$ と所望の出力 $y_d$  の差違が小さくなるように、パラメータ $\mathbf{\rho}$ の値を決めたいところなのですが、実際の出力 $y$ は、$y_{ini}$ しか手元になく、変えることができませんので、パラメータ $\mathbf{\rho}$ の値を変えたとき、制御対象からの出力が $y_{ini}$ となるような制御目標に逆に変えて、その制御目標のときの所望の応答特性を表すモデルの出力 $y_d(\mathbf{\rho})$ と $y_{ini}$ との差違を評価するというものです。制御対象からの出力が変えられないのなら、制御目標と所望の応答特性を表すモデルの出力の方を変えてしまおうという、ある意味、逆転の発想ですね。このようにFRITは、一部、制御の信号が流れる方向（図8中の矢印の方向）と逆の方向に演算して、調整していきます。<br>　以上、まとめますと、従来のゲイン値調整法は、制御目標 $r$ の値を固定し、PID制御 $C(\mathbf{\rho})$ のゲイン値 $\mathbf{\rho}$ を変えたとき、それに応じて変わる制御対象からの出力 $y$ のプロフィールをみながら試行錯誤で ゲイン値 $\mathbf{\rho}$ を最適化します。一方、FRITでは、制御対象への入力 $u_{ini}$ と制御対象からの出力を $y_{ini}$ を固定して、PID制御 $C(\mathbf{\rho})$ のゲイン値 $\mathbf{\rho}$ を変えたとき、それに応じて変わる所望の応答 $y_d(\mathbf{\rho})$ をみながらゲイン値 $\mathbf{\rho}$ を最適化します。



### 3-3. FRITの定式化

　FRITの目的関数を定式化します。前節で述べましたように、FRITでは、$y_{ini}$ と $y_d(\mathbf{\rho})$ との差違が小さくなるように、PID制御 $C(\mathbf{\rho})$ のパラメータ $\mathbf{\rho}$ を調整します。具体的には、差違は$y_{ini}$ と $y_d(\mathbf{\rho})$ との二乗和誤差で表します。このとき、この差違 $J_F$ は、(1)式で表されます。

$$
J_F=||\ y_{ini}-y_d(\mathbf{\rho})\ ||^2\hspace{1cm}・・・(1)
$$

ここに、

$$
y_d(\mathbf{\rho})=T_d\cdot\tilde{r}(\mathbf{\rho}) \hspace{1cm}・・・(2)\\\\
\tilde{r}(\mathbf{\rho})=e+y_{ini} \hspace{1cm}・・・(3)\\\\
e=C(\mathbf{\rho})^{-1}\cdot u_{ini} \hspace{1cm}・・・(4)
$$

です。(2)式をみますと、疑似参照信号 $\tilde{r}(\mathbf{\rho})$ を所望の応答特性を表すモデル $T_d$ に入力して、そのときの出力 $y_d(\mathbf{\rho})$ を得ています。また、(3)式および(4)式を見ますと、PID制御 $C(\mathbf{\rho})$ のゲイン値 $\mathbf{\rho}$ を変えたとき、$u_{ini}$ から $e$ を逆算し、逆算した $e$ と $y_{ini}$ から制御目標（疑似参照信号）$\tilde{r}(\mathbf{\rho})$ をさらに逆算して求めています。<br>　(1)式を最小化するような $\rho$ を求めれば良いので、FRITの問題は、(5)式のように定式化されます。

$$
\DeclareMathOperator*{\argmin}{arg\min}
\argmin_{\mathbf{\rho}}\ J_F \hspace{1cm}・・・(5)
$$

(5)式はいわゆる最適化問題ですので、(5)式をみたす $\mathbf{\rho}$ を求めるための解法は、例えば、勾配法やメタヒューリスティクスなど既存の手法を用いて解を得ることができます。<br>　以上、FRITの定式化を行いました。




# 4. シミュレーション結果

　簡単なシミュレーション結果を図8に示します。制御目標 $r$ を図中のように、ステップ変化させたときで評価しています。自動調整前の制御対象からの出力 $y_{ini}$ は、所望の出力 $y_d(\mathbf{\rho})$ から大きく乖離していることがわかります。この $y_{ini}$ と（図8中にはありませんが）そのときの制御対象への入力 $u_{ini}$ を用いて、FRITでPID制御の3つのゲイン値をチューニングし、あらためて制御対象からの出力を評価した結果が $y_{tuned}$ です。$y_{tuned}$ は、所望の出力 $y_d(\mathbf{\rho})$ にほぼ重なっており、所望の出力が実現できていることがわかります。



![Fig_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641763/d7271133-8870-277c-7ca0-e1bce5edb901.png)



　なお、制御目標 $r$ に重なるような出力を得たくなるかもしれませんが、制御目標 $r$ は、0から1に0sで変化しており、このような動きを行うことは、現実には、ほぼ不可能で、制御目標 $r$ に対してある程度、遅れを生じさせた $y_d$ を設定して、$y_d$ にトレースするようなPIDゲイン値を求めることになります。図7中の所望の応答特性を表すモデル $T_d$ は実現可能な範囲内での応答性を設定するものと思って頂くのが良いかと思います。<br>　ご参考までに、図8のシミュレーション結果に用いた設定条件を下記しておきます。制御に詳しい方しかぴんと来ないかもしれませんが、ご容赦ください。

$$
自動調整前のゲイン値:[ ゲイン値A，ゲイン値B，ゲイン値C ]=[3.0, 0.5, 0]\\\\
自動調整後のゲイン値:[ ゲイン値A，ゲイン値B，ゲイン値C ]=[6.0,1.0, 7.1]\\\\
制御対象の伝達関数:\frac{12s+8}{2-s^4+113s^3+147s^2+62s+8}\\\\
参照モデルの伝達関数:\frac{1}{0.25s^2+s+1}\\\\
制御周期:1s\\\\
最適化法:ガウス・ニュートン法
$$

　以上、FRITは次の特徴があることが確認できました。<br>・制御対象が所望の動きをするようなゲイン値に自動的に調整<br>　　→ 図8で示しましたように、$y_{tuned}$ は、所望の出力 $y_d(\mathbf{\rho})$ にほぼ重なりました。<br>・自動調整には制御対象を1回だけ動作させたデータがあればよい<br>　　→ 前述しましたように、チューニングに用いたデータは、$y_{ini}$ と$u_{ini}$ の1回の動作だけのデータです。<br>・実際に使うときの状態を作らなくてよく、パソコンで所定の計算式を処理することで調整できる<br>　　→ 図8は、シミュレーション結果ですので、ちょっとわかりにくいかもしれませんが、$y_{ini}$ と $u_{ini}$ は、実物の制御対象から得たデータと考えますと、チューニングは、(5)式を解けばよいので、パソコンで計算することで行えます。<br>　なお、チューニングしたゲイン値が、本当に、所望の出力となるかを確認するには、実物の制御対象で試すしかありませんが、データ駆動制御の発展形として、チューニングしたゲイン値を適用したときの出力をパソコンで事前に確認することができるデータ駆動予測が提案されています。この件については、次の機会にご紹介できれば、と思います。



# 5. おわりに

　今回は、統計学や機械学習のお話から少し離れて、データ駆動制御と呼ばれるデータ駆動アプローチの制御についてご紹介しました。とはいえ、データ駆動制御は、目的関数を最小化することでパラメータ値を得ることに帰着することから、数理的には機械学習などのデータ駆動アプローチ手法と無縁のものではないことがおわかり頂けたのではないでしょうか。データ駆動アプローチは、データ内に潜むさまざまな有用な情報を引き出してくれる手法と思っています。今回、ご紹介したデータ駆動制御も、データ内に潜む制御対象の情報を陽に表さずに制御器のパラメータ値を自動調整しており、その一例と言えるのではないでしょうか。<br>　今回も、理論の大切さをあらためて知りたいあるいは感じたいという方がいらっしゃいましたら、それをできるだけわかりやすく伝えられたら、という思いから記事を書かせて頂きました。より詳しく知りたいという方は、参考文献などをご参考頂ければと思います。




# 参考文献

金子修, 山本透, 閉ループデータに基づく制御系の直接的設計法, 計測と制御, Vol.52, No.10 (2013), pp.841-846
金子修, データ駆動型制御器チューニング－FRIT アプローチ－，計測と制御，Vol.52, No.10 (2013)，pp.853-859