DDPG也是延續著之前的觀念而來,是融合了Actor-Critic與DQN的experience replay而演化而來的演算法,完整架構圖如下所示,一樣是有兩個網路,Critic計算動作的好壞,Actor根據Critic網路調整參數獲得更好的策略

Critic network
Critic網路更新方式與之前介紹的Actor-Critic網路更新方式一樣,差別在於此處引用了兩個網路(target與now),這個概念源自於Double DQN,在此篇論文中發現一值更新同一個網路容易造成不穩定的現象,因此提出再創造一個網路(target)然後賦予相同的參數值,然後更新參數的時候更新原本的網路即可(now),等訓練一段時間後再把現now網路的參數再賦予給target網路,這麼做可以使得訓練更穩定,因此選取$q_{t+1}$的値時是選擇選取target網路所給予的q值

```python=
self.target_q = R + self.gamma * self.q_
self.loss = tf.reduce_mean(tf.squared_difference(self.target_q, self.q))
self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)
```
Actor network
Actor 更新的概念很新穎,是採取連續微分的方式計算出action應該變動的方向,設計此網路時比較特殊,首先必須終止梯度計算倒傳遞到Actor網路,再來就是將Critic網路dq/da的梯度計算出來,然後再算出Actor網路da/dparams的微分,之後將兩者微分相乘並套用到Actor網路的參數上即可完成更新網路的動作了
```python=
#程式碼取自莫凡python
self.a = tf.stop_gradient(a)
# provided by Critic network
a_grads = tf.gradients(self.q, a)[0] # tensor of gradients of each sample (None, a_dim)
# Actor network:caculate policy gradients
policy_grads = tf.gradients(ys=self.a, xs=e_params, grad_ys=a_grads)
train_op = opt.apply_gradients(zip(policy_grads, e_params))
```

Experirence replay
這概念也是源自於DQN網路,在訓練的過程中會持續的收集經驗,並且會設定一個buffer size,這個值代表要收集多少筆經驗,每當經驗庫滿了之後,每多一個經驗則最先收集到的經驗就會被丟棄,因此可以讓經驗庫一值保持滿的狀態並且避免無限制的收集資料造成電腦記憶體塞滿。