---
# System prepended metadata

title: An Outsider’s Tour of Reinforcement Learning (Part10&11)

---

# An Outsider’s Tour of Reinforcement Learning (Part10&11)

[TOC]

## [PID and Reinforcement Learing](http://www.argmin.net/2018/04/24/ilc/)

### PID (proportion integration differentiation)
&emsp;
![](https://i.imgur.com/e37G3lq.png)
&emsp;

PID控制器（比例-積分-微分控制器），把收集到的數據和一個參考值進行比較，然後把這個差別用於計算新的輸入值，這個新的輸入值的目的是可以讓系統的數據達到或者保持在參考值。
&emsp;
控制器由比例單元（P）、積分單元（I）和微分單元（D）組成。三個單元 P、I 和 D 分別對應目前誤差、過去累計誤差及未來誤差。

![](https://i.imgur.com/qJfTtu4.png)


$K_p$ : 比例增益
$K_i$ : 積分增益
$K_d$ : 微分增益
u : 控制輸出
e : 設定值(set point) - 回授值(progress value)
t : 目前時間
τ : 積分變數，數值從0到目前時間 t

&emsp;

:::info
- 用誤差來計算出一個對系統的糾正值來作為輸入結果，這樣系統就可以從它的輸出結果中消除誤差。在一個PID迴路中，這個糾正值有三種算法 :
1. 消除目前的誤差
2. 平均過去的誤差
3. 透過誤差的改變來預測將來的誤差。
- PID控制器可以用來控制任何可被測量及可被控制變量。比如，它可以用來控制溫度、壓力、流量、化學成分、速度等等。
- 若是不知道受控系統的特性，一般認為PID控制器是最適用的控制器
:::

:::success
- 強化學習 : 使用過去的數據來增強對系統未來的操縱
- 強化學習最常見實踐的模型是，在系統上提出並測試一組動作，觀察一系列獎勵和狀態，並且將先前動作和獎勵與狀態數據相結合以改進行動政策
:::
&emsp;

**在某種意義上，PID控制是控制的"梯度下降"**

梯度下降調整的一個常見技巧是 :
使梯度下降不會發散的最大值，然後相應地從該起點設置動量和學習速率。
從PID的角度來說 : 
找到會使系統震盪的最大增益 $K_p$，並基於該增益和振盪頻率設置PID參數。
&emsp;


### PID control for iterative learning control (ILC)

疊代學習控制（ILC）是一種對做重複動作的軌跡跟蹤系統的控制方法。例如機器手臂控制、化工反應過程控制、試驗鑽探等。這些系統都具備**多次準確重複同一動作**的特性。其動作的目標是**在有限的時間區間內，準確的追蹤給定的參考訊號**。
&emsp;

:::info
- 控制任務是尋找控制律 u(t),使得被控對象的輸出 y(t) 在有限的時間 [0,T]上沿著整個期望的軌跡實現零誤差軌跡跟蹤
- 學習跟踪軌跡，通過先前疊代中與期望軌跡的偏差來調整並改進輸入控制
:::
&emsp;


{%youtube IZTP7h5cfqg%}

&emsp;

讓系統在不使用模型的情況下跟踪軌跡。 也就是說，使用迭代學習控制來學習跟踪空間中的某些曲線，而且我們不知道系統的真實模型是什麼。

在追蹤軌跡的問題上定義一個PID控制器 : 

&emsp;
![](https://i.imgur.com/AKbU56N.png)
&emsp;

控制輸入 : u = [$u_1$,…,$u_N$]
期望輸出 : v = [$v_1$,…,$v_N$]
實際輸出 : y = [$y_1$,…,$y_N$]
期望值與實際值的誤差 : e = [$v_1$−$y_1$,…,$v_1$−$y_N$]
Se : e 的離散積分
De : e 的離散微分
&emsp;
&emsp;


讓我們使用我們一直使用的簡單四旋翼模型 : 
&emsp;

![](https://i.imgur.com/XXHR0xY.png)
&emsp;

($z_{t+1}$ ; $v_{t+1}$) = *A*($z_t$ ; $v_t$) + *B*$u_t$ 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$y_t$ =  *C*($z_t$ ; $v_t$)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp; *A* = $\begin{bmatrix}1&1\\0&0.9\end{bmatrix}$&nbsp;&nbsp;,&nbsp;&nbsp;*B* = $\begin{bmatrix}0\\1\end{bmatrix}$&nbsp;&nbsp;,&nbsp;&nbsp;*C* = $\begin{bmatrix}1&0\end{bmatrix}$

&emsp;

$\begin{bmatrix}
z_{t+1}\\
v_{t+1}
\end{bmatrix}$ = $\begin{bmatrix}
1&1\\
0&0.9
\end{bmatrix}$ $\begin{bmatrix}
z_t\\
v_t
\end{bmatrix}$ + $\begin{bmatrix}
0\\1\end{bmatrix}$ $u_t$
&emsp;
$y_t$ = $\begin{bmatrix}1&0\end{bmatrix}$$\begin{bmatrix}
z_t\\v_t\end{bmatrix}$
&emsp;
&emsp;






期望軌跡 : 
&emsp;
![](https://i.imgur.com/Xa08b5E.png)
&emsp;
在ILC的模擬中，使用上面的PID控制器，並只使用微分的部分，設定 $k_D$ = 0.1，$k_P$ 和 $k_I$ 為 0
&emsp;

前8次疊代的結果 :
&emsp;
![](https://i.imgur.com/0bBe0lk.png)
&emsp;

疊代20次後的結果 : 

![](https://i.imgur.com/ZhTiLtJ.png)
&emsp;

:::info
- 在沒有模型的情況下，也能於非常少的疊代次數下就找到控制策略
:::






[ILC code](https://nbviewer.jupyter.org/url/argmin.net/code/ILC_tracker.ipynb)

[fig8.csv](https://github.com/benjamin-recht/benjamin-recht.github.io/blob/master/secret_playground/fig8.csv)



&emsp;
&emsp;
&emsp;
&emsp;




參考資料

https://en.wikipedia.org/wiki/PID_controller
https://en.wikipedia.org/wiki/Iterative_learning_control
https://en.wikipedia.org/wiki/Nonlinear_control#Nonlinear_feedback_analysis_%E2%80%93_The_Lur'e_problem
https://blog.csdn.net/qq_41673920/article/details/84860697
https://youtu.be/IZTP7h5cfqg