---
# System prepended metadata

title: 李宏毅_ATDL_DRL Lecture 6
tags: [NTU, Hung-yi Lee, Deep Reinforcement Learning]

---

# 李宏毅_ATDL_DRL Lecture 6
###### tags: `Hung-yi Lee` `NTU` `Deep Reinforcement Learning`
[課程撥放清單](https://www.youtube.com/playlist?list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_)
## DRL Lecture 6: Actor-Critic
[課程連結](https://www.youtube.com/watch?v=j82QLgfhFiY&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_&index=6)

### Review - Pilicy Gradient
![](https://i.imgur.com/RW9vPKv.jpg)


$\nabla \bar{R}_\theta \approx \dfrac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n} \left( \sum_{t'=t}^{T_n} \gamma^{t'-t} r^n_{t'}-b \right) \nabla \log p_\theta(a_t^n \vert s_t^n)$
* 讓agent與環境互動，計算在某一個state-$s$採取某一個action-$a$的機率
* 計算從state-$s$採取action-$a$之後，一直到遊戲結束的時候，其accumulated reward有多大
    * 從$t$到$T$加總
    * $\gamma^{t'-t}$，這是一個discount factory，因為一個action對愈後面的影響愈小，可能是0.99或是0.9
    * 減掉bias-$b$是希望括號項目內的所得的值有正有負，為正，代表增加這個state-action pair的機率，負的就減少。
    * $\sum_{t'=t}^{T_n} \gamma^{t'-t} r^n_{t'}$，以$G_t^n$來表示
        * $G$的不穩定是因為互動過程中的隨機性，為random variable，過程中從$G$ sample，然後用sample到的資料更新參數
        * 即使是相同的state-action pair，最終得到的結果還是可能如上圖說明一般的存在很大的落差，因此我們希望可以直接估測$G$這個random variable的期望值，用期望值來代替sample的值

### Review - Q-Learning
![](https://i.imgur.com/NmVW1AH.jpg)

直接估測$G$的方式就是value-based的方法：
* State value function $V^\pi(s)$
    * input s output scalar
* State-action value function $Q^\pi(s, a)$
    * input s output vector，每一個維度都是對應action的Q-value，只能用於discrete action

可用TD或MC來估測，TD較穩，MC較精確
### Actor-Critic
![](https://i.imgur.com/q4hwz9f.jpg)

$G$這個random variable的期望值就是Q-value，在policy-$\pi$情況下，當state-$s$的時候執行action-$a$所得的accumulated reward有多大。因此，要做的事很簡單，如果要將$G$用期望值來表示，只要把Q-function套在這邊就可以將actor-critic兩個方法結合起來。

baseline的話，可以用value-function來表示，即是在policy-$\pi$的情況下，在某一個state-$s$一直互動到遊戲結束的excpected的reward有多大<sub>(V-function沒有考慮action，Q-function才有action考慮)</sub>。

直觀來看，就是將原始Policy Gradient中的項目以Q-value減掉V-value就結束了，只是缺點就是要估測的是兩個`nn`(Q-function與V-function)。
### Advantage Actor-Critic
![](https://i.imgur.com/hHlle5N.jpg)

事實上，在Actor-Critic的方法內，可以單純的估測V-function，將Q-value以V-value來表示：
* $Q^\pi(s_t^n, a^n_t) = E \left[ r^n_t + V^\pi(s^n_{t+1}) \right]$
    * $r$是random variable，在某一個state採取action所得的rewrad是不確定，中間具有隨機性，因此要取期望值才會是Q-function

* $Q^\pi(s_t^n, a^n_t) - V^\pi(s^n_t)$
* $=r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)$
    * 直接拿掉期望值，並取代原始的Q-function
        * 原始取期望值是因為具有隨機性
    * 這麼做的好處在於，只需要估測一個`nn`即可(V-function)
    * 這麼做的壞處在於，引入随機性，因為$r$本身具有隨機性，但相較於G的accumulated reward來說可能還好，因為$r$是某一個step會得到的reward，而G是所有未來的step會得到的accumulated reward，因此相較於G的variance，$r$的variance可能較小。
### Advantage Actor-Critic
![](https://i.imgur.com/mlR48D7.jpg)

整體流程如下：
* 將G取代掉的部份稱為Advantage function
    * $r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)$
1. 有一個$\pi$，初始化一個actor與環境互動收集資料
2. 不同於Policy Gradient直接更新參數，是利用收集到的資料來估測value function
    * 可以使用TD或MC
3. 更新$\pi \rightarrow \pi'$
    * 利用$\nabla \bar{R}_\theta \approx \dfrac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n}(r^n_t + V^\pi(s^n_{t+1}) - V^\pi(s^n_t)) \nabla \log p_\theta(a_t^n \vert s_t^n)$ 
4. 利用$\pi'$再與環境互動收集資料
5. ....

### Advantage Actor-Critic
![](https://i.imgur.com/JDWWvvk.jpg)

實作上有兩個tip：
1. 訓練過程中有兩個`nn`，一個是V-function，一個是Policy(即actor)，其中V-function input state ，output scalar。而actor的話是input state，output action的distribution。因為兩個`nn`的input都是state，因此前面幾個layer的話是可以共用的。如果是影像的輸入的話，就可以將輸入的像素轉為較高階的資訊。
2. 一樣需要exploration的機制(參考Q-learning課程資訊)，實作Actor-Critic的一種常見作法，就是對actor的output(action distribution)下一個constrain，讓distribution的entropy不要太小，讓不同的action被採用的機率平均。

### Asynchronous Advantage Actor-Critic(A3C)
![](https://i.imgur.com/WeKoXg4.jpg)

A3C的精神就跟鳴人用影分身訓練自己的道理一樣。
### Asynchronous
![](https://i.imgur.com/8xbqrn7.jpg)

A3C同時開很多Worker(影分身)，再將所有的經驗通通集合在一起：
1. 有一個global network，包含policy、V-function，其參數為$\theta^1$
2. Worker工作前就是先copy global network的參數
3. Worker與環境互動
    * 如果要收集到多樣性的資料的話，就要讓每一個Worker的初始化都不一樣
4. 利用收集到的資料計算梯度(梯度的符號錯誤)
5. 回傳梯度之後更新global network的參數$\theta^1 \rightarrow \theta^1 + \eta \nabla \theta$

要注意到的是，所有的actor都是平行執行，同時在執行計算，做完就回傳參數，即使原本取到的是$\theta^1$到回傳的時候已經變成是$\theta^2$的時候也沒有關係，一樣回傳之後計算。
### Pathwise Derivative Policy Gradient
![](https://i.imgur.com/L2Hreql.jpg)

[論文連結_Deterministic Policy Gradient Algorithms
](http://proceedings.mlr.press/v32/silver14.pdf)
這是一種用Q-learning來解continuous的方法，也可以視為是一種特別的actor-critic的方法。

以棋靈王來說明的話，阿光是Actor，佐為是Critic，一般的RL可能在阿光下一個棋之後，佐為只告訴阿光好，不好，就這樣，但如果是Pathwise Derivative Policy Gradient的話，佐為會同時告訴阿光應該採取什麼樣的action。critic會引導actor做什麼樣的action才能得到比較大的value。

以Q-learning的觀點來看，Q-learning較難以處理continuous的action，但我們可以用一個actor來解這個問題($a = \arg \max_a Q(s, a))$)。

假設actor是一個solver，它的工作是給定state-$s$，然後告訴我們那一個action可以得到最大的Q-value。這概念跟GAN非常相似，將Q視為discriminator，要依據discriminator決定action非常困難，那就另外learn一個`nn`來解這個問題，也就是actor，利用actor來決定action，解$\arg \max$的問題。
### Pathwise Derivative Policy Gradient 
![](https://i.imgur.com/5Fmoqp6.jpg)

直觀來看如下：
* learn一個Q-function，input為state-$s$、action-$a$，output為$Q^\pi(s, a)$
* learn一個actor解$\arg \max$，input為state-$s$，output為action-$a$，這個output做為Q-function的input，希望可以讓Q-value愈大愈好

實作上會將兩個`nn`接起來，做為一個比較大的`nn`，訓練過程中會固定住Q-function的參數，單純的訓練actor的參數，以Gradient ascent來最大化。這似曾相識的概念，就是GAN，conditional GAN。Q為discriminator(cirtic)，actor為generator。

### Q-Learning Algorithm
![](https://i.imgur.com/Y6Z570L.jpg)

這是之前課程提過的原始Q-Learning演算法：
* 初始化Q-function與target network $\hat{Q}$，並且讓$\bat{Q}$=Q
* 每一個episode中
    * 每一個time step t
        * 給定state-$s_t$，由Q-function決定採用那一個action-$a_t$(記得加exploration)
        * 得到reward-$r_t$，跳到下一個state-$s_{t+1}$
        * 將$\left\{ s_t, a_t, r_t, s_{t+1} \right\}$寫入buffer
        * 從buffer中sample batch-size的資料出來$\left\{ s_i, a_i, r_i, s_{i+1} \right\}$
        * 利用target function-$\hat{Q}$計算$s_{i+1}$的值，再加上$r_i$得到target-$y$
        * 更新Q-function，希望$Q(s_i, a_i)$的output與target-$y$愈接近愈好
        * 每$C$個step之後重新讓$\hat{Q}$=Q
### Q-Learning Algorithm $\rightarrow$ Pathwise Derivative Policy Gradient
![](https://i.imgur.com/X7libBM.jpg)

從Q-learning到Pathwise Derivative Policy Gradient只需要調整四個地方：
1. 原本是用Q-function決定採用那一個action，調整為直接用actor-$\pi$來決定，不需要再解$\arg \max$的問題
2. 不解$\arg \max$的問題之後，target-$y$也調整為$\hat{Q}(s_{i+1}, \hat{\pi}(s_{i+1}))$，原本由$\hat{Q}$決定那一個action，也直接由$\hat{\pi}$來決定
3. 利用更新$\pi$來最大化Q-function $Q(s_i, \pi(s_i))$，這原因跟GAN的generator一樣。
4. 每$C$個step就同步一次，即$\hat{\pi}=\pi$

與Q-learning有兩個`nn`一樣，pathwise Derivative Policy Gradient也有兩個actor，參數也一樣是固定住，在幾個time step之後才會同步一次。因為我們並不希望target value不斷的變動。
### Connection with GAN
![](https://i.imgur.com/DqAsJQL.jpg)

[論文連結_Connecting Generative Adversarial Networks and Actor-Critic Methods](https://arxiv.org/abs/1610.01945)

因為GAN與actor-critic都是非常難訓練，因此論文上也提出那幾種作法在GAN上有實作錄記，那些在actor-critic上有，也許可以互相學習。
