本方法使用兩個網路來達成學習動作,一為Actor網路,主要用來輸出動作,細心的讀者可能會發現這和之前所介紹的policy gradient的網路長的很像,沒錯!Actor網路就是從policy gradient 演化而來的,主要是改進policy gradient回合更新制的缺點,加了Critic網路之後就可以使用TD error當作advantage function做每步更新的步驟了
因此Actor-Critic演算法的核心理論就是
使用TD error當成policy gradient演算法的Advantage function
底下以莫凡python的github程式碼作解釋,有興趣可以自行觀看完整程式碼:
Critic network
Critic網路是來自於Q-learning,使用TD error當成網路的loss function,訓練的方式很簡單,當收集到一組資訊集的時候$s_t,a_t,s_{t+1},r_t$,分別把$s_t$與$s_{t+1}$送進網路後可以得到相對應的$q_t$與$q_{t+1}$,將網路輸出的數值與$r_t$代入下列公式中算出loss即可一步一步慢慢的更新網路參數使得TD error越來越小
```python= with tf.variable_scope('squared_TD_error'): self.td_error = self.r + GAMMA * self.v_ - self.v self.loss = tf.square(self.td_error) # TD_error = (r+gamma*V_next) - V_eval with tf.variable_scope('train'): self.train_op = tf.train.AdamOptimizer(lr).minimize(self.loss) ```
Actor 網路更新演算法和之前所敘述的policy gradient更新方式一樣,只是Advantage function換成了Critic網路所提供的TD error
```python=
with tf.variable_scope('exp_v'):
# self.a 回傳動作index
# self.acts_prob 網路輸出的動作機率
# self.acts_prob[0, self.a] 代表只計算執行動作的那個機率
log_prob = tf.log(self.acts_prob[0, self.a])
self.exp_v = tf.reduce_mean(log_prob * self.td_error) # advantage (TD_error) guided loss
with tf.variable_scope('train'):
self.train_op = tf.train.AdamOptimizer(lr).minimize(-self.exp_v) # minimize(-exp_v) = maximize(exp_v)
```
Actor Critic network
因此,完整的Actor Critic網路表示如下,第一步先用Critic網路算出TD error,第二步再使用TD error對Actor網路進行參數更新
若您從書上看應該會看到書中是以底下這張圖來描述Actor Critc的方法介紹,都是闡述著相同的道理,經由TD error來更新Actor網路的策略來使得學習出的策略越來越好
參考資料:
1.https://www.youtube.com/watch?v=j82QLgfhFiY
2.https://www.jianshu.com/p/25c09ae3d206
https://towardsdatascience.com/an-intuitive-explanation-of-policy-gradient-part-1-reinforce-aa4392cbfd3c
3.https://towardsdatascience.com/understanding-actor-critic-methods-931b97b6df3f
4.https://www.youtube.com/watch?v=j82QLgfhFiY&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_&index=6
5.https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/8_Actor_Critic_Advantage/AC_CartPole.py
留言列表